全部產品
Search
文件中心

Elastic Compute Service:通過ECS執行個體RAM角色授權ECS訪問其他雲資源

更新時間:Jun 19, 2024

當ECS執行個體或部署在ECS執行個體上的應用需要訪問其他雲資源時,必須先通過訪問憑證來驗證身份資訊和存取權限。執行個體RAM角色允許您將一個角色關聯到ECS執行個體,使ECS執行個體及其上的應用基於STS臨時憑證訪問其他雲資源,無需透露長期AccessKey,既可減少密鑰泄露的風險,也可藉助存取控制RAM精細化控制資源存取權限,避免許可權資源過度分派。本文主要介紹如何建立執行個體RAM角色並授予給ECS執行個體,以及如何基於執行個體RAM角色擷取臨時訪問憑證。

說明

執行個體RAM角色是一種可信實體為阿里雲服務的RAM角色,即允許雲端服務扮演的角色,用於解決跨服務訪問問題。關於RAM角色的詳細說明,請參見什麼是RAM角色

功能優勢

基於執行個體RAM角色擷取臨時訪問憑證驗證身份資訊和存取權限控制,有以下優勢:

  • 增強通訊安全性:使用STS臨時憑證代替長期AccessKey,降低憑證泄漏的風險。

  • 跨服務訪問並精細化系統管理權限:通過為不同ECS執行個體賦予具有特定授權策略的RAM角色,確保執行個體僅能訪問其所需的資源,實現許可權最小化。

  • 簡化許可權維護:無需直接在ECS執行個體上管理憑證,許可權的調整僅需通過修改RAM角色的授權策略來實現,快捷地維護ECS執行個體擁有的存取權限。

使用限制

為ECS執行個體授予執行個體RAM角色存在以下限制:

  • ECS執行個體的網路類型必須是Virtual Private Cloud。

  • 一台ECS執行個體只能授予一個執行個體RAM角色。

建立執行個體RAM角色並授予給ECS

重要

若您的賬戶為RAM使用者(子帳號),請先聯絡阿里雲帳號(主帳號)擷取使用和配置執行個體RAM角色的許可權。具體操作,請參見授權RAM使用者使用ECS資源

權限原則參考如下

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs: [ECS RAM Action]",
                "ecs: CreateInstance",
                "ecs: AttachInstanceRamRole",
                "ecs: DetachInstanceRAMRole"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ram:PassRole",
            "Resource": "*"
        }
    ]
}

通過控制台建立和授予

  1. 登入RAM控制台,建立執行個體RAM角色並為其授權。

    1. 建立可信實體為阿里雲服務的RAM角色。

      選擇身份管理 > 角色,單擊建立角色,按照介面提示完成角色建立。注意以下參數(其他參數按需填寫,可參見建立普通服務角色):

      • 可信實體類型:選擇阿里雲服務

      • 角色類型:選擇普通服務角色

      • 受信服務:選擇雲端服務器

    2. 為已建立的執行個體RAM角色授權。

      將系統策略或已建立的自訂權限原則授權給RAM使用者,使其擁有相關的資源訪問或操作許可權。例如,授予RAM角色訪問OSS的許可權AliyunOSSReadOnlyAccess。

      說明

      支援添加系統策略自訂策略。若系統策略不滿足您的需求,可建立自訂策略。具體操作,請參見建立自訂權限原則

  2. 授予執行個體RAM角色給ECS執行個體。

    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角色擷取臨時訪問憑證

方式一:在SDK中通過Credentials工具擷取

Credentials工具會自動擷取ECS執行個體綁定的執行個體RAM角色,並調用ECS的中繼資料服務(Meta Data Server)擷取臨時訪問憑證,該憑證會周期性更新。

重要

通過Credentials工具擷取執行個體RAM角色的訪問憑證,需要先安裝Credentials工具。

sudo pip install alibabacloud_credentials

下文以Python和Java SDK為例,更多語言SDK樣本,請參見範例程式碼

from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig

credentialsConfigig = CredConfig(
	type='ecs_ram_role',
	# 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數
	role_name='<RoleName>'
)
credentialsClient = CredClient(CredConfig)
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);
    }
}

方式二:直接存取中繼資料服務器擷取

某些情境,如果您沒有適配Credentials工具,或需要在指令碼中基於執行個體RAM角色來擷取資源臨時訪問憑證,可直接在執行個體內部訪問中繼資料服務器擷取。

說明

通過中繼資料服務,您無需登入控制台或調用API,在執行個體內部即可擷取執行個體資訊。詳細說明,請參見執行個體中繼資料

加固模式

  • 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角色的臨時授權訪問憑證之前,先擷取中繼資料服務器的訪問憑證並設定其有效期間,以加強資料安全。超過有效期間後,需要重新擷取憑證,否則無法擷取執行個體RAM角色的臨時授權訪問憑證。

取值範圍為1~21600,單位為秒。詳細說明,請參見執行個體中繼資料

<執行個體RAM角色名稱>需替換為具體的執行個體RAM角色名稱。例如EcsRamRoleDocumentTesting。

普通模式

  • 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。

返回樣本如下所示,其中:

  • SecurityToken:執行個體RAM角色的臨時Token。

  • Expiration:執行個體RAM角色的臨時授權訪問憑證的有效期間(非中繼資料服務器的訪問憑證有效期間)。

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

收回/更改ECS的執行個體RAM角色

通過控制台收回/更改

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

  3. 在頁面左側頂部,選擇目標資源所在的資源群組和地區。地區

  4. 找到要操作的ECS執行個體,選擇表徵圖 > 執行個體設定 > 授予/收回RAM角色

    • 收回執行個體RAM角色:操作類型選擇解綁,單擊確定

    • 更改執行個體RAM角色:操作類型選擇綁定,選擇所需的執行個體RAM角色,單擊確定完成更改。

      image.png

通過API收回/更改

應用樣本:使用執行個體RAM角色訪問其他雲資源

下文以部署在Linux ECS執行個體上的Python應用程式訪問OSS下載圖片為例,為您介紹如何通過ECS及部署 ECS執行個體上的應用如何通過執行個體RAM角色訪問其他雲資源。

  1. 準備工作。

    1. 已建立ECS執行個體RAM角色,授予所需資源的存取權限(本文樣本AliyunOSSReadOnlyAccess),並將該執行個體RAM角色授予給ECS執行個體。

      具體操作,可參見建立執行個體RAM角色並授予給ECS

    2. ECS執行個體所在的地區已建立了OSS儲存空間(Bucket),並記錄Bucket名稱和EndPoint,可在Bucket概覽頁擷取。具體操作,請參見建立儲存空間

      重要

      若需通過外網訪問OSS,請確保ECS執行個體已開通公網。您可以通過更改頻寬或綁定EIP方式開通IPv4公網。具體操作,請參見修改固定公網頻寬綁定EIP

      image

      image

    3. 已上傳圖片到OSS儲存空間(Bucket)。具體操作,請參見上傳圖片到OSS

  2. 遠端連線ECS執行個體,安裝OSS Python SDK和alibabacloud_credentials。

    說明
    • 本步驟以Alibaba Cloud Linux 3 ECS執行個體為例,Alibaba Cloud Linux 3預設安裝的是Python 3,如果您使用其他Linux作業系統需要根據Python版本,命令需要適當調整。如果您使用的是Windows ECS執行個體,請參見安裝OSS Python SDK

    • 您登入的Linux使用者需要有sudo命令許可權。

    1. 升級pip和setuptools、wheel工具。

      sudo pip3 install --upgrade pip setuptools wheel
    2. 安裝credentials工具。

      sudo pip3 install alibabacloud_credentials  
    3. 安裝OSS SDK依賴的python-devel包。

      sudo yum install python3-devel 
    4. 安裝OSS Python SDK。

      sudo pip3 install oss2 
  3. 使用執行個體RAM角色作為臨時憑證訪問OSS,並下載圖片。

    1. Python範例程式碼如下(部分資訊需參考注釋,按實際情況替換):

      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
          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)
    2. 運行Python代碼。

      python3 /localpath/to/demo.py  #需替換為python代碼的根路徑

      運行成功,則輸出。

      image

    3. 驗證圖片是否下載成功。

       cd  /localpath/to/            #需替換為圖片在ECS上儲存的上級路徑
       ls

      當目錄中存在檔案image.png,則成功下載。

      image

相關文檔