本文為您介紹通過 Agent Identity 擷取 STS Token 以訪問阿里雲服務(如 ECS、OSS、VPC 等)的認證流程和代碼配置方式。
工作流程
完成入站認證。Agent 通過 Agent Identity SDK 調用 Agent Identity 服務的
GetWorkloadAccessToken*系列介面擷取 Workload Access Token。常見的入站認證方式是使用外部身份供應商簽發的 JWT Token。擷取 STS Token。Agent Identity SDK 使用擷取的 Workload Access Token,調用 Agent Identity 服務的
AssumeRoleForWorkloadIdentity介面進行角色扮演,擷取臨時安全性權杖 STS Token(包含 AccessKeyId、AccessKeySecret 和 SecurityToken)。訪問阿里雲資源。Agent 使用擷取的 STS Token 調用阿里雲 OpenAPI,以 Workload Identity 關聯的運行時 RAM 角色身份安全地訪問 ECS、OSS、VPC 等阿里雲服務。
前提條件
在調用 Agent Identity 擷取 STS Token 前,需要完成 Workload Identity 的建立及其運行時 RAM 角色的授權配置:
通過 Agent Identity 控制台或 Agent Identity CLI 建立 Workload Identity。使用 CLI 建立時會自動產生同名的運行時 RAM 角色(命名格式為
agentidentityrole-${workloadIdentityName})。在 RAM 控制台為該運行時 RAM 角色授予訪問目標阿里雲服務所需的權限原則(例如訪問 VPC 時授予
AliyunVPCFullAccess系統策略)。
使用方式
完成上述前置配置後,即可在 Agent 中使用 Agent Identity SDK 擷取 STS Token。在需要使用 STS Token 調用阿里雲 OpenAPI 的函數前,添加@requires_sts_token註解。Agent Identity SDK 會自動完成入站認證、擷取 Workload Access Token,並以此請求 STS Token,最終將 STS Token 注入到目標函數的指定參數中。
以下範例程式碼(Python)示範了在 Agent 中使用 STS Token 調用阿里雲 VPC OpenAPI 建立 VPC:
from typing import Optional
from agent_identity_python_sdk.core.decorators import get_region, requires_sts_token
from agent_identity_python_sdk.model import STSCredential
from alibabacloud_vpc20160428.client import Client as Vpc20160428Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_vpc20160428 import models as vpc_20160428_models
@requires_sts_token(
inject_param_name="sts_credential"
)
def create_vpc(
name: str,
region_id: str,
cidr_block: str,
sts_credential: Optional[STSCredential] = None,
):
# Initialize Alibaba Cloud OpenAPI client by using STS credential
config = open_api_models.Config(
access_key_id=sts_credential.access_key_id,
access_key_secret=sts_credential.access_key_secret,
security_token=sts_credential.security_token,
)
config.endpoint = f'vpc.{region_id}.aliyuncs.com'
client = Vpc20160428Client(config)
# Call OpenAPI to create VPC
request = vpc_20160428_models.CreateVpcRequest(
region_id=region_id,
cidr_block=cidr_block,
vpc_name=name,
description='This is a test VPC.'
)
response = client.create_vpc(request)更多內容,請參考擷取STS Token樣本。
常見問題
如何區分STS Token是否為Agent Identity頒發?
與普通由阿里雲 STS 服務頒發的 STS Token(例如 RAM 使用者調用 AssumeRole 介面擷取的 STS Token)不同,Agent Identity 頒發的 STS Token 會攜帶調用方 Agent 的身份資訊(如 Workload Identity 與入站認證使用者身份)用於許可權控制及Action Trail。
當 Agent 使用 Agent Identity 頒發的 STS Token 調用阿里雲 OpenAPI(例如建立 VPC)時,Action Trail事件的 userIdentity 欄位會包含 externalIdentityContext,記錄 Workload Identity ARN、入站使用者身份等資訊。例如:
{
...
"userIdentity": {
"type": "assumed-role",
...
"sessionContext": {
"externalIdentityContext": {
"agentidentityWorkloadIdentityArn": "acs:agentidentity:cn-beijing:<account_id>:workloadidentitydirectory/default/workloadidentity/<workload-identity-name>",
"agentidentityInboundJwtClaimIss": "https://<oauth.yourcompany.com>",
"agentidentityInboundJwtClaimSub": "iiCsOvhjNZX/hK0x1jl9****"
}
}
}
...
"eventName": "CreateVpc"
}