RAM (Resource Access Management) 是阿里云为客户提供的用户身份管理与资源访问控制服务,使用RAM能够大大的提高企业信息安全程度。本文主要介绍了如何通过RAM实现对弹性伸缩服务的访问控制。
RAM 允许在一个云账户下创建并管理多个用户身份,并允许给单个身份或一组身份分配不同的权限策略,从而实现不同用户拥有不同的云资源访问权限。一些典型的RAM应用场景包括:
关于RAM更详细的介绍与功能,您可以参考 访问控制文档 .
目前,RAM支持访问弹性伸缩的方式入如下表:
服务名 | 控制台(RAM) | API(RAM) | 控制台(STS) | API(STS) | 授权粒度 | 系统策略 | 相关文档 |
---|---|---|---|---|---|---|---|
弹性伸缩 AutoScaling | 支持 | 支持 | 支持 | 支持 | 服务级别 | AliyunESSFullAccess,AliyunESSReadOnlyAccess | API使用须知 |
下面我们将分别介绍如何通过RAM用户和RAM角色(STS)的方式访问弹性伸缩服务。
RAM用户即阿里云子账号,您可以在 RAM控制台 创建一个RAM子账号,RAM用户在刚创建出来时不具有任何资源操作权限,需要主账号进行授权后才能对资源进行访问。
您只有赋予RAM用户一定的权限后,RAM用户才具有操作资源的权利。
针对弹性伸缩服务,阿里云为您预先创建了相应的系统策略:
管理弹性伸缩服务的权限,其策略内容为:
{
"Version": "1",
"Statement": [
{
"Action": "ess:*",
"Resource": "*",
"Effect": "Allow"
}
]
}
表示您能访问弹性伸缩提供的所有服务。
只读访问弹性伸缩服务的权限,其策略内容为:
{
"Version": "1",
"Statement": [
{
"Action": "ess:Describe*",
"Resource": "*",
"Effect": "Allow"
}
]
}
表示您能访问弹性伸缩所有以Describe开头命名的服务,例如:DescribeScalingGroups(查询伸缩组列表)。
你还可以通过自定义授权策略对RAM用户能够使用的弹性伸缩服务精确的控制。
RAM策略包含允许(Allowed)和拒绝(Deny)两种效力,当允许和拒绝策略同时包含时,将优先执行拒绝策略。
假如,您希望赋予某用户只读权限的同时,允许其手动向伸缩组添加或移除Ecs实例,您可以制定如下自定义权限策略:
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"ess:Describe*",
"ess:AttachInstances",
"ess:DetachInstances"
],
"Resource": "*"
}
],
"Version": "1"
}
如果您不希望RAM用户查看您的伸缩配置,您可以通过反向权限限制其访问,例如:
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"ess:Describe*"
],
"Resource": "*"
},
{
"Effect": "Deny",
"Action": [
"ess:DescribeScalingConfigurations"
],
"Resource": "*"
}
],
"Version": "1"
}
RAM 角色与 RAM 用户一样,都是 RAM 中定义的身份。RAM 角色是一种虚拟用户,没有确定的身份认证密钥,需要被一个受信的实体用户扮演才能正常使用。关于RAM角色更详细的介绍请查看 理解RAM角色。
RAM角色的策略授权同RAM用户相同,只是这里我们是给一个虚拟角色赋予了特定的权限,当一个授信用户扮演该角色后,授信用户不在拥有之前自身的策略授权,而是获取了所扮演角色的策略授权。
RAM角色除了授权策略之外还具有授信策略。授信策略表明了哪些实体可以扮演该角色。授信实体一般分为阿里云账号和阿里云服务,通常,我们会选择给某个云账号进行授信。授信之后,这个云账号下的RAM用户便可以扮演该角色。
创建RAM角色
RAM角色授权
注意,只有RAM用户才可以扮演角色。
先通过RAM用户登录控制台,此时我们没有为该RAM用户设置任何的授权策略,因此访问弹性伸缩控制台时将告知您联系主账号进行授权。
点击用户头像,然后点击切换身份按钮,进行角色切换。
注意,切换角色时,当前登录的RAM用户必须授予AliyunSTSAssumeRoleAccess权限。
可以看到,扮演成功后,我们就以角色身份登录了控制台。此时,您将获得该角色所拥有的所有权限。
您可以通过STS的AssumeRole api获取一个角色的临时身份。这里我们使用Java SDK,以扮演autoScaling-test
角色为例。
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRoleArn("acs:ram::1619897336813314:role/shengfanramrole");
request.setRoleSessionName("shengfan");
AssumeRoleResponse response = client.getAcsResponse(request);
从 AssumeRoleResponse
中,我们可以获取到一个临时秘钥,用于访问云资源。
加入我们为autoScaling-test
角色分配了弹性伸缩只读权限,那么通过该角色查询伸缩组示例如下:
AssumeRoleResponse assumeRoleResponse = assumeRule();
AssumeRoleResponse.Credentials credentials = assumeRoleResponse.getCredentials();
String key = credentials.getAccessKeyId();
String secret = credentials.getAccessKeySecret();
String token = credentials.getSecurityToken();
IClientProfile profile = DefaultProfile.getProfile(regionId, key, secret);
IAcsClient stsClient = new DefaultAcsClient(profile);
DescribeScalingGroupsRequest request = new DescribeScalingGroupsRequest();
request.setSecurityToken(token); // 必须设置securityToken
stsClient.getAcsResponse(request);