实例RAM角色

实例RAM角色是指为ECS实例授予的RAM角色,该RAM角色是一个受信服务为云服务器的普通服务角色。使用实例RAM角色可以实现在ECS实例内部无需配置AccessKey即可获取临时访问凭证(STS Token),从而调用其他云产品的API。由于临时身份凭证仅可在实例内部获取,并且无需配置AccessKey,这不仅确保了云账号AccessKey的安全性,还能够通过访问控制RAM实现精细化的控制与权限管理。

功能优势

  • 安全便捷的实例内API调用方案:当您的项目部署在阿里云ECS上时,无需在代码中配置AccessKey,即可利用ECS提供的能力获取临时身份凭证(STS Token)以调用API,从而降低AccessKey泄漏的风险。

  • 简化RAM身份切换流程:如果您使用的是传统的AccessKey方案,当需要更换调用服务的RAM身份时,需对配置或者代码进行修改并重启服务。而采用实例RAM角色后,仅需调整授予ECS实例的RAM角色即可实现身份切换,无需进行其他任何更改。

  • 精细化管理权限:可以为不同的ECS实例分配具有特定授权策略的RAM角色,从而实现根据业务需求进行精细化的访问控制。

使用限制

为ECS实例授予RAM角色时存在以下限制:

  • ECS实例的网络类型必须是专有网络VPC。

  • 一台ECS实例只能被授予一个RAM角色。

实现流程

如您使用阿里云账号(主账号)操作,可忽略以下授权内容,若您使用RAM用户或RAM角色执行后续操作,请为对应的用户身份授予以下权限。

权限示例

该权限主要包含以下权限内容:

  • 管理RAM角色:需要创建RAM角色并授权。

  • 授予/回收RAM角色:需要进入实例详情页对实例做授予/回收RAM角色的操作。

  • 允许传递角色给云产品:给云服务授予角色需要配合ram:PassRole权限。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:Describe*",
                "ecs:List*",
                "ecs:AttachInstanceRamRole",
                "ecs:DetachInstanceRAMRole"
            ],
            "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "ram:Describe*",              
            "ram:List*",
            "ram:Get*",
            "ram:CreateRole", 
            "ram:CreatePolicy", 
            "ram:AttachPolicyToRole"
          ],
          "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ram:PassRole",
            "Resource": "*"
        }
    ]
}

创建RAM角色并授予给ECS实例

通过控制台创建和授予

  1. 登录RAM控制台,创建RAM角色并授权。

    1. 创建可信实体为阿里云服务的RAM角色。

      选择身份管理 > 角色,单击创建角色,按照界面提示完成角色创建。注意以下参数(其他参数按需填写,可参见创建普通服务角色):

      • 可信实体类型:选择阿里云服务

      • 角色类型:选择普通服务角色

      • 受信服务:选择云服务器

        image

        image

    2. 为已创建的RAM角色授权。

      将系统策略或已创建的自定义权限策略授权给RAM用户,使其拥有相关的资源访问或操作权限。例如,给RAM角色赋予OSS的只读权限(AliyunOSSReadOnlyAccess)。

      说明

      支持添加系统策略自定义策略。若系统策略不满足您的需求,可新建自定义策略。具体操作,请参见创建自定义权限策略

  2. 为ECS实例授予RAM角色。

    1. 登录ECS管理控制台

    2. 在左侧导航栏,选择实例与镜像 > 实例

    3. 在页面左侧顶部,选择目标资源所在的资源组和地域。地域

    4. 找到要操作的ECS实例,选择图标 > 实例设置 > 授予/收回RAM角色

    5. 在对话框中,选择创建好的实例RAM角色,单击确定

通过API创建和授予

  1. 创建RAM角色并授权。

    1. 调用CreateRole接口创建RAM角色。

      信任策略参数(AssumeRolePolicyDocument):

      {
           "Statement": [
             {
                 "Action": "sts:AssumeRole",
                 "Effect": "Allow",
                 "Principal": {
                   "Service": [
                     "ecs.aliyuncs.com"
                   ]
                 }
             }
           ],
           "Version": "1"
       }
    2. (可选)调用CreatePolicy接口新建权限策略。

      如果您已有可用权限策略,可跳过该步骤。

      PolicyDocument(权限策略)需按如下设置:

      {
           "Statement": [
               {
               "Action": [
                   "oss:Get*",
                   "oss:List*"
               ],
               "Effect": "Allow",
               "Resource": "*"
               }
           ],
           "Version": "1"
       }
    3. 调用AttachPolicyToRole接口为实例RAM角色授权。

  2. 调用AttachInstanceRamRole接口将RAM角色授予ECS实例。

获取实例RAM角色的临时身份凭证

您可以在ECS实例内部通过访问元数据服务(Meta Data Service)获取到临时访问凭证,同时会确保临时访问凭证的有效性。更多关于元数据的介绍,请参见实例元数据

方式一:通过Credentials工具获取

Credentials工具封装了调用ECS的元数据服务(Meta Data Service)获取临时访问凭证STS Token的逻辑,且支持周期性更新。

下文以Python和Java SDK为例。

Python
  1. 安装Credentials工具。

    pip install alibabacloud_credentials
  2. 配置ECS的RAM角色作为访问凭证。

    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_credentials.models import Config as CredConfig
    
    credentialConfig = CredConfig(
    	type='ecs_ram_role',
    	# 选填,该ECS角色的角色名称,不填会自动获取,但是建议加上以减少请求次数
    	role_name='<RoleName>'
    )
    credentialsClient = CredClient(credentialConfig)
    

Java

  1. 添加credentials依赖。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. 配置ECS实例RAM角色作为访问凭证。

    import com.aliyun.credentials.Client;
    import com.aliyun.credentials.models.Config;
    
    public class DemoTest {
        public static void main(String[] args) throws Exception {
            Config credentialConfig = new Config();
            credentialConfig.setType("ecs_ram_role");
            // 选填,该ECS角色的角色名称,不填会自动获取,但是建议加上以减少请求次数
            credentialConfig.setRoleName("<RoleName>");
            Client credentialClient = new Client(credentialConfig);
        }
    }

方式二:通过Shell命令获取

元数据服务提供HTTP访问地址获取临时访问凭据。

加固模式

  • Linux实例

    # 获取元数据服务器的访问凭证用于鉴权
    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<元数据服务器访问凭证有效期>"` 
    # 获取实例RAM角色的临时授权访问凭证
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/<实例RAM角色名称>
  • Windows实例(Powershell)

    # 获取元数据服务器的访问凭证用于鉴权
    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<元数据服务器的访问凭证有效期>"} -Method PUT -Uri http://100.100.100.200/latest/api/token
    # 获取实例RAM角色的临时授权访问凭证
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/ram/security-credentials/<实例RAM角色名称>

<元数据服务器的访问凭证有效期>:在获取实例RAM角色的临时授权访问凭证之前,先获取元数据服务器的访问凭证并设置其有效期,以加强数据安全。超过有效期后,需要重新获取凭证,否则无法获取实例RAM角色的临时授权访问凭证。

取值范围为1~21600,单位为秒。详细说明,请参见实例元数据

<实例RAM角色名称>需替换为具体的实例RAM角色名称。例如EcsRamRole

普通模式

  • Linux实例

    curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<实例RAM角色名称>
  • Windows实例(Powershell)

    Invoke-RestMethod http://100.100.100.200/latest/meta-data/Invoke-RestMethod http://100.100.100.200/latest/meta-data/ram/security-credentials/<实例RAM角色名称>

    <实例RAM角色名称>需替换为具体的实例RAM角色名称。例如EcsRamRoleDocumentTesting。

返回示例如下,其中:

  • AccessKeyIdAccessKeySecretSecurityToken共同构成了临时访问令牌。

  • Expiration:临时授权访问凭证的有效期。

    {
       "AccessKeyId" : "STS.*******6YSE",
       "AccessKeySecret" : "aj******jDU",
       "Expiration" : "2017-11-01T05:20:01Z", 
       "SecurityToken" : "CAISng********",
       "LastUpdated" : "2023-07-18T14:17:28Z",
       "Code" : "Success"
    }

使用实例RAM角色调用API

下文以部署在Linux ECS实例上的Python应用程序调用OSS下载文件接口为例,为您介绍ECS实例RAM角色的使用方法。

pip install oss2  
pip install alibabacloud_credentials
import oss2
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
from oss2 import CredentialsProvider
from oss2.credentials import Credentials

class CredentialProviderWarpper(CredentialsProvider):
    def __init__(self, client):
        self.client = client

    def get_credentials(self):
        access_key_id = self.client.get_access_key_id()
        access_key_secret = self.client.get_access_key_secret()
        security_token = self.client.get_security_token()
        return Credentials(access_key_id, access_key_secret, security_token)

def download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name):
    config = Config(
        type='ecs_ram_role',      # 访问凭证类型。固定为ecs_ram_role。
        role_name=role_name
    )
    cred = Client(config)
    credentials_provider = CredentialProviderWarpper(cred)
    auth = oss2.ProviderAuth(credentials_provider)

    # 初始化 OSS Bucket 对象
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    # 下载图片到本地
    bucket.get_object_to_file(object_key, local_file)
    print("Image downloaded successfully")

if __name__ == "__main__":  

    # 定义全局变量
    role_name = 'role_name'  # 需替换为实例RAM角色名称
    bucket_name = 'bucket_name'  # 需替换为Bucket名称
    endpoint = 'http://oss-cn-beijing-internal.aliyuncs.com'  # 需替换为OSS Bucket的Endpoint,如果使用内网endpoint,需要确保ecs与oss处于同一个地域。
    object_key = 'testfolder/example.png'  # 需替换为你要下载的图片在OSS中的完整存储路径(不包含Bucket名称)
    local_file = '/localpath/to/image.png'  # 需替换为图片需要在ECS上存储的根路径,并定义图片名称
    download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)

其他操作

收回/更改ECS的实例RAM角色

通过控制台收回/更改

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像 > 实例

  3. 在页面左侧顶部,选择目标资源所在的资源组和地域。地域

  4. 找到要操作的ECS实例,选择图标 > 实例设置 > 授予/收回RAM角色

    • 收回实例RAM角色:操作类型选择收回,单击确定

    • 更改实例RAM角色:操作类型选择授予,选择所需的实例RAM角色,单击确定完成更改。

      image.png

通过API收回/更改

相关文档