執行個體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執行個體的網路類型必須是Virtual Private Cloud。
一台ECS執行個體只能被授予一個RAM角色。
實現流程
如您使用阿里雲帳號(主帳號)操作,可忽略以下授權內容,若您使用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角色的臨時身份憑證
您可以在ECS執行個體內部通過訪問中繼資料服務(Meta Data Service)擷取到臨時訪問憑證,同時會確保臨時訪問憑證的有效性。更多關於中繼資料的介紹,請參見執行個體中繼資料。
方式一:通過Credentials工具擷取
Credentials工具封裝了調用ECS的中繼資料服務(Meta Data Service)擷取臨時訪問憑證STS Token的邏輯,且支援周期性更新。
下文以Python和Java SDK為例。
Python
安裝Credentials工具。
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); } }
方式二:通過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。
返回樣本如下,其中:
AccessKeyId
、AccessKeySecret
、SecurityToken
共同構成了臨時存取權杖。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角色
通過控制台收回/更改
登入ECS管理主控台。
在左側導覽列,選擇 。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
找到要操作的ECS執行個體,選擇
。收回執行個體RAM角色:操作類型選擇解綁,單擊確定。
更改執行個體RAM角色:操作類型選擇綁定,選擇所需的執行個體RAM角色,單擊確定完成更改。
通過API收回/更改
收回執行個體RAM角色:調用DetachInstanceRamRole介面收回執行個體RAM角色。
更改執行個體RAM角色:
調用DetachInstanceRamRole介面收回執行個體RAM角色。
調用AttachInstanceRamRole介面重新為執行個體授予新的RAM角色。
相關文檔
當您的自建應用部署在阿里雲ECS伺服器上,且需要訪問KMS應用時,可以使用ECS執行個體RAM角色訪問KMS。具體操作,請參見使用ECS執行個體RAM角色安全訪問KMS。
當ECS不需要某些資源存取權限時,可以通過移除執行個體RAM角色的許可權來實現。具體操作,請參見為RAM角色移除許可權。
訪問阿里雲OpenAPI時,如果在代碼中寫入程式碼明文AK,容易因代碼倉庫許可權管理不當造成AK泄露,建議您通過非AccessKey硬式編碼方式編程,使用訪問憑證訪問阿里雲OpenAPI,可參見使用訪問憑據訪問阿里雲OpenAPI最佳實務和憑據的安全使用方式情節。