當ECS實例或部署在ECS實例上的應用需要訪問其他云資源時,必須配置訪問憑證,阿里云服務會通過訪問憑證驗證您的身份信息和訪問權限。實例RAM角色允許您將一個角色關聯到ECS實例,實現在實例內部自動獲取并刷新臨時訪問憑證,無需直接暴露AccessKey,減少密鑰泄露的風險。同時,也可借助RAM角色精細化控制資源訪問權限,避免權限過度分配。本文主要介紹如何創建實例RAM角色并授予給ECS實例,以及如何基于實例RAM角色的獲取臨時訪問憑證。
實例RAM角色是一種可信實體為阿里云服務的RAM角色,即允許云服務扮演的角色,用于解決跨服務訪問問題。關于RAM角色的詳細說明,請參見什么是RAM角色。
功能優勢
基于實例RAM角色獲取臨時訪問憑證驗證身份信息和訪問權限控制,有以下優勢:
增強通信安全性:使用STS臨時憑證代替長期AccessKey,降低憑證泄漏的風險。
跨服務訪問并精細化管理權限:通過為不同ECS實例賦予具有特定授權策略的RAM角色,確保實例僅能訪問其所需的資源,實現權限最小化。
簡化權限維護:無需直接在ECS實例上管理憑據,權限的調整僅需通過修改RAM角色的授權策略來實現,快捷地維護ECS實例擁有的訪問權限。
使用限制
為ECS實例授予實例RAM角色存在以下限制:
ECS實例的網絡類型必須是專有網絡VPC。
一臺ECS實例只能授予一個實例RAM角色。
實現流程
創建ECS實例RAM角色并授予給ECS
創建一個RAM角色,并為該角色授予所需的阿里云服務訪問權限。例如,如果ECS實例需要訪問OSS,就要給角色賦予OSS的讀寫權限。
若您的操作賬戶為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": "*"
}
]
}
通過控制臺創建和授予
通過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實例。
通過ECS實例RAM角色獲取臨時訪問憑證
獲取到臨時訪問憑證后,應用程序即可使用這些臨時憑證安全地調用阿里云API,進行跨服務訪問或數據操作。該臨時授權訪問憑證會自動周期性地更新。
方式一:在SDK中通過Credentials工具獲取
Credentials工具會自動獲取ECS實例綁定的實例RAM角色,并調用ECS的元數據服務(Meta Data Server)獲取臨時訪問憑證STS Token,該憑證會周期性更新。
下文以Python和Java SDK為例,更多語言SDK示例,請參見使用訪問憑據訪問阿里云OpenAPI最佳實踐。
Python
安裝Credentials工具。
sudo pip install alibabacloud_credentials
配置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
添加credentials依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
配置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); } }
方式二:在實例內部獲取(通過元數據)
某些場景,如果您沒有適配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角色。
應用示例:通過ECS實例RAM角色訪問其他云服務
下文以部署在Linux ECS實例上的Python應用程序訪問OSS下載圖片為例,為您介紹如何通過ECS及部署在ECS實例上的應用如何通過實例RAM角色訪問其他云資源。
準備工作。
創建ECS實例RAM角色,授予所需資源的訪問權限(本文示例AliyunOSSReadOnlyAccess),并將該實例RAM角色授予ECS實例。
具體操作,可參見創建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。
升級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)
相關文檔
當您的自建應用部署在阿里云ECS服務器上,且需要訪問KMS應用時,可以使用ECS實例RAM角色訪問KMS。具體操作,請參見使用ECS實例RAM角色安全訪問KMS。
當ECS不需要某些資源訪問權限時,可以通過移除實例RAM角色的權限來實現。具體操作,請參見為RAM角色移除權限。
訪問阿里云OpenAPI時,如果在代碼中硬編碼明文AK,容易因代碼倉庫權限管理不當造成AK泄露,建議您通過非AccessKey硬編碼的方式編程,使用訪問憑證訪問阿里云OpenAPI,可參見使用訪問憑據訪問阿里云OpenAPI最佳實踐和憑據的安全使用方案。