實例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實例
通過控制臺創建和授予
通過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最佳實踐和憑據的安全使用方案。