阿里云的权限控制分为账号、角色和策略三个概念。账号包括主账号和子账号。策略可以直接附加到账号上面,当然更正规的做法是将策略附加到角色上面,然后指定不同的子账号来扮演(AssumeRole)具体的角色。这样做符合最小权限原则。接下来分别介绍一下这几个概念。
首先我们创建一个子账号。子账号拥有自己的AK id和AK secret。阿里云SDK一般都支持通过设置AK id和AK secret来使用资源。不过这不是推荐的做法。
接着创建一个角色。角色分为普通账号
和服务账号
两种。如果选择普通账号,那么就限制了只有这个主账号下的子账号能扮演这个角色。阿里云控制台里面,点击进入一个角色,可以看到角色详情
和角色授权策略
两个入口,其中角色详情
里面展示的是角色的信息,授予谁扮演本角色。角色授权策略
则是附加到本角色的权限策略,扮演本角色之后这些权限策略将生效。
角色创建完成之后,就可以将策略附加在角色上面。可以选择阿里云提供的策略。所有云产品都默认提供XXXFullAccess和XXXReadOnlyAccess两种权限策略。用户也可以创建自定义策略。
子账号能扮演什么角色,这个是在子账号的权限策略里面指定的。Resource指定为角色的ARN即可。这里也可以注意到RAM是Global Service。不需要指定region。
如果子账号无权扮演某个角色,会报下面这个错误。
Traceback (most recent call last):
File "sts.py", line 25, in <module>
response = clt.do_action_with_exception(request)
File "/Library/Python/2.7/site-packages/aliyunsdkcore/client.py", line 224, in do_action_with_exception
raise ServerException(server_error_code, server_error_message, http_status=status, request_id=request_id)
aliyunsdkcore.acs_exception.exceptions.ServerException: HTTP Status: 403 Error:NoPermission No permission perform sts:AssumeRole on this Role. Maybe you are not authorized to perform sts:AssumeRole or the specified role does not trust you RequestID: 960C7DCD-59BF-41E0-8B13-558B4A225600
服务账号则用于用户在阿里云开通的不同服务之间授权。比如EMR需要在ECS上部署和运行Hadoop集群,并且使用大量云资源,ECS、OSS、VPC等服务都需要授予EMR相关的权限。可以观察到角色里面的Principal字段跟普通账号的差异。
另外还有一个比较有意思的东西就是PassRole
。如果用户使用子账号,需要授权EMR访问别的云产品,那么这个子账号需要被授予PassRole
权限。需要使用别的云产品的服务的FullAccess角色的权限策略里面都会有passRole
这一项,比如EMR和ActionTrail。
{
"Action": "ram:PassRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:Service": "actiontrail.aliyuncs.com"
}
}
}
参考资料。
- RAM产品概述
- AssumeRole
- 阿里云STS token浅析,这篇文章详细介绍了如何使用STS token访问OSS资源,并且给出了Python SDK的玩法。