STS权限管理系统是比访问控制(RAM)更为严格的权限管理系统。使用STS权限管理系统进行资源访问控制,需通过复杂的授权流程,授予RAM用户临时访问资源的权限。
背景信息
RAM用户和授予RAM用户的权限均长期有效。删除RAM用户或解除RAM用户权限,均需手动操作。发生RAM用户信息泄露后,如果无法及时删除该RAM用户或解除权限,可能给您的阿里云资源和重要信息带来危险。所以,对于关键性权限或RAM用户无需长期使用的权限,您可以通过STS权限管理系统来进行控制。
步骤一:创建角色
RAM角色是一种虚拟用户,是承载操作权限的虚拟概念。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择 。
- 在角色页面,单击创建角色。
- 在创建角色面板,选择可信实体类型为阿里云账号,然后单击下一步。
- 设置角色信息。
- 单击完成。
- 单击关闭。
步骤二:创建角色授权策略
角色授权策略,即定义要授予角色的资源访问权限。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择 。
- 在权限策略页面,单击创建权限策略。
- 在创建权限策略页面,单击脚本编辑页签。
- 输入权限策略内容,然后单击继续编辑基本信息。关于权限策略语法结构的详情,请参见权限策略语法和结构。
IoT资源只读权限的授权策略内容示例如下:
{ "Version":"1", "Statement":[ { "Action":[ "rds:DescribeDBInstances", "rds:DescribeDatabases", "rds:DescribeAccounts", "rds:DescribeDBInstanceNetInfo" ], "Resource":"*", "Effect":"Allow" }, { "Action":"ram:ListRoles", "Effect":"Allow", "Resource":"*" }, { "Action":[ "mns:ListTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "dhs:ListProject", "dhs:ListTopic", "dhs:GetTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "ots:ListInstance", "ots:ListTable", "ots:DescribeTable" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "log:ListShards", "log:ListLogStores", "log:ListProject" ], "Resource":"*", "Effect":"Allow" }, { "Effect":"Allow", "Action":[ "iot:Query*", "iot:List*", "iot:Get*", "iot:BatchGet*" ], "Resource":"*" } ] }
IoT资源读写权限的授权策略内容示例如下:
{ "Version":"1", "Statement":[ { "Action":[ "rds:DescribeDBInstances", "rds:DescribeDatabases", "rds:DescribeAccounts", "rds:DescribeDBInstanceNetInfo" ], "Resource":"*", "Effect":"Allow" }, { "Action":"ram:ListRoles", "Effect":"Allow", "Resource":"*" }, { "Action":[ "mns:ListTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "dhs:ListProject", "dhs:ListTopic", "dhs:GetTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "ots:ListInstance", "ots:ListTable", "ots:DescribeTable" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "log:ListShards", "log:ListLogStores", "log:ListProject" ], "Resource":"*", "Effect":"Allow" }, { "Effect":"Allow", "Action":"iot:*", "Resource":"*" } ] }
- 输入权限策略名称和备注。
- 单击确定。
授权策略创建成功后,您就可以将该授权策略中定义的权限授予角色。
步骤三:为角色授权
角色获得授权后,才具有资源访问权限。您可以在角色页面,单击角色对应的添加权限,为单个角色授权。具体操作,请参见为RAM角色授权。本文介绍同时为多个角色授权的操作步骤。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择 。
- 在授权页面,单击新增授权。
- 在新增授权页面,为RAM角色添加权限。
- 单击确定。
- 单击完成。
下一步,为RAM用户授予可以扮演该角色的权限。
步骤四:授予RAM用户角色扮演权限
虽然经过授权后,该角色已拥有了授权策略定义的访问权限,但角色本身只是虚拟用户,需要RAM用户扮演该角色,才能进行权限允许的操作。若任意RAM用户都可以扮演该角色,也会带来风险,因此只有获得角色扮演权限的RAM用户才能扮演角色。
授权RAM用户扮演角色的方法:先新建一个Resource参数值为角色ID的自定义授权策略,然后用该授权策略为RAM用户授权。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择 。
- 在权限策略页面,单击创建权限策略。
- 在创建权限策略页面,单击脚本编辑页签。
- 输入权限策略内容,然后单击继续编辑基本信息。说明 授权策略内容中,参数Resource 的值需为角色Arn。在RAM角色管理页面,单击角色名称,进入基本信息页,查看角色的Arn 。
角色授权策略示例:
{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":"iot:QueryProduct", "Resource":"角色Arn" } ] }
- 输入权限策略名称和备注。
- 单击确定。
- 授权策略创建成功后,返回RAM访问控制主页面。
- 在左侧导航栏,选择 。
- 在RAM用户列表中,选中要授权的RAM用户前的复选框,然后单击下方的添加权限。
- 在授权对话框中,选中刚新建的角色授权策略,再单击确定。
授权完成后,RAM用户便有了可以扮演该角色的权限,就可以使用STS获取扮演角色的临时身份凭证和进行资源访问。
步骤五:RAM用户获取临时身份凭证
获得角色授权的RAM用户,可以通过直接调用API或使用SDK来获取扮演角色的临时身份凭证:AccessKey ID、AccessKey Secret和SecurityToken。STS API和STS SDK详情,请参见STS API和STS SDK。
使用API和SDK获取扮演角色的临时身份凭证需传入以下参数:
- RoleArn:需要扮演的角色Arn。
- RoleSessionName:临时凭证的名称(自定义参数)。
- Policy:授权策略,即为角色增加一个权限限制。通过此参数限制生成的Token的权限。不指定此参数,则返回的Token将拥有指定角色的所有权限。
- DurationSeconds:临时凭证的有效期。单位是秒,最小为900,最大为3600,默认值是3600。
- id和secret:指需要扮演该角色的RAM用户的AccessKey ID和AccessKey Secret。
获取临时身份凭证示例
API示例:RAM用户通过调用STS的AssumeRole接口获得扮演该角色的临时身份凭证。
https://sts.aliyuncs.com?Action=AssumeRole
&RoleArn=acs:ram::1234567890123456:role/iotstsrole
&RoleSessionName=iotreadonlyrole
&DurationSeconds=3600
&Policy=<url_encoded_policy>
&<公共请求参数>
SDK示例:RAM用户使用STS的Python命令行工具接口获得扮演该角色的临时身份凭证。
$python ./sts.py AssumeRole RoleArn=acs:ram::1234567890123456:role/iotstsrole RoleSessionName=iotreadonlyrole Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":"iot:*","Resource":"*"}]}' DurationSeconds=3600 --id=id --secret=secret
请求成功后,将返回扮演该角色的临时身份凭证:AccessKey ID、AccessKey Secret和SecurityToken。
步骤六:RAM用户临时访问资源
获得扮演角色的临时身份凭证后,RAM用户便可以在调用SDK的请求中传入该临时身份凭证信息,扮演角色。
Java SDK示例:RAM用户在调用请求中,传入临时身份凭证的AccessKey ID、AccessKey Secret和SecurityToken参数,创建IAcsClient对象。
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", AccessKeyId,AccessKeySecret);
RpcAcsRequest request.putQueryParameter("SecurityToken", Token);
IAcsClient client = new DefaultAcsClient(profile);
AcsResponse response = client.getAcsResponse(request);