为了解决ECS实例保密性和运维的问题,通过RAM进行动态身份与授权管理,允许应用程序通过获取角色身份的动态令牌来访问云服务API,从而实现无AccessKey的应用身份与授权管理。

使用场景

用户购买了ECS实例,并且打算在ECS中部署企业的应用程序。这些应用程序需要使用AccessKey访问其他云服务API。有两种做法:
  • 将AccessKey直接嵌入在代码中。
  • 将AccessKey保存在应用程序的配置文件中。
这样会带来两个问题:
  • 保密性问题:如果AccessKey以明文形式存在于ECS实例中,它都可能随快照、镜像及镜像创建出来的实例被泄露。
  • 难运维性问题:由于AccessKey存在于实例中,如果要更换AccessKey(例如周期性轮转或切换用户身份),那么需要对每个实例和镜像进行更新并重新部署,这会增加对实例和镜像管理的复杂性。

您可以通过为ECS实例配置RAM角色解决上述问题。允许应用程序通过获取角色身份的动态令牌来访问云服务API,从而实现无AccessKey的应用身份与授权管理。

为ECS实例配置RAM角色

ECS结合身份管理与资源访问控制服务(Resource Access Management,RAM)提供的访问控制能力,允许给每一个ECS示例(即用户应用程序的运行环境)配置一个拥有合适权限的RAM角色身份,应用程序通过获取该角色身份的动态令牌来访问云服务API。具体流程如下图所示:操作流程如下:
  1. 云账号在RAM中创建一个ECS实例型RAM角色,并对角色授予合适的权限策略。
    说明 ECS实例型RAM角色:是RAM服务角色中的一种类型,表示该角色是由用户创建并授权给该用户的ECS实例所使用。
  2. 启动ECS实例时,配置创建好的RAM角色。
    • ECS服务根据所配置的RAM角色,调用AssumeRole去访问STS请求获取该角色的STS token。
    • STS服务会验证ECS服务身份及该角色的授权类型,验证通过后颁发STS token,否则拒绝请求。
    更多详细信息,请参见通过控制台使用实例RAM角色通过API使用实例RAM角色
  3. 获取到STS token后,ECS将通过Metadata服务将STS token提供给实例中的应用程序访问。

    例如:在Linux中执行如下命令,即可获取STS token及过期时间等元数据信息。

    $ curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<roleName>
    说明
    • STS token过期时间通常为1小时,STS token在有效期内都能正常访问云服务API,在过期之前ECS服务会自动刷新STS token。
    • 如果STS token权限不足,那么需要找管理员给实例RAM角色添加足够的权限。
    • 实例RAM角色的权限更新后,STS token权限立即生效,无需重新启动ECS实例。
  4. 使用STS token调用云服务API。
    说明 如果您的应用程序使用了Alibaba Cloud SDK,那么Alibaba Cloud SDK将会自动从ECS Metadata服务中获取实例RAM角色的STS token,开发者无需在SDK中配置任何AccessKey相关的信息。更多详细信息,请参见配置RamRole实现ECS实例的无AK访问

管理员与操作员职责分离

对于很多企业用户,授权者和ECS实例操作者通常都是职责分离,是不同的RAM用户。针对管理员与操作员职责分离原理如下:
说明
  • 如果RAM用户不拥有管理员权限,仅有ECS权限。在创建ECS实例并配置RAM角色时,ECS服务会强制检查当前用户是否拥有指定RAM角色的ram:PassRole权限,否则无法成功创建ECS实例。
  • 只有被授权用户才能为ECS实例配置RAM角色,避免RAM角色权限被滥用。
若想实现管理员与操作员职责分离,只需在为ECS实例配置RAM角色的基础上,根据Step 1.5使管理员给操作员增加一个PassRole权限即可。管理员可以通过RAM按如下Policy示例创建一个自定义策略,然后将这个自定义策略授权给操作员。
重要 如需直接复制示例 Policy,请删除注释内容,即“//”及随后的文字说明。
{
   "Statement": [
      {
      "Effect": "Allow",
      "Action": "ram:PassRole",
      //替换<rolename>为自己的RAM角色名称。
      "Resource": "acs:ram:*:*:role/<rolename>"
      }
   ],
   "Version": "1"
}

相关文档