阿里云OSS的文件访问权限控制是如何实现的?
首先说明, 访问控制包括授权(Authorization)和认证(Authentication), 这里只谈授权, 不谈认证.
阿里云通过RAM系统进行统一的访问控制. 从RAM的DSL语法来看, 是通过将RAM用户(User)与策略(Policy)直接绑定或者加入用户组(Group)来开放(Allow)/限制(Deny)其对特定资源(Resource)的访问权限(Action).
OSS只是阿里云众多服务中的一项具体服务, 只要在RAM系统中定义好服务名称, Action和Resource,就可以接入RAM实现访问控制. RAM官方提供了管理策略AliyunOSSFullAccess和只读策略AliyunOSSReadOnlyAccess.
举个例子, AliyunOSSReadOnlyAccess:
{
"Statement": [
{
"Action": [
"oss:Get*",
"oss:List*"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}
该策略有1条Statement, 其中定义了2个Action(因为采用通配符, 实际上可能包含很多Action). 服务方是oss, Effect是Allow, 即声明了该Statement是允许. Resource为*即允许访问所有资源(注意哦,不只是oss资源, 还包括其他资源).
技术实现上, 个人猜测应该是RAM系统提供统一的鉴权服务给各个内部服务方调用, 从而实现统一的, 业务无关的访问控制. 鉴权逻辑上, 只要RAM用户绑定的策略所允许的权限大于服务方执行鉴权时的权限, 就算鉴权通过了.
开源程序还没见到过, 不过基本功能的实现应该蛮简单的. 对Policy进行JSON解析, 然后对Statement逐项判断就可以了. 然而, 由于RAM是一个全局的服务, 没有Region概念, 如果把跨Region同步, STS等问题考虑进来, 可能会复杂一些.