当企业购买阿里云产品后,通过访问控制(RAM),应用程序可以获取RAM角色的临时安全令牌从而访问阿里云。

前提条件

进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册

背景信息

企业A购买了ECS实例,并计划在ECS中部署企业的应用程序。这些应用程序需要使用访问密钥(AccessKey)访问其它云服务API。

有两种做法:

  • 将访问密钥直接嵌入在代码里。
  • 将访问密钥保存在应用程序的配置文件中。

这样会带来两个问题:

  • 保密性问题:如果访问密钥以明文形式存在于ECS实例中,可能会随着快照、镜像及镜像创建出来的实例泄露。
  • 难运维问题:由于访问密钥存在于实例中,如果要更换访问密钥(例如:周期性轮转或切换用户身份),那么需要对每个实例和镜像进行更新并重新部署,这会增加对实例和镜像管理的复杂性。

解决方案

ECS服务结合RAM提供的访问控制能力,允许给每一个ECS实例配置一个拥有合适权限的RAM角色身份。应用程序通过获取该RAM角色的临时安全令牌来访问云API。

云上应用访问阿里云

操作流程

  1. 云账号创建一个RAM角色(MyApplicationRole)。
    说明 创建RAM角色时受信实体选择阿里云服务,受信服务选择云服务器,即允许云服务ECS扮演该RAM角色来访问阿里云资源。

    关于如何创建RAM角色,请参见创建可信实体为阿里云服务的RAM角色

  2. 为RAM角色授予合适的权限。

    关于如何为RAM角色授权,请参见为RAM角色授权

    说明 如果临时安全令牌权限不足时,您可以根据需要为RAM角色添加相应的权限。权限更新后立即生效,无需重新启动ECS实例。
  3. 云账号创建一个RAM用户。

    关于如何创建RAM用户,请参见创建RAM用户

  4. 为RAM用户授予合适的权限。
    • 若管理员和操作员是同一人,需要授予RAM用户管理员权限:AdministratorAccess
    • 若管理员与操作员职责分离,需要授予RAM用户PassRole权限将管理员和操作员区分为不同的RAM用户。

      在RAM控制台创建自定义策略,然后将这个自定义策略授权给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实例。

    关于如何为RAM用户授权,请参见为RAM用户授权

  5. 启动ECS实例时,配置创建好的RAM角色。
  6. ECS服务调用STS API AssumeRole去获取该RAM角色的临时安全令牌。
    说明 STS服务会验证ECS服务身份及RAM角色的授权类型,验证通过后颁发临时安全令牌。

    关于如何通过调用STS API使用RAM角色,请参见通过API使用实例RAM角色

  7. STS服务将临时安全令牌返回给ECS服务。
  8. ECS将通过实例元数据将临时安全令牌传递给ECS实例中的应用程序。
    • 若在Linux系统中,通过实例元数据可以获取临时安全令牌及过期时间等信息。 请参见借助于实例RAM角色访问其他云产品

      请求示例

      $ curl http://100.100.100.200/latest/meta-data/ram/security-credentials/MyApplicationRole

      返回示例

      [root@local ~]# 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-09T03:17:18Z",
      "Code" : "Success"
      }cess"
      }
    • 若应用程序使用了阿里云SDK,无需在SDK中配置任何访问密钥相关的信息,阿里云SDK将会自动从ECS实例元数据中获取临时安全令牌。请参见配置RamRole实现ECS实例的无AK访问
      说明 临时安全令牌过期时间通常为1小时,有效期内应用程序都能正常访问阿里云API,过期之前ECS服务会自动刷新临时安全令牌。
  9. 应用程序使用临时安全令牌访问阿里云API。

后续步骤

除了ECS服务之外,阿里云其它计算类服务(例如:函数计算、MaxCompute)也提供了类似的RAM角色访问能力,以帮助用户解决云上应用的动态身份管理与授权的问题。