實(shí)例RAM角色
實(shí)例RAM角色是指為ECS實(shí)例授予的RAM角色,該RAM角色是一個(gè)受信服務(wù)為云服務(wù)器的普通服務(wù)角色。使用實(shí)例RAM角色可以實(shí)現(xiàn)在ECS實(shí)例內(nèi)部無(wú)需配置AccessKey即可獲取臨時(shí)訪(fǎng)問(wèn)憑證(STS Token),從而調(diào)用其他云產(chǎn)品的API。由于臨時(shí)身份憑證僅可在實(shí)例內(nèi)部獲取,并且無(wú)需配置AccessKey,這不僅確保了云賬號(hào)AccessKey的安全性,還能夠通過(guò)訪(fǎng)問(wèn)控制RAM實(shí)現(xiàn)精細(xì)化的控制與權(quán)限管理。
功能優(yōu)勢(shì)
安全便捷的實(shí)例內(nèi)API調(diào)用方案:當(dāng)您的項(xiàng)目部署在阿里云ECS上時(shí),無(wú)需在代碼中配置AccessKey,即可利用ECS提供的能力獲取臨時(shí)身份憑證(STS Token)以調(diào)用API,從而降低AccessKey泄漏的風(fēng)險(xiǎn)。
簡(jiǎn)化RAM身份切換流程:如果您使用的是傳統(tǒng)的AccessKey方案,當(dāng)需要更換調(diào)用服務(wù)的RAM身份時(shí),需對(duì)配置或者代碼進(jìn)行修改并重啟服務(wù)。而采用實(shí)例RAM角色后,僅需調(diào)整授予ECS實(shí)例的RAM角色即可實(shí)現(xiàn)身份切換,無(wú)需進(jìn)行其他任何更改。
精細(xì)化管理權(quán)限:可以為不同的ECS實(shí)例分配具有特定授權(quán)策略的RAM角色,從而實(shí)現(xiàn)根據(jù)業(yè)務(wù)需求進(jìn)行精細(xì)化的訪(fǎng)問(wèn)控制。
使用限制
為ECS實(shí)例授予RAM角色時(shí)存在以下限制:
ECS實(shí)例的網(wǎng)絡(luò)類(lèi)型必須是專(zhuān)有網(wǎng)絡(luò)VPC。
一臺(tái)ECS實(shí)例只能被授予一個(gè)RAM角色。
實(shí)現(xiàn)流程
如您使用阿里云賬號(hào)(主賬號(hào))操作,可忽略以下授權(quán)內(nèi)容,若您使用RAM用戶(hù)或RAM角色執(zhí)行后續(xù)操作,請(qǐng)為對(duì)應(yīng)的用戶(hù)身份授予以下權(quán)限。
該權(quán)限主要包含以下權(quán)限內(nèi)容:
管理RAM角色:需要?jiǎng)?chuàng)建RAM角色并授權(quán)。
授予/回收RAM角色:需要進(jìn)入實(shí)例詳情頁(yè)對(duì)實(shí)例做授予/回收RAM角色的操作。
允許傳遞角色給云產(chǎn)品:給云服務(wù)授予角色需要配合
ram:PassRole
權(quán)限。
{
"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": "*"
}
]
}
創(chuàng)建RAM角色并授予給ECS實(shí)例
通過(guò)控制臺(tái)創(chuàng)建和授予
登錄RAM控制臺(tái),創(chuàng)建RAM角色并授權(quán)。
創(chuàng)建可信實(shí)體為阿里云服務(wù)的RAM角色。
選擇身份管理 > 角色,單擊創(chuàng)建角色,按照界面提示完成角色創(chuàng)建。注意以下參數(shù)(其他參數(shù)按需填寫(xiě),可參見(jiàn)創(chuàng)建普通服務(wù)角色):
可信實(shí)體類(lèi)型:選擇阿里云服務(wù)。
角色類(lèi)型:選擇普通服務(wù)角色。
受信服務(wù):選擇云服務(wù)器。
為已創(chuàng)建的RAM角色授權(quán)。
將系統(tǒng)策略或已創(chuàng)建的自定義權(quán)限策略授權(quán)給RAM用戶(hù),使其擁有相關(guān)的資源訪(fǎng)問(wèn)或操作權(quán)限。例如,給RAM角色賦予OSS的只讀權(quán)限(AliyunOSSReadOnlyAccess)。
說(shuō)明支持添加系統(tǒng)策略或自定義策略。若系統(tǒng)策略不滿(mǎn)足您的需求,可新建自定義策略。具體操作,請(qǐng)參見(jiàn)創(chuàng)建自定義權(quán)限策略。
為ECS實(shí)例授予RAM角色。
在左側(cè)導(dǎo)航欄,選擇 。
在頁(yè)面左側(cè)頂部,選擇目標(biāo)資源所在的資源組和地域。
找到要操作的ECS實(shí)例,選擇
。在對(duì)話(huà)框中,選擇創(chuàng)建好的實(shí)例RAM角色,單擊確定。
通過(guò)API創(chuàng)建和授予
創(chuàng)建RAM角色并授權(quán)。
調(diào)用CreateRole接口創(chuàng)建RAM角色。
信任策略參數(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í)例。
獲取實(shí)例RAM角色的臨時(shí)身份憑證
您可以在ECS實(shí)例內(nèi)部通過(guò)訪(fǎng)問(wèn)元數(shù)據(jù)服務(wù)(Meta Data Service)獲取到臨時(shí)訪(fǎng)問(wèn)憑證,同時(shí)會(huì)確保臨時(shí)訪(fǎng)問(wèn)憑證的有效性。更多關(guān)于元數(shù)據(jù)的介紹,請(qǐng)參見(jiàn)實(shí)例元數(shù)據(jù)。
方式一:通過(guò)Credentials工具獲取
Credentials工具封裝了調(diào)用ECS的元數(shù)據(jù)服務(wù)(Meta Data Service)獲取臨時(shí)訪(fǎng)問(wèn)憑證STS Token的邏輯,且支持周期性更新。
下文以Python和Java SDK為例。
Python
安裝Credentials工具。
pip install alibabacloud_credentials
配置ECS的RAM角色作為訪(fǎng)問(wèn)憑證。
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_credentials.models import Config as CredConfig credentialConfig = CredConfig( type='ecs_ram_role', # 選填,該ECS角色的角色名稱(chēng),不填會(huì)自動(dòng)獲取,但是建議加上以減少請(qǐng)求次數(shù) role_name='<RoleName>' ) credentialsClient = CredClient(credentialConfig)
Java
添加credentials依賴(lài)。
<!-- 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角色作為訪(fǎng)問(wèn)憑證。
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角色的角色名稱(chēng),不填會(huì)自動(dòng)獲取,但是建議加上以減少請(qǐng)求次數(shù) credentialConfig.setRoleName("<RoleName>"); Client credentialClient = new Client(credentialConfig); } }
方式二:通過(guò)Shell命令獲取
元數(shù)據(jù)服務(wù)提供HTTP訪(fǎng)問(wèn)地址獲取臨時(shí)訪(fǎng)問(wèn)憑據(jù)。
加固模式
Linux實(shí)例
# 獲取元數(shù)據(jù)服務(wù)器的訪(fǎng)問(wèn)憑證用于鑒權(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ù)器訪(fǎng)問(wèn)憑證有效期>"` # 獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪(fǎng)問(wèn)憑證 curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/<實(shí)例RAM角色名稱(chēng)>
Windows實(shí)例(Powershell)
# 獲取元數(shù)據(jù)服務(wù)器的訪(fǎng)問(wèn)憑證用于鑒權(quán) $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<元數(shù)據(jù)服務(wù)器的訪(fǎng)問(wèn)憑證有效期>"} -Method PUT -Uri http://100.100.100.200/latest/api/token # 獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪(fǎng)問(wè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角色名稱(chēng)>
<元數(shù)據(jù)服務(wù)器的訪(fǎng)問(wèn)憑證有效期>:
在獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪(fǎng)問(wèn)憑證之前,先獲取元數(shù)據(jù)服務(wù)器的訪(fǎng)問(wèn)憑證并設(shè)置其有效期,以加強(qiáng)數(shù)據(jù)安全。超過(guò)有效期后,需要重新獲取憑證,否則無(wú)法獲取實(shí)例RAM角色的臨時(shí)授權(quán)訪(fǎng)問(wèn)憑證。
取值范圍為1~21600,單位為秒。詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)實(shí)例元數(shù)據(jù)。
<實(shí)例RAM角色名稱(chēng)>
:需替換為具體的實(shí)例RAM角色名稱(chēng)。例如EcsRamRole
。
普通模式
Linux實(shí)例
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<實(shí)例RAM角色名稱(chēng)>
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角色名稱(chēng)>
<實(shí)例RAM角色名稱(chēng)>
需替換為具體的實(shí)例RAM角色名稱(chēng)。例如EcsRamRoleDocumentTesting。
返回示例如下,其中:
AccessKeyId
、AccessKeySecret
、SecurityToken
共同構(gòu)成了臨時(shí)訪(fǎng)問(wèn)令牌。Expiration
:臨時(shí)授權(quán)訪(fǎng)問(wèn)憑證的有效期。{ "AccessKeyId" : "STS.*******6YSE", "AccessKeySecret" : "aj******jDU", "Expiration" : "2017-11-01T05:20:01Z", "SecurityToken" : "CAISng********", "LastUpdated" : "2023-07-18T14:17:28Z", "Code" : "Success" }
使用實(shí)例RAM角色調(diào)用API
下文以部署在Linux ECS實(shí)例上的Python應(yīng)用程序調(diào)用OSS下載文件接口為例,為您介紹ECS實(shí)例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', # 訪(fǎng)問(wèn)憑證類(lèi)型。固定為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角色名稱(chēng)
bucket_name = 'bucket_name' # 需替換為Bucket名稱(chēng)
endpoint = 'http://oss-cn-beijing-internal.aliyuncs.com' # 需替換為OSS Bucket的Endpoint,如果使用內(nèi)網(wǎng)endpoint,需要確保ecs與oss處于同一個(gè)地域。
object_key = 'testfolder/example.png' # 需替換為你要下載的圖片在OSS中的完整存儲(chǔ)路徑(不包含Bucket名稱(chēng))
local_file = '/localpath/to/image.png' # 需替換為圖片需要在ECS上存儲(chǔ)的根路徑,并定義圖片名稱(chēng)
download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)
其他操作
收回/更改ECS的實(shí)例RAM角色
通過(guò)控制臺(tái)收回/更改
在左側(cè)導(dǎo)航欄,選擇 。
在頁(yè)面左側(cè)頂部,選擇目標(biāo)資源所在的資源組和地域。
找到要操作的ECS實(shí)例,選擇
。收回實(shí)例RAM角色:操作類(lèi)型選擇收回,單擊確定。
更改實(shí)例RAM角色:操作類(lèi)型選擇授予,選擇所需的實(shí)例RAM角色,單擊確定完成更改。
通過(guò)API收回/更改
收回實(shí)例RAM角色:調(diào)用DetachInstanceRamRole接口收回實(shí)例RAM角色。
更改實(shí)例RAM角色:
調(diào)用DetachInstanceRamRole接口收回實(shí)例RAM角色。
調(diào)用AttachInstanceRamRole接口重新為實(shí)例授予新的RAM角色。
相關(guān)文檔
當(dāng)您的自建應(yīng)用部署在阿里云ECS服務(wù)器上,且需要訪(fǎng)問(wèn)KMS應(yīng)用時(shí),可以使用ECS實(shí)例RAM角色訪(fǎng)問(wèn)KMS。具體操作,請(qǐng)參見(jiàn)使用ECS實(shí)例RAM角色安全訪(fǎng)問(wèn)KMS。
當(dāng)ECS不需要某些資源訪(fǎng)問(wèn)權(quán)限時(shí),可以通過(guò)移除實(shí)例RAM角色的權(quán)限來(lái)實(shí)現(xiàn)。具體操作,請(qǐng)參見(jiàn)為RAM角色移除權(quán)限。
訪(fǎng)問(wèn)阿里云OpenAPI時(shí),如果在代碼中硬編碼明文AK,容易因代碼倉(cāng)庫(kù)權(quán)限管理不當(dāng)造成AK泄露,建議您通過(guò)非AccessKey硬編碼的方式編程,使用訪(fǎng)問(wèn)憑證訪(fǎng)問(wèn)阿里云OpenAPI,可參見(jiàn)使用訪(fǎng)問(wèn)憑據(jù)訪(fǎng)問(wèn)阿里云OpenAPI最佳實(shí)踐和憑據(jù)的安全使用方案。