当企业购买阿里云服务后,应用程序通过访问控制(RAM)可以获取RAM角色的临时安全令牌,从而访问阿里云。
背景信息
企业A购买了ECS实例,并计划在ECS实例中部署企业的应用程序。这些应用程序需要使用访问密钥(AccessKey)访问其它云服务API。
有两种做法:
- 将访问密钥直接嵌入在代码里。
- 将访问密钥保存在应用程序的配置文件中。
这样会带来两个问题:
- 保密性问题:如果访问密钥以明文形式存在于ECS实例中,可能会随着快照、镜像及镜像创建出来的实例泄露。
- 难运维问题:由于访问密钥存在于实例中,如果要更换访问密钥(例如:周期性轮转或切换用户身份),那么需要对每个实例和镜像进行更新并重新部署,这会增加对实例和镜像管理的复杂性。
解决方案
ECS结合RAM提供的访问控制能力,允许给每一个ECS实例配置一个拥有合适权限的RAM角色身份。应用程序通过获取该RAM角色的临时安全令牌来访问云API。
操作流程
- 使用阿里云账号创建一个RAM角色(MyApplicationRole)。
- 为RAM角色授权。
具体操作,请参见为RAM角色授权。
说明 如果临时安全令牌权限不足时,您可以根据需要为RAM角色添加相应的权限。权限更新后立即生效,无需重新启动ECS实例。
- 使用阿里云账号创建一个RAM用户。
- 为RAM用户授权。
- 若管理员和操作员是同一人,需要授权RAM用户管理员权限:
AdministratorAccess
。
- 若管理员与操作员职责分离,需要创建以下自定义策略,将其授权给RAM用户。
{
"Statement": [
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram:*:*:role/MyApplicationRole" //替换MyApplicationRole为自己的RAM角色名称
}
],
"Version": "1"
}
说明
- 只有被授权的RAM用户才能为ECS实例配置RAM角色,避免RAM角色权限被滥用。
- 如果RAM用户没有管理员权限,仅有管理ECS的权限。在创建ECS实例并配置RAM角色时,ECS会强制检查当前RAM用户是否拥有指定RAM角色的
ram:PassRole
权限,否则将无法成功创建ECS实例。
- 使用步骤3创建的RAM用户,为目标ECS实例配置步骤1创建的RAM角色。
- ECS将通过实例元数据将临时安全令牌传递给ECS实例中的应用程序。
- 若在Linux系统中,通过实例元数据可以获取临时安全令牌及过期时间等信息。请参见使用实例RAM角色访问其他云产品。
请求示例
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/MyApplicationRole
返回示例
{
"AccessKeyId": "STS.J8XXXXXXXXXX4",
"AccessKeySecret": "9PjfXXXXXXXXXBf2XAW",
"Expiration": "2017-06-09T09:17:19Z",
"SecurityToken": "CAIXXXXXXXXXXXwmBkleCTkyI+",
"LastUpdated": "2017-06-09T08:17:19Z",
"Code": "Success"
}
- 若应用程序使用了阿里云SDK,无需在SDK中配置任何访问密钥相关的信息,阿里云SDK将会自动从ECS实例元数据中获取临时安全令牌。
说明 临时安全令牌过期时间通常为1小时,有效期内应用程序都能正常访问阿里云API,过期之前ECS会自动刷新临时安全令牌。
- 应用程序使用临时安全令牌访问阿里云API。
说明 除ECS外,阿里云其它计算类服务(例如:函数计算、MaxCompute)也提供了类似的RAM角色访问能力,以帮助用户解决云上应用的动态身份管理与授权的问题。