全部产品
Search
文档中心

应用身份服务:通过M2M无AK访问云资源配置流程

更新时间:Oct 22, 2026

介绍如何基于部署环境的原生身份、IDaaS M2M 联邦认证和 PAM 授权,在多云、容器及本地环境中安全获取短期 STS 凭证,避免保存长期 AccessKey。

1. 概述

1.1 为什么需要无静态凭证

传统方式下,运行在服务器、容器或流水线中的程序要访问云资源,需要在配置文件或环境变量中保存一份长期有效的 AccessKey(AK/SK)。这带来三类问题:

问题

说明

泄漏面大

AK 随镜像、脚本、配置中心、日志扩散,一处泄漏即整账号失守

轮换成本高

人工定期轮换需要协调所有使用方,实际执行率低

审计困难

多个程序共用一把 AK,无法区分"是谁"在调用,责任无法追溯

无静态凭证的思路是:工作负载不再保存任何长期密钥,而是使用部署环境自带的原生身份证明(实例身份文档、ServiceAccount 令牌、X.509 证书等)向 IDaaS 完成机器身份认证,再由 IDaaS 兑换出短时效的云厂商 STS Token。整个过程没有任何静态密钥落盘。

1.2 端到端链路

链路涉及三类角色:左侧是运行在各类部署环境中的客户端应用(阿里云 ECS/ECI、AWS EC2、Kubernetes、线下 IDC 等,完整清单见第 3 章);中间是 IDaaS EIAM 的授权服务器与 PAM 服务;右侧是目标云厂商(阿里云、AWS、GCP、Azure 等)。完整流程分四步:

步骤

交互双方

说明

① 获取 OAuth2 AccessToken

客户端应用 → IDaaS 授权服务器

客户端应用以部署环境的原生身份证明完成 client_credentials 认证(认证方式选型见第 2、3 章),换取 JWT AccessToken

② 请求云角色 STS Token

客户端应用 → IDaaS PAM 服务

携带 AccessToken 调用 PAM 服务的「获取云角色访问凭证」接口(ObtainCloudAccountRoleAccessCredential,见第 4 章),指定目标云角色

③ 获取临时 OIDC Token

IDaaS PAM 服务 → IDaaS 授权服务器

PAM 服务向授权服务器申请一枚短时效 OIDC Token,受众为目标云厂商

④ 兑换 STS Token

IDaaS PAM 服务 → 目标云厂商

PAM 服务以该 OIDC Token 到云厂商的联邦身份端点兑换出云角色的 STS Token,返回给客户端应用

客户端应用最终以 STS Token(三段式临时凭证:AccessKeyId + AccessKeySecret + SecurityToken)访问目标云的 OpenAPI / SDK,到期前回到步骤 ② 刷新即可。

这条链路实现了两侧都不落静态凭证:客户端侧不保存任何长期密钥(步骤 ①);IDaaS PAM 侧同样不保存目标云的 AK——步骤 ③④ 显示 PAM 是以 OIDC 联邦身份到云厂商兑换临时凭证的,云厂商侧只需预先建立对 IDaaS 的 OIDC 身份提供商信任并完成角色授权(配置方式见第 4 章前置条件)。

2. M2M 应用认证方式总览与区别

2.1 M2M 应用模型

IDaaS EIAM 的 M2M(Machine-to-Machine)能力围绕两类应用展开:

角色

说明

关键配置

M2M 客户端应用(Client)

发起认证的一方,即你的业务程序

凭证管理(client_id、密钥/公钥/联邦凭证)、网络范围限制

M2M 服务端应用(Server / Resource Server)

被调用的一方,定义令牌的受众与权限

受众标识(audience)、权限标识(scope)、授权应用列表

AccessToken 请求中的 scope 参数格式为 **<受众标识>|<权限标识>**(例如 urn:cloud:idaas:pam|cloud_account_role:obtain_access_credential),服务端应用需事先将权限授予客户端应用。

使用前提:实例已开通 M2M 管理能力(License 控制)、应用已开启 M2M 客户端能力、令牌端点与凭证已就绪。

2.2 认证方式清单

Token 端点对 client_credentials 授权类型支持以下客户端认证方式:

标准凭证类

方式

机制

凭证形态

client_secret_basic

HTTP Basic 头携带 client_id + client_secret

共享静态密钥

client_secret_post

表单参数携带 client_secret

共享静态密钥

client_secret_jwt

用 client_secret 作为 HMAC 密钥对 JWT 断言签名(RFC 7523),secret 本身不出现在请求中

共享静态密钥(派生签名)

private_key_jwt

客户端持非对称私钥对 JWT 断言签名,IDaaS 用事先上传的公钥验签

私钥文件(默认 RSA-2048,公钥以 PEM 格式上传)

说明

client_secret_jwt 虽然避免了 secret 明文上线,但 HMAC 密钥仍是双方共享的静态秘密——一旦泄漏即可伪造断言。private_key_jwt 只需在 IDaaS 侧保存公钥,私钥不出现在任何请求中,安全性显著更好,且私钥可独立轮换。

联邦凭证类(无静态凭证的核心)

联邦凭证的统一请求形态:在 Token 请求中以 client_assertion_type + client_assertion 提交外部身份证明,替代自有静态凭证:

方式

client_assertion_type

断言内容

信任锚

PKCS#7

urn:cloud:idaas:params:oauth:client-assertion-type:pkcs7-bearer

云平台元数据服务签发的实例身份文档(PKCS#7/CMS 签名)

云厂商根证书(当前支持阿里云与 AWS)

OIDC

urn:cloud:idaas:params:oauth:client-assertion-type:id-token-bearer

外部 OIDC 身份提供方签发的 ID Token

配置的 Issuer + JWKS

PCA

urn:cloud:idaas:params:oauth:client-assertion-type:x509-jwt-bearer

X.509 客户端证书(client_x509 + client_x509_chain)+ 证书私钥签名的 JWT

自建私有 CA 根证书

三种联邦凭证均支持两级表达式做精细准入(由管理员在联邦信任源与应用联邦凭证上配置):

  • 信任条件(trustCondition):基于断言内容的表达式,例如限定实例 ID、地域、命名空间、证书主题等

  • 验证条件(verificationCondition):应用联邦凭证级别的二次校验,用于在多应用共用信任源时收窄范围

运行时凭证类(PLUGIN)

方式

机制

适用

PLUGIN(OpenAPI 认证)

复用阿里云运行时身份(函数计算角色、ECS 实例角色等自带的 STS 凭证)调用 IDaaS OpenAPI 换取 M2M 令牌,SDK 配置 authnMethod=PLUGIN + pluginName=alibabacloudPluginCredentialProvider

函数计算等无法使用联邦凭证的托管运行时

说明

另有面向无影终端会话的 cloud_idp(EDS)断言类型,属特定终端场景,本文不展开。

2.3 三种联邦凭证的校验机制差异

维度

PKCS#7

OIDC

PCA

断言来源

云平台元数据服务(实例级)

任意 OIDC IdP(集群、平台、企业 IdP)

客户端自身私钥

签名验证

云厂商根证书验签 PKCS#7 签名

Issuer + JWKS 验签 JWT

上传的私有 CA 根证书验证证书链(支持 CRL 吊销检查),再用证书公钥验签 JWT

公钥管理

无需配置(信任锚内置)

三种来源:静态上传 JWKS / 从 Issuer 自动发现 / 指定 JWKS URI

上传根证书(中间证书由客户端随请求提供)

防重放

签名时间窗口校验(签名时间不得晚于当前、且在配置的有效期窗口内)

ID Token 自身的 exp/iat 校验

JWT 断言的 exp/iat + 证书可吊销(CRL)

客户端需要保管什么

什么都不用(环境自动提供)

什么都不用(平台自动提供令牌)

证书私钥(泄漏后可通过 CRL 吊销止损)

典型环境

阿里云 ECS、AWS EC2

ACK/EKS/GKE/TKE/CCE 等容器平台、GCP GCE

自建机房、高合规内网环境

2.4 认证方式对比总表

认证方式

静态凭证

防泄漏

防伪造

轮换成本

适用环境

client_secret_basic / post

✅

弱(明文上线)

弱(共享秘密)

手动,协调成本高

入门验证、开发期

client_secret_jwt

✅

中

弱(共享秘密泄漏即可伪造)

手动

通用

private_key_jwt

私钥文件

强(私钥不上线)

强

中(私钥可独立轮换)

线下、CI/CD、无原生身份环境

PKCS#7 联邦

❌

最强

最强(云厂商背书)

零

阿里云 ECS、AWS EC2

OIDC 联邦

❌

最强

最强(平台签发)

零

各容器平台、GCP GCE

PCA 联邦

私钥(可吊销)

强

强(CA 链 + CRL)

中(PKI 运维)

自建机房、高合规

PLUGIN

❌(复用运行时角色)

强

强

零

函数计算 FC

3. 部署环境与认证方式选型

本章按云厂商介绍各自的典型工作负载形态(虚拟机、容器、Serverless 等),并给出每种部署场景的推荐认证方式;覆盖阿里云、AWS、GCP、Azure、腾讯云、华为云、火山引擎七家云厂商,以及线下 IDC、自建 Kubernetes 集群与本地开发 / CI-CD 等非云环境;章末专门讨论弹性伸缩(如 ECS + ESS)场景下动态工作负载的处理方式。

3.1 部署环境 × 认证方式速查矩阵

第 2 章介绍了各类认证方式的机制与差异,下表按云厂商分组汇总全部部署环境的原生身份证明与推荐认证方式,供整体选型速查;各厂商与环境的接入说明见对应章节(3.2-3.9 节),换取阿里云 STS Token 的统一流程见第 4 章。

阿里云(详见 3.2 节)

部署环境

原生身份证明

推荐认证方式

ECS(虚拟机)

实例身份文档(PKCS#7 签名)

PKCS#7 联邦凭证

ACK(容器)

ServiceAccount OIDC Token(RRSA)

OIDC 联邦凭证

函数计算 FC

函数运行时角色凭证

PLUGIN(OpenAPI 认证)

AWS(详见 3.3 节)

部署环境

原生身份证明

推荐认证方式

EC2(虚拟机)

实例身份文档(PKCS#7 签名)

PKCS#7 联邦凭证

EKS(容器)

ServiceAccount OIDC Token(IRSA)

OIDC 联邦凭证

GCP(详见 3.4 节)

部署环境

原生身份证明

推荐认证方式

GCE(虚拟机)

实例默认服务账号 OIDC Token

OIDC 联邦凭证

GKE(容器)

Workload Identity 令牌

OIDC 联邦凭证

Azure(详见 3.5 节)

部署环境

原生身份证明

推荐认证方式

VM(虚拟机)

托管标识令牌(Microsoft Entra ID 签发)

OIDC 联邦凭证

AKS(容器)

Workload Identity 令牌

OIDC 联邦凭证

腾讯云(详见 3.6 节)

部署环境

原生身份证明

推荐认证方式

CVM(虚拟机)

无公开的实例身份签名机制

private_key_jwt / PCA 联邦凭证

TKE(容器)

ServiceAccount OIDC Token

OIDC 联邦凭证

华为云(详见 3.7 节)

部署环境

原生身份证明

推荐认证方式

ECS(虚拟机)

无公开的实例身份签名机制

private_key_jwt / PCA 联邦凭证

CCE(容器)

ServiceAccount OIDC Token

OIDC 联邦凭证

火山引擎(详见 3.8 节)

部署环境

原生身份证明

推荐认证方式

云服务器(虚拟机)

未见公开的实例身份签名机制

private_key_jwt / PCA 联邦凭证

VKE(容器)

ServiceAccount OIDC Token(IRSA)

OIDC 联邦凭证

线下 IDC 与自建环境(详见 3.9 节)

部署环境

原生身份证明

推荐认证方式

自建 Kubernetes 集群

ServiceAccount OIDC Token(集群签发)

OIDC 联邦凭证

自建机房 / 裸金属 / 通用服务器

无(需自建)

PCA 联邦凭证 / private_key_jwt

本地开发环境

无

private_key_jwt(开发期可用环境变量注入 secret)

CI/CD 流水线

平台 OIDC(如 GitHub Actions)或无

OIDC 联邦凭证 / private_key_jwt

选型一句话原则:优先使用部署环境的原生身份(PKCS#7 / OIDC / PLUGIN 联邦凭证,零静态凭证);环境不提供可验证的原生身份时,退而求其次使用 private_key_jwt 或 PCA(私钥不直接上线、可吊销);client_secret 类方式仅建议用于入门验证与开发期。

3.2 阿里云工作负载

阿里云是唯一拥有官方端到端最佳实践(ECS / ACK / 函数计算全覆盖)的云厂商,以下三个小节作为所有部署环境的参考实现,其余厂商与线下环境按同样的模式接入。

3.2.1 ECS(虚拟机)—— PKCS#7 联邦凭证

ECS 实例可通过实例元数据服务获取平台签发的实例身份文档及 PKCS#7 签名,签名由阿里云根证书背书,实例上无需保存任何密钥;获取签名时在 audience 中绑定目标 IDaaS 实例与签名时间,用于防重放。IDaaS 侧创建 PKCS#7 联邦信任源(信任来源选择"阿里云"),M2M 客户端应用添加联合凭证后,以签名作为 client_assertion(pkcs7-bearer)换取 AccessToken。

接入时注意:签名短时效,获取后应立即发起 Token 请求、不要缓存复用;信任条件可将准入收窄到指定地域等属性。完整操作步骤参见官方场景文档最佳实践:ECS 无静态凭据获取 STS Token。

3.2.2 ACK(容器)—— OIDC 联邦凭证(RRSA)

ACK 的 RRSA(Resource Role for ServiceAccount) 机制让 Pod 通过其 ServiceAccount 获得平台签发的 OIDC Token:安装 ack-pod-identity-webhook 组件后,令牌文件路径注入到容器环境变量 ALIBABA_CLOUD_OIDC_TOKEN_FILE,应用直接读取即可。IDaaS 侧创建 OIDC 联邦信任源(Issuer 填 ACK 集群的 OIDC 签发者地址,JWKS 自动发现或指定 URI),以该 Token 作为 client_assertion(id-token-bearer)换取 AccessToken;信任条件可限定命名空间与 ServiceAccount,实现 Pod 级权限隔离。

完整操作步骤参见官方场景文档最佳实践:ACK 无静态凭据获取 STS Token。该模式同样适用于自建 Kubernetes 集群,接入要点见 3.9.1 节。

3.2.3 函数计算 FC —— PLUGIN(OpenAPI 认证)

函数计算等托管运行时无法访问实例元数据服务、也不便挂载联邦凭证材料,但运行时自带阿里云角色凭证(STS)。PLUGIN 方式复用这份运行时凭证调用 IDaaS OpenAPI 换取 M2M AccessToken——对函数代码而言同样零静态凭证。函数的执行角色需具备调用 IDaaS OpenAPI 的 RAM 权限。

SDK 使用文档参见《IDaaS EIAM SDK》与《环境准备》。

3.3 AWS 工作负载

AWS 的典型工作负载为 EC2(虚拟机)与 EKS(容器);Lambda 等 Serverless 形态没有可供第三方验证的平台身份证明,建议使用 private_key_jwt(私钥经 KMS / Secrets Manager 加密后注入函数环境变量)。

3.3.1 EC2 —— PKCS#7 联邦凭证

AWS EC2 通过 IMDS(实例元数据服务,建议启用 IMDSv2)提供实例身份文档及 PKCS#7 签名,机制与阿里云 ECS 同源同类。IDaaS 的 PKCS#7 联邦信任源支持选择 AWS 作为信任来源,创建后以 EC2 实例身份签名作为 client_assertion(pkcs7-bearer)换取 AccessToken,请求形态与阿里云 ECS(3.2.1 节)一致。建议通过信任条件限定 AWS 账号 ID、区域等属性收窄准入面;官方端到端场景文档尚未发布,落地前请与阿里云 IDaaS 团队确认产品发布状态。

3.3.2 EKS —— OIDC 联邦凭证

EKS 集群原生暴露 OIDC 签发者与公开 JWKS 端点(IRSA 机制所依赖),可按 3.2.2 节 ACK 的同一模式接入:将 EKS 集群 OIDC Issuer 配置为 IDaaS OIDC 联邦信任源,Pod 以 ServiceAccount Token 作为 client_assertion(id-token-bearer)。信任条件可限定命名空间与 ServiceAccount。具体签发者与 JWKS 地址以集群配置为准。

3.4 GCP 工作负载

GCP 的虚拟机(GCE)与容器(GKE、Cloud Run)均基于服务账号体系签发 OIDC 令牌,统一以 OIDC 联邦凭证接入。

3.4.1 GCE(虚拟机)—— OIDC 联邦凭证

GCE 实例可从元数据服务器获取实例默认服务账号的 OIDC 身份令牌(audience 可指定),签发方可通过 Google 公开 JWKS 验证。接入方式:在 IDaaS 创建 OIDC 联邦信任源(Issuer 为 Google 身份服务地址,JWKS 从 Issuer 发现或指定 URI),实例以该身份令牌作为 client_assertion 完成 client_credentials 认证;信任条件可绑定实例相关的 claims。

3.4.2 GKE(容器)—— OIDC 联邦凭证

GKE 依托 Workload Identity 为工作负载提供平台签发的身份令牌。接入模式与 3.2.2 节一致:集群工作负载身份令牌作为 OIDC 联邦凭证断言提交 IDaaS。要求该令牌的签发者与 JWKS 可被 IDaaS 访问,具体以 GKE 集群配置为准。

3.5 Azure 工作负载

Azure 的虚拟机与 AKS 均提供 Microsoft Entra ID(原 Azure AD)签发的平台身份,统一以 OIDC 联邦凭证接入;Azure Functions 等托管服务同样支持托管标识。

3.5.1 VM(虚拟机)—— OIDC 联邦凭证(托管标识)

Azure VM 可开启托管标识(Managed Identity),应用通过实例元数据服务获取由 Microsoft Entra ID 签发的签名 JWT。接入方式:在 IDaaS 创建 OIDC 联邦信任源——Issuer 配置为租户的 Microsoft Entra ID 令牌签发地址,JWKS 从其公开发现端点获取,audiences 按托管标识令牌的 aud(即 resource 参数对应的资源标识)配置;实例以该令牌作为 client_assertion(id-token-bearer)完成认证。信任条件可绑定租户、资源等 claims。

3.5.2 AKS(容器)—— OIDC 联邦凭证(Workload Identity)

AKS 支持 Workload Identity 联合身份:集群暴露 OIDC 签发者与 JWKS 端点,Pod 以 ServiceAccount 令牌作为身份证明。接入模式与 3.2.2 节 ACK 一致:将 AKS 集群的 OIDC 签发者配置为 IDaaS OIDC 联邦信任源,令牌作为 client_assertion 提交,信任条件限定命名空间与 ServiceAccount。

3.6 腾讯云工作负载

腾讯云的典型工作负载为 CVM(虚拟机)与 TKE(容器);云函数 SCF 等 Serverless 形态与 CVM 同理,建议 private_key_jwt。

3.6.1 CVM(虚拟机)—— private_key_jwt / PCA 联邦凭证

腾讯云 CVM 未提供类似阿里云/AWS 的公开签名实例身份文档机制,无法使用 PKCS#7 联邦凭证。推荐:

  • private_key_jwt:私钥文件随部署分发(建议结合配置管理加密分发),公钥上传 IDaaS;私钥不出现在请求中,泄漏面可控

  • PCA 联邦凭证(已有企业 PKI 时优先):证书私钥泄漏后可通过 CRL 吊销,止损能力优于裸私钥

3.6.2 TKE(容器)—— OIDC 联邦凭证

TKE 支持为集群提供 ServiceAccount 令牌签发能力。若集群暴露 OIDC 签发者与 JWKS 端点,即可按 3.2.2 节 ACK 模式接入 IDaaS OIDC 联邦信任源。另外,IDaaS 已发布腾讯云云账号托管能力(参见《腾讯云身份管理》),可配合用于目标云侧的凭据管理。

3.7 华为云工作负载

华为云的典型工作负载为 ECS(虚拟机)与 CCE(容器)。

3.7.1 ECS(虚拟机)—— private_key_jwt / PCA 联邦凭证

与腾讯云 CVM 同理:华为云 ECS 元数据不提供可供第三方验证的公开实例身份签名(IAM 委托属资源级授权、不产生可携带的身份证明),推荐 private_key_jwt 或 PCA 联邦凭证。

3.7.2 CCE(容器)—— OIDC 联邦凭证

CCE 集群若配置了 ServiceAccount 令牌签发者(OIDC Issuer + JWKS),按 3.2.2 节 ACK 模式接入。华为云侧已有 IAM 身份中心与 IDaaS 的 SSO 集成文档(人员身份),机器身份侧按本文通用 OIDC 联邦凭证模式对接。

3.8 火山引擎工作负载

火山引擎的典型工作负载为云服务器(虚拟机)与 VKE(容器)。

3.8.1 云服务器(虚拟机)—— private_key_jwt / PCA 联邦凭证

截至本文更新时,火山引擎云服务器未提供公开、可由第三方验签的实例身份文档机制(以官方文档为准),无法使用 PKCS#7 联邦凭证,推荐 private_key_jwt 或 PCA 联邦凭证,做法与腾讯云 CVM(3.6.1 节)相同。

3.8.2 VKE(容器)—— OIDC 联邦凭证(IRSA)

火山引擎容器服务 VKE 支持 IRSA(IAM Roles for Service Accounts)能力,可为 Pod 签发 ServiceAccount OIDC Token 并暴露签发者与 JWKS 端点(参见火山引擎 IRSA 概述)。接入模式与 3.2.2 节 ACK 一致:将 VKE 集群的 OIDC 签发者配置为 IDaaS OIDC 联邦信任源,Pod 以 ServiceAccount Token 作为 client_assertion(id-token-bearer)完成认证,信任条件限定命名空间与 ServiceAccount。

3.9 线下 IDC 与自建环境

线下 IDC 与自建环境没有云平台背书的原生身份,需要自建信任根——唯一的例外是自建 Kubernetes 集群:K8s 自身具备 ServiceAccount 令牌签发能力,仍可走 OIDC 联邦凭证。

3.9.1 自建 Kubernetes 集群 —— OIDC 联邦凭证

标准 Kubernetes 集群原生具备 OIDC 身份签发能力:kube-apiserver 按 ServiceAccount 令牌签发参数为 Pod 签发受限令牌(bound token)——由集群密钥签名、包含 iss / aud / exp / 命名空间 / ServiceAccount 名称等 claims 的 JWT。接入步骤:

  1. 集群侧:为 kube-apiserver 配置 ServiceAccount 令牌签发参数(--service-account-issuer、--service-account-signing-key-file 等),并将 JWKS 端点(apiserver 的 /.well-known/openid-configuration 与 /openid/v1/jwks)发布到 IDaaS 可访问的地址(该端点默认仅集群内可达,通常经反向代理或对象存储外发)

  2. IDaaS 侧:创建 OIDC 联邦信任源,Issuer 填集群签发者地址,JWKS 选择静态上传或指定 JWKS URI

  3. 应用侧:读取挂载的 ServiceAccount Token(ServiceAccount Token 投影卷)作为 client_assertion(id-token-bearer),模式与 3.2.2 节 ACK 一致

  4. 信任条件限定命名空间与 ServiceAccount,实现集群内多业务的权限隔离

3.9.2 自建机房 / 裸金属 / 通用服务器 —— PCA 或 private_key_jwt

线下环境没有平台背书的原生身份,需要自建信任根。PCA 联邦凭证适用于已有企业 PKI 或高合规要求的场景:客户端证书与中间证书链随请求提交,IDaaS 用上传的私有 CA 根证书验证证书链并支持 CRL 吊销检查,私钥泄漏后可立即吊销止损。private_key_jwt 适用于无 PKI、快速接入的场景:RSA-2048 私钥本地保管,公钥 PEM 上传 IDaaS。安全优先级上 PCA 优于裸私钥——后者泄漏后只能靠轮换密钥被动应对。

3.9.3 本地开发环境

开发期首选 private_key_jwt(私钥放本地环境变量,杜绝 secret 进代码库);快速验证可用 client_secret,但 secret 必须通过环境变量注入、禁止写入代码与配置文件提交。使用 SDK 配置文件切换环境,可保证开发/生产认证方式平滑迁移。

3.9.4 CI/CD 流水线

平台支持 OIDC(如 GitHub Actions 的 IdP 令牌)时,用平台签发的 OIDC 令牌作断言走 OIDC 联邦凭证,零静态凭证;平台无 OIDC 时用 private_key_jwt——私钥存平台 Secrets 注入,公钥在 IDaaS,泄露后可在 IDaaS 删除公钥止损。

3.10 弹性伸缩场景(ECS + ESS 等):动态工作负载如何认证

云 VM 常与弹性伸缩搭配使用——以阿里云 ECS + ESS(弹性伸缩)为例,伸缩组按负载动态创建和回收实例。传统静态 AK 模式下,每台新扩容实例都要获得一份 AK(随自定义镜像或启动脚本分发),凭证泄漏面随扩容线性放大,且所有实例共用同一 AK、审计无法区分调用来源。

联邦凭证天然适配弹性伸缩,核心在于信任锚不在单台实例上:

维度

静态 AK 模式

联邦凭证模式(PKCS#7 / OIDC)

新实例获得凭证

镜像/启动脚本分发 AK,泄漏面随扩容放大

启动后自动从本机元数据服务获取身份证明,无需分发任何密钥

信任建立方式

保存共享密钥

云厂商根证书 / 平台 JWKS 验签 + 信任条件

实例级可识别性

多实例共用同一 AK,无法区分

每台实例的断言携带本机实例 ID / Pod 标识,可审计到具体实例

扩缩容改造

需要凭证分发机制配合

零改造,应用代码不变

ECS + ESS 场景的接入要点:

  1. 信任条件禁止绑定实例 ID:伸缩组扩缩容时实例 ID 随时变化,把信任条件写死到实例 ID 会导致新扩容的实例认证被拒绝。推荐做法是将信任条件绑定到镜像 ID——每个业务维护一个自定义镜像,同一业务的全部伸缩实例天然共享该镜像,准入范围稳定且按业务隔离

  2. 备选:切换到 PLUGIN(OpenAPI 认证)方案:为伸缩组启动模板统一挂载 ECS 实例 RAM 角色,新实例启动即自动获得角色凭证;应用以 PLUGIN 方式复用该角色凭证调用 IDaaS OpenAPI 换取 AccessToken,同样零静态凭证,且无需为镜像做额外的信任条件配置

  3. Token 请求时实时获取签名(PKCS#7 方案):每次请求 AccessToken 前从元数据服务拉取本机身份签名并立即提交(签名本身短时效,本就不应缓存复用);使用 IDaaS SDK 时配置 clientDeployEnvironment=ALIBABA_CLOUD_ECS,SDK 自动按需获取

  4. 伸缩配置不含任何凭证:启动模板 / 自定义镜像中仅部署业务程序与 SDK 配置文件(不含密钥的非敏感配置)

  5. 审计追溯到实例:IDaaS 审计日志记录每次认证使用的凭证标识(含签名中的实例信息),扩容实例与存量实例的调用可区分

镜像 ID 绑定与 PLUGIN + 实例角色两种方案同样适用于其他云的弹性伸缩:AWS EC2 + Auto Scaling Group 可将信任条件绑定到 AMI ID(PKCS#7),GCP 托管实例组与 Azure 虚拟机规模集基于托管身份令牌自动可用(OIDC);容器场景的 HPA / Cluster Autoscaler 天然按 ServiceAccount 隔离,OIDC 联邦凭证零接触。

说明

注意:private_key_jwt / PCA 类环境(腾讯云、华为云、火山引擎的 VM 及线下环境)的弹性伸缩需要单独设计密钥分发——私钥须通过加密镜像、配置管理系统(如 Vault)或启动时安全拉取等方式注入新实例,并具备吊销/轮换预案。若业务允许,此类场景建议优先将负载迁移至容器平台,改用 OIDC 联邦凭证,彻底免除密钥分发问题。

4. 获取阿里云 STS Token(IDaaS 云账号托管路径)

说明

本章描述目标云为阿里云的标准路径:AccessToken → IDaaS DeveloperAPI → 阿里云 STS Token。所有部署环境章节拿到 AccessToken 后,均按本章统一流程获取 STS Token。该路径同样支持 AWS 与腾讯云——通过同一接口为托管的 AWS / 腾讯云云角色获取对应的临时访问凭证(awsStsToken / tencentCloudStsToken),流程与参数完全一致;本章以阿里云为例展开说明。

4.1 前置条件

前置条件

说明

机器身份管理能力已开通

实例已开通 IDaaS 机器身份管理相关能力

云账号已托管

在 IDaaS 控制台 资产管理 > 云身份 添加阿里云云账号,并创建/同步云角色(RAM 角色)

PAM 功能授权

应用需具备内置 PAM 应用"获取云角色访问凭证"的功能授权

scope 授权

M2M 服务端应用将权限 cloud_account_role:obtain_access_credential(受众 urn:cloud:idaas:pam)授予客户端应用,Token 请求携带 scope=urn:cloud:idaas:pam|cloud_account_role:obtain_access_credential。

4.2 调用 ObtainCloudAccountRoleAccessCredential

curl -s --request GET \
  --url "https://eiam-developerapi.<region>.aliyuncs.com/v2/<instanceId>/cloudAccountRoles/_/actions/obtainAccessCredential?cloudAccountRoleExternalId=acs:ram::<阿里云账号ID>:role/<RAM角色名>&durationSeconds=3600" \
  --header "Authorization: Bearer <AccessToken>"

参数

必填

说明

instanceId(路径)

是

IDaaS 实例 ID

Authorization(头)

是

Bearer <AccessToken>,即前述部署环境章节获取的 M2M AccessToken

cloudAccountRoleExternalId

是

云角色业务标识,阿里云为 RAM 角色 ARN(如 acs:ram::13xxxxxx76:role/role-test)

durationSeconds

否

STS Token 有效期(秒),范围 900~43200,实际受云厂商上限约束

辅助接口 GET /v2/{instanceId}/cloudAccountRoles/_/actions/listAssumableCloudAccountRoles(NextToken 游标分页)可列出当前身份可扮演的云角色,用于角色发现。

4.3 响应结构与字段

{
  "cloudAccountId": "ca_01kmegjc11qa1txxxxx",
  "cloudAccountRoleId": "carole_01kmek49aqxxxx",
  "cloudAccountRoleName": "role-test",
  "cloudAccountRoleExternalId": "acs:ram::xxx:role/role-test",
  "cloudAccountVendorType": "alibaba_cloud",
  "cloudAccountRoleAccessCredential": {
    "accessCredentialExpiresAt": 1767196800,
    "alibabaCloudStsToken": {
      "accessKeyId": "STS.NUgYrLnoC37mZZCNnAbez****",
      "accessKeySecret": "****",
      "securityToken": "****",
      "expiration": "2026-10-20T04:27:09Z"
    }
  }
}

字段

说明

cloudAccountRoleAccessCredential.alibabaCloudStsToken

阿里云 STS 三段式凭证:accessKeyId + accessKeySecret + securityToken,调用阿里云 OpenAPI 时三者必须同时传递

accessCredentialExpiresAt

凭证过期时间(Unix 秒级时间戳),应用应据此提前刷新

cloudAccountVendorType

云账号类型(本文场景为 alibaba_cloud;接口同样支持返回 AWS/腾讯云等厂商凭证结构,供多云扩展使用)

4.4 凭证使用与刷新建议

  • 缓存与刷新:在过期前(如提前 5 分钟)重新调用本接口刷新,避免每次云 API 调用都换取新凭证

  • 传递给 SDK:将三段式凭证填入阿里云 SDK 的 CredentialsProvider(STS 模式),SDK 会自动带 SecurityToken 签名

  • 有效期取短:durationSeconds 按业务单次任务时长取最小值,默认建议 3600 以内

4.5 SDK 方式(推荐)

IDaaS 提供专门的适配 SDK,自动完成"认证 → 取 AccessToken → 换 STS → 缓存刷新"全链路:

SDK

坐标(Java / Python)

职责

IDaaS Core SDK

com.cloud-idaas:idaas-java-core-sdk / cloud-idaas-core

M2M 认证、令牌获取与刷新

IDaaS Akless Alibabacloud Adapter

com.cloud-idaas:idaas-java-akless-alibabacloud-adapter / cloud-idaas-akless-alibabacloud-adapter

无 AK 场景适配器:获取托管云角色的阿里云临时访问凭证

配合 Core SDK 的部署环境配置(clientDeployEnvironment=ALIBABA_CLOUD_ECS 对应 PKCS7、KUBERNETES 对应 OIDC),SDK 会按环境自动选择联邦凭证材料,业务代码无需感知环境差异。

5. 安全最佳实践

实践

说明

scope 最小化

仅授予业务所需的 受众\|权限,避免 .all 类宽授权;不同业务拆分独立 M2M 客户端应用

信任条件收窄

联邦凭证上配置 trustCondition/verificationCondition,将准入绑定到实例 ID、地域、命名空间、ServiceAccount、证书主题等具体属性,防横向扩散

网络范围限制

M2M 客户端应用配置网络范围(指定出口 IP/网段),VPC 网络内的调用按网络区域策略管控

凭证有效期取短

AccessToken 与 STS Token 有效期按需取短;PKCS#7 签名获取后立即使用,不落盘、不复用

audience 绑定

实例身份 audience 中 aud 固定填写 IDaaS 实例 ID,防签名跨实例重放

私钥类止损预案

private_key_jwt / PCA 场景:预演私钥泄漏处置(删除 IDaaS 侧公钥 / CRL 吊销证书),确保止损路径畅通

审计留痕

所有 Token 签发与云角色凭证获取行为进入 IDaaS 审计日志,联邦凭证认证会记录使用的凭证 ID(含断言 jti / 证书序列号)与关键 claims(手机号、邮箱脱敏)

附录 A:官方文档与 SDK 索引

主题

链接

ECS 无静态凭据场景(PKCS#7 端到端)

最佳实践:ECS 无静态凭据获取 STS Token

ACK 无静态凭据场景(RRSA + OIDC 端到端)

最佳实践:ACK 无静态凭据获取 STS Token

通过M2M无AK访问云资源配置流程

通过M2M无AK访问云资源配置流程

M2M 应用(机器间权限管理)

M2M 应用(机器间权限管理)

获取云角色的临时访问凭证(API)

获取云角色的临时访问凭证(API)

云身份管理总览

云身份管理总览

AWS 云身份管理

AWS 云身份管理

腾讯云身份管理

腾讯云身份管理

IDaaS EIAM SDK 总览

IDaaS EIAM SDK 总览

SDK 环境准备(认证方式配置)

SDK 环境准备(认证方式配置)

火山引擎 VKE IRSA 概述(外部文档)

火山引擎 VKE IRSA 概述(外部文档)

Azure 托管标识(外部文档)

Azure 托管标识(外部文档)

附录 B:常见问题

Q1:令牌端点在哪里查看? M2M 应用详情 > 通用配置 > 应用配置信息 > 令牌端点。实例级端点格式为 https://<实例ID>.aliyunidaas.com/api/v2/{authorizationServerId}/oauth2/token,默认授权服务器为 iauths_system。

Q2:scope 报错"scope required"或"未授权"怎么办?client_credentials 请求必须携带 scope,且格式为 <受众标识>|<权限标识>;同时需确认 M2M 服务端应用已将该权限授予你的客户端应用。

Q3:PKCS#7 认证报"签名时间校验失败"? 签名时间超出有效期窗口或为未来时间。获取签名后立即发起请求,不要缓存复用;检查实例时钟偏差。

Q4:OIDC 联邦凭证的 JWKS 如何配置? 三种来源任选:静态上传 JWKS / 从 Issuer 自动发现 / 指定 JWKS URI。集群类平台通常用 Issuer 自动发现或指定 JWKS URI。

Q5:PCA 认证需要提供哪些材料? 请求中提交 client_x509(客户端证书,仅支持一张)、client_x509_chain(中间证书链)、client_assertion(证书私钥签名的 JWT,audience 需包含 client_id 与令牌端点);IDaaS 侧需上传私有 CA 根证书作为信任锚。

Q6:多云(AWS/腾讯云等)目标云的 STS 获取是否支持?ObtainCloudAccountRoleAccessCredential 接口的凭证结构已覆盖阿里云、AWS、腾讯云、华为云、GCP、Entra ID 六类云厂商;本文聚焦阿里云目标云,多云场景请关注 IDaaS 云身份管理相关文档的持续更新。

Q7:函数计算上为什么不用联邦凭证? 托管 Serverless 运行时无法访问实例元数据/挂载证书,但自带角色凭证。PLUGIN 方式复用运行时凭证走 OpenAPI 认证,同样实现零静态凭证。