获取STS Token

更新时间:
复制为 MD 格式

本文为您介绍通过 Agent Identity 获取 STS Token 以访问阿里云服务(如 ECS、OSS、VPC 等)的认证流程和代码配置方式。

工作流程

  1. 完成入站认证。Agent 通过 Agent Identity SDK 调用 Agent Identity 服务的GetWorkloadAccessToken*系列接口获取 Workload Access Token。常见的入站认证方式是使用外部身份提供商签发的 JWT Token。

  2. 获取 STS Token。Agent Identity SDK 使用获取的 Workload Access Token,调用 Agent Identity 服务的AssumeRoleForWorkloadIdentity接口进行角色扮演,获取临时安全令牌 STS Token(包含 AccessKeyId、AccessKeySecret 和 SecurityToken)。

  3. 访问阿里云资源。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 与入站认证用户身份)用于权限控制及操作审计。

当 Agent 使用 Agent Identity 颁发的 STS Token 调用阿里云 OpenAPI(例如创建 VPC)时,操作审计事件的 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"
}