前言
在存储系统中,为了保证数据的安全性,凡是需要访问数据的用户,都是需要被验证其是否有足够权限访问的。这个认证过程可以是传统UGO(user, group, other,rwx)的方式,当然也可以是另一种ACL的方式。ACL是为每个需要被访问的资源指定了可允许用户的列表,每个用户还被声明了能够允许的权限操作。假设现在我们使用的是ACL的方式来做访问控制,这意味着每次用户发起资源(如果是存储系统,就是数据)请求时,系统都会经过一次ACL的验证。那么此时ACL的check动作将会是一个高频的行为,按照传统方式我们将ACL信息保存到元数据存储中,这势必会带来高频的元数据查询。对此,我们可以做哪些优化处理使之行为更加高效呢?本文笔者结合最近Hadoop Ozone的原生ACL设计,来聊聊这个主题。
传统ACL认证模式的缺点
我们要想提高现有ACL认证模式的效率,那我们必不可少需要去了解目前传统资源ACL的认证原理,大致过程如下所示。
按照上图所示,过程主要如下:
1)系统在创建资源时,会将设置的ACL信息作为资源元数据信息的一个属性信息,和元数据信息一起被序列化保存到外部存储中去。当然有些系统也可能将ACL信息单拎出来进行保存。
2)当用户访问目标资源时,系统从元数据存储中读取该资源对象信息,提取其ACL属性信息,进行ACL的用户验证,权限验证。如果验证通过,系统允许用户当前访问行。如果验证不通过,则抛出权限验证错误。
看似上述过程中规中矩,并没有明显的弊端毛病,但是如果我们往系统未来的扩展性等方向考虑的话,这里面还是会暴露出不少的缺陷。主要有以下几点不足之处:
- 元数据的ACL信息的高频访问。高频访问意味着高频的访问元数据外部存储的行为,这里假设元数据存储还仅仅是在本地的情况时,这意味着系统将会