當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資源。
通過控制台建立和授予
通過API建立和授予
建立並配置執行個體RAM角色
調用CreateRole介面建立執行個體RAM角色。
按如下原則設定參數AssumeRolePolicyDocument:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
(可選)調用CreatePolicy介面建立權限原則。
如果您已有可用權限原則,可跳過該步驟。
PolicyDocument
(權限原則)需按如下設定:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
調用AttachPolicyToRole介面為執行個體RAM角色授權。
調用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角色
通過控制台收回/更改
登入ECS管理主控台。
在左側導覽列,選擇 。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
找到要操作的ECS執行個體,選擇
。收回執行個體RAM角色:操作類型選擇解綁,單擊確定。
更改執行個體RAM角色:操作類型選擇綁定,選擇所需的執行個體RAM角色,單擊確定完成更改。
通過API收回/更改
收回執行個體RAM角色:調用DetachInstanceRamRole介面收回執行個體RAM角色。
更改執行個體RAM角色:
調用DetachInstanceRamRole介面收回執行個體RAM角色。
調用AttachInstanceRamRole介面重新為執行個體授予新的RAM角色。
應用樣本:使用執行個體RAM角色訪問其他雲資源
下文以部署在Linux ECS執行個體上的Python應用程式訪問OSS下載圖片為例,為您介紹如何通過ECS及部署 ECS執行個體上的應用如何通過執行個體RAM角色訪問其他雲資源。
準備工作。
已建立ECS執行個體RAM角色,授予所需資源的存取權限(本文樣本AliyunOSSReadOnlyAccess),並將該執行個體RAM角色授予給ECS執行個體。
具體操作,可參見建立執行個體RAM角色並授予給ECS。
ECS執行個體所在的地區已建立了OSS儲存空間(Bucket),並記錄Bucket名稱和EndPoint,可在Bucket概覽頁擷取。具體操作,請參見建立儲存空間。
已上傳圖片到OSS儲存空間(Bucket)。具體操作,請參見上傳圖片到OSS。
遠端連線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命令許可權。
升級pip和setuptools、wheel工具。
sudo pip3 install --upgrade pip setuptools wheel
安裝credentials工具。
sudo pip3 install alibabacloud_credentials
安裝OSS SDK依賴的python-devel包。
sudo yum install python3-devel
安裝OSS Python SDK。
sudo pip3 install oss2
使用執行個體RAM角色作為臨時憑證訪問OSS,並下載圖片。
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)
運行Python代碼。
python3 /localpath/to/demo.py #需替換為python代碼的根路徑
運行成功,則輸出。
驗證圖片是否下載成功。
cd /localpath/to/ #需替換為圖片在ECS上儲存的上級路徑 ls
當目錄中存在檔案image.png,則成功下載。
相關文檔
當您的自建應用部署在阿里雲ECS伺服器上,且需要訪問KMS應用時,可以使用ECS執行個體RAM角色訪問KMS。具體操作,請參見使用ECS執行個體RAM角色安全訪問KMS。
當ECS不需要某些資源存取權限時,可以通過移除執行個體RAM角色的許可權,將這些許可權移除。具體操作,請參見為RAM角色移除許可權。
訪問阿里雲OpenAPI時,如果在代碼中寫入程式碼明文AK,容易因代碼倉庫許可權管理不當造成AK泄露,建議您通過非AccessKey硬式編碼方式編程,使用訪問憑證訪問阿里雲OpenAPI,可參見使用訪問憑證訪問阿里雲OpenAPI最佳實務和憑據的安全使用方式情節。