面向部署在 ACK 集群中的应用,基于 ACK RRSA 注入的 OIDC Token 完成联邦认证并结合 PAM 授权,实现免静态凭据访问,自动换取指定 RAM 云角色的 STS 临时凭证。
原理介绍
部署在 ACK Pod 中的 M2M Client 应用调用 IDaaS SDK。SDK 从 ACK RRSA 注入的 Kubernetes ServiceAccount OIDC Token 完成该 M2M Client 应用的联邦认证;随后使用认证 Token 调用 PAM,获取目标云角色的 STS 临时凭证。应用无需保存 Client Secret 或长期 AccessKey。
使用前提
已开通 IDaaS EIAM 的机器身份管理和特权管理能力。
已具备 RAM 管理权限,并已确定目标 RAM 角色需要访问的最小权限。
已创建 ACK 托管集群(版本 1.22 及以上)且具备 ACK 管理权限。
业务 Pod 可访问 EIAM 实例的公网域名。
参考资料
配置步骤
步骤 1:在资产管理中添加云账号和系统云角色
进入 IDaaS EIAM 控制台的资产管理 > 云身份,添加目标阿里云账号。按照控制台引导完成身份提供商、系统云角色和检测项配置,确认云账号和系统云角色均处于“可用”状态。
步骤 2:添加最终获取 STS 的目标云角色
在已托管云账号的云角色管理中添加目标 RAM 角色。确认该云角色处于“启用”和“可用”状态;RAM 侧的角色信任策略按 IDaaS 控制台引导信任对应身份提供商,角色权限策略仅授予业务所需资源权限。
步骤 3:创建 M2M Client 并配置 ACK OIDC 联邦凭证
已有 ACK联邦信任源时,可直接在创建应用联邦凭证的时候选用,不需要为每个 M2M Client 新建。
在左侧导航栏单击M2M应用管理。
单击添加应用,选择OIDC with M2M应用类型。
填写应用名称等基本信息,完成创建并记录
client_id。
3.1 启用 ACK RRSA 并为 Pod 注入 OIDC Token
在 ACK 集群详情的 基本信息 页签,进入 安全与审计,开启 RRSA OIDC,等待集群状态恢复为运行中。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择组件管理。
在组件管理页面,找到
ack-pod-identity-webhook组件,单击组件右下方的立即安装。创建或配置 RRSA RAM 角色:该角色信任集群的 OIDC 身份提供商,并将
oidc:sub限制为system:serviceaccount:<namespace>:<serviceaccount>。该角色仅用于触发 RRSA 注入,不替代 PAM 中的目标云角色。为业务 namespace 添加标签
pod-identity.alibabacloud.com/injection: 'on';在业务 ServiceAccount 上添加注解pod-identity.alibabacloud.com/role-name: <rrsa-ram-role-name>。部署业务 Pod 后,执行
kubectl -n <namespace> get pod <pod-name> -o yaml,确认已注入ALIBABA_CLOUD_OIDC_TOKEN_FILE环境变量和rrsa-oidc-token挂载。
3.2 创建或选择 ACK OIDC 联邦信任源
进入 ,新增 OIDC 类型的联邦信任源。
单击新增联邦信任源,选择 OIDC 选项。
填写配置参数:
联邦信任源名称:本文档设置为
aliyun_ack。网络端点:本文档中选择共享端点。IDaaS 将使用网络端点地址访问“Issuer”地址,按照 OIDC 协议获取公钥。
信任来源:本文档中选择Issuer地址解析。
Issuer:身份提供方标识。从 ACK 集群信息中获取“提供商 URL”后填入。
受众标识:
sts.aliyuncs.com(ACK 固定值)。信任条件:使用条件表达式对 ACK 做进一步认证。可选,本文档中不使用。如有需要,可参考联邦凭证表达式的使用进行填写。
完成配置。
3.3 为 M2M Client 创建 OIDC 应用联邦凭证
导航至。
找到 M2M Client 应用,单击管理。
在通用配置 > 认证管理中选择 OIDC 认证类型。
单击新增联邦凭证,填写配置:
联邦信任源:选择
aliyun_ack。联邦凭证名称:本文档设置为 ack-oidc-credential。应用在获取 M2M Token 时需要传入该名称;必须与 client-config.json 的 applicationFederatedCredentialName 完全一致。
校验条件模式:选择kubernetes模式。
命名空间:容器 Pod 部署的命名空间。本文档中使用
default。Kubernetes 中默认命名空间为default,可以根据实际情况填写。服务账号:部署应用的容器 Pod 使用的服务账号(ServiceAccount)。本例中使用
default。Kubernetes 中默认服务账号为default,可以根据容器 Pod 实际情况填写。
完成配置。
步骤 4:授予 PAM 功能权限
在左侧导航栏单击权限中心,再选择功能权限管理。
在功能权限管理页面搜索
Privileged Access Management应用,单击授权管理。选择应用授权;在被授权应用中选择步骤 3 创建的 M2M Client,在选择权限中搜索并授予“获取云角色访问凭证(
cloud_account_role:obtain_access_credential)”。
步骤 5:授予云角色数据权限
在左侧导航栏单击权限中心,再选择数据权限管理。
添加授权规则,填写授权规则基础信息后完成创建。
选择刚创建的授权规则,单击权限管理。
在关联身份页签选择应用,选择步骤 3 创建的 M2M Client。
在资产管理页签选择云角色,单击添加资产,选择步骤 2 中最终获取 STS Token 的目标云角色。
步骤 6:下载并引入 IDaaS SDK
在 GitHub 上获取最新版 IDaaS SDK;当前支持 Java 和 Python。
按 SDK README 完成依赖配置。
步骤 7:录入 SDK 配置文件
创建
client-config.json,默认可放在~/.cloud_idaas/client-config.json。在 GitHub 上找到
IDaaS Core SDK。在对应的SDK Github 中,查看对应
README.md或README_zh.md文件,在文件中找到OIDC client-config.json 示例,复制示例配置到刚创建的client-config.json中;示例如下:
{
"idaasInstanceId": "idaas_xxx",
"clientId": "app_xxx",
"issuer": "https://xxx/api/v2/iauths_system/oauth2",
"tokenEndpoint": "https://xxx/api/v2/iauths_system/oauth2/token",
"scope": "urn:cloud:idaas:pam|cloud_account_role:obtain_access_credential",
"openApiEndpoint": "eiam.[region_id].aliyuncs.com",
"developerApiEndpoint": "eiam-developerapi.[region_id].aliyuncs.com",
"authnConfiguration": {
"identityType": "CLIENT",
"authnMethod": "OIDC",
"applicationFederatedCredentialName": "ack-oidc-credential",
"clientDeployEnvironment": "KUBERNETES",
"oidcTokenFilePathEnvVarName": "ALIBABA_CLOUD_OIDC_TOKEN_FILE"
},
"httpConfiguration": {
"connectTimeout": 5000,
"readTimeout": 10000
}
}配置项 | 值 | 说明 |
|
| 对应 IDaaS 实例 ID。 |
|
| 步骤 3 创建的 M2M Client 的 |
|
| 将 |
|
| IDaaS Token 端点。 |
| 固定值,见上方 JSON 配置。 | PAM 获取云角色访问凭证的 scope。 |
|
| 可选; |
|
| 必填; |
| ||
└ |
| 固定值。 |
└ |
| 固定值;使用 OIDC 联邦认证。 |
└ |
| 步骤 3.3 创建的应用联邦凭证名称。 |
└ |
| 固定值;表示应用部署在 Kubernetes Pod 中。 |
└ |
| 固定值;SDK 从该环境变量指定的实际 Token 文件路径读取 OIDC Token。 |
| ||
└ |
| 建立连接的最长等待时间,单位:毫秒。 |
└ |
| 连接建立后等待服务端响应的最长时间,单位:毫秒。 |
步骤 8:代码接入
按 SDK 快速开始完成以下操作:
初始化 IDaaS Core SDK。
传入目标云角色 ARN,创建阿里云凭证提供器。
获取 STS 临时凭证。
public static void main(String[] args) {
// 1. 初始化 IDaaS Core SDK
IDaaSCredentialProviderFactory.init();
// 2. 创建阿里云凭证提供器
AlibabaCloudCredentialsProvider credentialsProvider =
IDaaSPamAklessCredentialFactory.getAlibabaCloudCredentialsProvider(
"acs:ram::123456789:role/your-role-name"
);
// 3. 获取凭证
CredentialModel credentials = credentialsProvider.getCredentials();
System.out.println(credentials.getAccessKeyId());
System.out.println(credentials.getAccessKeySecret());
System.out.println(credentials.getSecurityToken());
}验证顺序
确认 RRSA 已向业务 Pod 注入
ALIBABA_CLOUD_OIDC_TOKEN_FILE和rrsa-oidc-token挂载。将步骤 7 的配置文件放在默认路径
~/.cloud_idaas/client-config.json。部署使用步骤 3.3 中 namespace 和 ServiceAccount 的业务 Pod。
在 Pod 中运行应用,确认可以获取 STS 临时凭证。
使用临时凭证调用已被目标云角色权限策略允许的云产品 API。