通過(guò)ECS實(shí)例RAM角色授權(quán)ECS訪問其他云資源
當(dāng)ECS實(shí)例或部署在ECS實(shí)例上的應(yīng)用需要訪問其他云資源時(shí),必須配置訪問憑證,阿里云服務(wù)會(huì)通過(guò)訪問憑證驗(yàn)證您的身份信息和訪問權(quán)限。實(shí)例RAM角色允許您將一個(gè)角色關(guān)聯(lián)到ECS實(shí)例,實(shí)現(xiàn)在實(shí)例內(nèi)部自動(dòng)獲取并刷新臨時(shí)訪問憑證,無(wú)需直接暴露AccessKey,減少密鑰泄露的風(fēng)險(xiǎn)。同時(shí),也可借助RAM角色精細(xì)化控制資源訪問權(quán)限,避免權(quán)限過(guò)度分配。本文主要介紹如何創(chuàng)建實(shí)例RAM角色并授予給ECS實(shí)例,以及如何基于實(shí)例RAM角色的獲取臨時(shí)訪問憑證。
實(shí)例RAM角色是一種可信實(shí)體為阿里云服務(wù)的RAM角色,即允許云服務(wù)扮演的角色,用于解決跨服務(wù)訪問問題。關(guān)于RAM角色的詳細(xì)說(shuō)明,請(qǐng)參見什么是RAM角色。
功能優(yōu)勢(shì)
基于實(shí)例RAM角色獲取臨時(shí)訪問憑證驗(yàn)證身份信息和訪問權(quán)限控制,有以下優(yōu)勢(shì):
增強(qiáng)通信安全性:使用STS臨時(shí)憑證代替長(zhǎng)期AccessKey,降低憑證泄漏的風(fēng)險(xiǎn)。
跨服務(wù)訪問并精細(xì)化管理權(quán)限:通過(guò)為不同ECS實(shí)例賦予具有特定授權(quán)策略的RAM角色,確保實(shí)例僅能訪問其所需的資源,實(shí)現(xiàn)權(quán)限最小化。
簡(jiǎn)化權(quán)限維護(hù):無(wú)需直接在ECS實(shí)例上管理憑據(jù),權(quán)限的調(diào)整僅需通過(guò)修改RAM角色的授權(quán)策略來(lái)實(shí)現(xiàn),快捷地維護(hù)ECS實(shí)例擁有的訪問權(quán)限。
使用限制
為ECS實(shí)例授予實(shí)例RAM角色存在以下限制:
ECS實(shí)例的網(wǎng)絡(luò)類型必須是專有網(wǎng)絡(luò)VPC。
一臺(tái)ECS實(shí)例只能授予一個(gè)實(shí)例RAM角色。
實(shí)現(xiàn)流程
創(chuàng)建ECS實(shí)例RAM角色并授予給ECS
創(chuàng)建一個(gè)RAM角色,并為該角色授予所需的阿里云服務(wù)訪問權(quán)限。例如,如果ECS實(shí)例需要訪問OSS,就要給角色賦予OSS的讀寫權(quán)限。
若您的操作賬戶為RAM用戶(子賬號(hào)),請(qǐng)先聯(lián)系阿里云賬號(hào)(主賬號(hào))獲取使用和配置實(shí)例RAM角色的權(quán)限。具體操作,請(qǐng)參見授權(quán)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": "*"
}
]
}
通過(guò)控制臺(tái)創(chuàng)建和授予
登錄RAM控制臺(tái),創(chuàng)建實(shí)例RAM角色并為其授權(quán)。
創(chuàng)建可信實(shí)體為阿里云服務(wù)的RAM角色。
選擇身份管理 > 角色,單擊創(chuàng)建角色,按照界面提示完成角色創(chuàng)建。注意以下參數(shù)(其他參數(shù)按需填寫,可參見創(chuàng)建普通服務(wù)角色):
可信實(shí)體類型:選擇阿里云服務(wù)。
角色類型:選擇普通服務(wù)角色。
受信服務(wù):選擇云服務(wù)器。
為已創(chuàng)建的實(shí)例RAM角色授權(quán)。
將系統(tǒng)策略或已創(chuàng)建的自定義權(quán)限策略授權(quán)給RAM用戶,使其擁有相關(guān)的資源訪問或操作權(quán)限。例如,給角色賦予OSS的讀寫權(quán)限(AliyunOSSReadOnlyAccess)。
說(shuō)明支持添加系統(tǒng)策略或自定義策略。若系統(tǒng)策略不滿足您的需求,可新建自定義策略。具體操作,請(qǐng)參見創(chuàng)建自定義權(quán)限策略。
授予實(shí)例RAM角色給ECS實(shí)例。
在左側(cè)導(dǎo)航欄,選擇 。
在頁(yè)面左側(cè)頂部,選擇目標(biāo)資源所在的資源組和地域。
找到要操作的ECS實(shí)例,選擇
。在對(duì)話框中,選擇創(chuàng)建好的實(shí)例RAM角色,單擊確定。
通過(guò)API創(chuàng)建和授予
創(chuàng)建并配置實(shí)例RAM角色
調(diào)用CreateRole接口創(chuàng)建實(shí)例RAM角色。
按如下策略設(shè)置參數(shù)AssumeRolePolicyDocument:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
(可選)調(diào)用CreatePolicy接口新建權(quán)限策略。
如果您已有可用權(quán)限策略,可跳過(guò)該步驟。
PolicyDocument
(權(quán)限策略)需按如下設(shè)置:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
調(diào)用AttachPolicyToRole接口為實(shí)例RAM角色授權(quán)。
調(diào)用AttachInstanceRamRole接口將RAM角色授予ECS實(shí)例。
通過(guò)ECS實(shí)例RAM角色獲取臨時(shí)訪問憑證
獲取到臨時(shí)訪問憑證后,應(yīng)用程序即可使用這些臨時(shí)憑證安全地調(diào)用阿里云API,進(jìn)行跨服務(wù)訪問或數(shù)據(jù)操作。該臨時(shí)授權(quán)訪問憑證會(huì)自動(dòng)周期性地更新。
方式一:在SDK中通過(guò)Credentials工具獲取
Credentials工具會(huì)自動(dòng)獲取ECS實(shí)例綁定的實(shí)例RAM角色,并調(diào)用ECS的元數(shù)據(jù)服務(wù)(Meta Data Server)獲取臨時(shí)訪問憑證STS Token,該憑證會(huì)周期性更新。
下文以Python和Java SDK為例,更多語(yǔ)言SDK示例,請(qǐng)參見使用訪問憑據(jù)訪問阿里云OpenAPI最佳實(shí)踐。
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角色的角色名稱,不填會(huì)自動(dòng)獲取,但是建議加上以減少請(qǐng)求次數(shù) 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實(shí)例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角色的角色名稱,不填會(huì)自動(dòng)獲取,但是建議加上以減少請(qǐng)求次數(shù) credentialConfig.setRoleName("<RoleName>"); Client credentialClient = new Client(credentialConfig); } }
方式二:在實(shí)例內(nèi)部獲取(通過(guò)元數(shù)據(jù))
某些場(chǎng)景,如果您沒有適配Credentials工具,或需要在腳本中基于實(shí)例RAM角色來(lái)獲取資源臨時(shí)訪問憑證,可直接在實(shí)例內(nèi)部訪問元數(shù)據(jù)服務(wù)器獲取。
通過(guò)元數(shù)據(jù)服務(wù),您無(wú)需登錄控制臺(tái)或調(diào)用API,在實(shí)例內(nèi)部即可獲取實(shí)例信息。詳細(xì)說(shuō)明,請(qǐng)參見實(shí)例元數(shù)據(jù)。
加固模式
Linux實(shí)例
# 獲取元數(shù)據(jù)服務(wù)器的訪問憑證用于鑒權(quán) TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<元數(shù)據(jù)服務(wù)器訪問憑證有效期>"` # 獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪問憑證 curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/<實(shí)例RAM角色名稱>
Windows實(shí)例(Powershell)
# 獲取元數(shù)據(jù)服務(wù)器的訪問憑證用于鑒權(quán) $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<元數(shù)據(jù)服務(wù)器的訪問憑證有效期>"} -Method PUT -Uri http://100.100.100.200/latest/api/token # 獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪問憑證 Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/ram/security-credentials/<實(shí)例RAM角色名稱>
<元數(shù)據(jù)服務(wù)器的訪問憑證有效期>:
實(shí)例RAM角色的臨時(shí)授權(quán)訪問憑證是通過(guò)元數(shù)據(jù)服務(wù)器獲取的,在獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪問憑證之前,先獲取元數(shù)據(jù)服務(wù)器的訪問憑證并設(shè)置其有效期,以加強(qiáng)數(shù)據(jù)安全。超過(guò)有效期后,需要重新獲取憑證,否則無(wú)法獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪問憑證。
取值范圍為1~21600,單位為秒。詳細(xì)說(shuō)明,請(qǐng)參見實(shí)例元數(shù)據(jù)。
<實(shí)例RAM角色名稱>
:需替換為具體的實(shí)例RAM角色名稱。例如EcsRamRoleDocumentTesting。
普通模式
Linux實(shí)例
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<實(shí)例RAM角色名稱>
Windows實(shí)例(Powershell)
Invoke-RestMethod http://100.100.100.200/latest/meta-data/Invoke-RestMethod http://100.100.100.200/latest/meta-data/ram/security-credentials/<實(shí)例RAM角色名稱>
<實(shí)例RAM角色名稱>
需替換為具體的實(shí)例RAM角色名稱。例如EcsRamRoleDocumentTesting。
返回示例如下,其中:
SecurityToken
:實(shí)例RAM角色的臨時(shí)Token。Expiration
:實(shí)例RAM角色的臨時(shí)授權(quán)訪問憑證的有效期(非元數(shù)據(jù)服務(wù)器的訪問憑證有效期)。{ "AccessKeyId" : "STS.*******6YSE", "AccessKeySecret" : "aj******jDU", "Expiration" : "2017-11-01T05:20:01Z", "SecurityToken" : "CAISng********", "LastUpdated" : "2023-07-18T14:17:28Z", "Code" : "Success" }
收回/更改ECS的實(shí)例RAM角色
通過(guò)控制臺(tái)收回/更改
在左側(cè)導(dǎo)航欄,選擇 。
在頁(yè)面左側(cè)頂部,選擇目標(biāo)資源所在的資源組和地域。
找到要操作的ECS實(shí)例,選擇
。收回實(shí)例RAM角色:操作類型選擇收回,單擊確定。
更改實(shí)例RAM角色:操作類型選擇授予,選擇所需的實(shí)例RAM角色,單擊確定完成更改。
通過(guò)API收回/更改
收回實(shí)例RAM角色:調(diào)用DetachInstanceRamRole接口收回實(shí)例RAM角色。
更改實(shí)例RAM角色:
調(diào)用DetachInstanceRamRole接口收回實(shí)例RAM角色。
調(diào)用AttachInstanceRamRole接口重新為實(shí)例授予新的RAM角色。
應(yīng)用示例:通過(guò)ECS實(shí)例RAM角色訪問其他云服務(wù)
下文以部署在Linux ECS實(shí)例上的Python應(yīng)用程序訪問OSS下載圖片為例,為您介紹如何通過(guò)ECS及部署在ECS實(shí)例上的應(yīng)用如何通過(guò)實(shí)例RAM角色訪問其他云資源。
準(zhǔn)備工作。
創(chuàng)建ECS實(shí)例RAM角色,授予所需資源的訪問權(quán)限(本文示例AliyunOSSReadOnlyAccess),并將該實(shí)例RAM角色授予ECS實(shí)例。
具體操作,可參見創(chuàng)建ECS實(shí)例RAM角色并授予給ECS。
在ECS實(shí)例所在的地域創(chuàng)建OSS存儲(chǔ)空間(Bucket),并記錄Bucket名稱和EndPoint,可在Bucket概覽頁(yè)獲取。具體操作,請(qǐng)參見創(chuàng)建存儲(chǔ)空間。
重要若需通過(guò)外網(wǎng)訪問OSS,請(qǐng)確保ECS實(shí)例已開通公網(wǎng)。您可以通過(guò)更改帶寬或綁定EIP方式開通IPv4公網(wǎng)。具體操作,請(qǐng)參見修改固定公網(wǎng)帶寬或綁定EIP。
上傳圖片到OSS存儲(chǔ)空間(Bucket)。具體操作,請(qǐng)參見上傳圖片到OSS。
遠(yuǎn)程連接ECS實(shí)例,安裝OSS Python SDK和alibabacloud_credentials。
說(shuō)明本步驟以Alibaba Cloud Linux 3 ECS實(shí)例為例,Alibaba Cloud Linux 3默認(rèn)安裝的是Python 3,如果您使用其他Linux操作系統(tǒng)需要根據(jù)Python版本適當(dāng)調(diào)整命令。如果您使用的是Windows ECS實(shí)例,請(qǐng)參見安裝OSS Python SDK。
升級(jí)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
使用實(shí)例RAM角色作為臨時(shí)憑證訪問OSS,并下載圖片。
Python示例代碼如下(部分信息需參考注釋,按實(shí)際情況替換):
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 對(duì)象 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' # 需替換為實(shí)例RAM角色名稱 bucket_name = 'bucket_name' # 需替換為Bucket名稱 endpoint = 'http://oss-cn-beijing-internal.aliyuncs.com' # 需替換為OSS Bucket的Endpoint object_key = 'testfolder/example.png' # 需替換為你要下載的圖片在OSS中的完整存儲(chǔ)路徑(不包含Bucket名稱) local_file = '/localpath/to/image.png' # 需替換為圖片需要在ECS上存儲(chǔ)的根路徑,并定義圖片名稱 download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)
相關(guān)文檔
當(dāng)您的自建應(yīng)用部署在阿里云ECS服務(wù)器上,且需要訪問KMS應(yīng)用時(shí),可以使用ECS實(shí)例RAM角色訪問KMS。具體操作,請(qǐng)參見使用ECS實(shí)例RAM角色安全訪問KMS。
當(dāng)ECS不需要某些資源訪問權(quán)限時(shí),可以通過(guò)移除實(shí)例RAM角色的權(quán)限來(lái)實(shí)現(xiàn)。具體操作,請(qǐng)參見為RAM角色移除權(quán)限。
訪問阿里云OpenAPI時(shí),如果在代碼中硬編碼明文AK,容易因代碼倉(cāng)庫(kù)權(quán)限管理不當(dāng)造成AK泄露,建議您通過(guò)非AccessKey硬編碼的方式編程,使用訪問憑證訪問阿里云OpenAPI,可參見使用訪問憑據(jù)訪問阿里云OpenAPI最佳實(shí)踐和憑據(jù)的安全使用方案。