阿里云容器服务 Kubernetes 版(ACK)集群应用访问阿里云资源时,传统固定访问密钥(AK/SK)方式导致凭证生命周期管理复杂且存在长期泄露风险。本方案通过 IDaaS 集成实现基于 OIDC 的联合身份认证,建立服务账号与 RAM 角色映射关系,使应用能够获取基于角色的临时安全令牌(STS Token),消除长期凭证存储需求,实现细粒度权限控制和自动化凭证轮转。
业务背景
在容器化应用架构中,ACK 集群内的应用需要安全访问阿里云资源(如对象存储、数据库等)。传统使用固定 AK/SK 的方式存在以下痛点:
长期凭证存储在应用配置中,存在泄露风险
凭证轮转复杂,需要应用重启或重新部署
权限粒度粗放,难以实现基于应用或 Pod 的细粒度授权
凭证生命周期管理困难,缺乏有效的审计追踪机制
本方案通过 IDaaS 实现联合身份认证,将 Kubernetes 服务账号(ServiceAccount)与阿里云 RAM 角色关联,使应用能够获取 STS Token,解决上述问题,实现安全、灵活的云资源访问控制。
方案架构
本方案采用三阶段 Token 交换架构,实现从 Kubernetes 服务账号到阿里云资源访问权限的安全映射。
ACK OIDC Token 获取:Pod 中的应用通过 ACK RRSA 机制获取与特定 ServiceAccount 绑定的 OIDC Token。
M2M Token 交换:应用使用 ACK OIDC Token 向 IDaaS 交换 M2M Token,IDaaS 验证 OIDC Token 有效性并确认应用身份。
STS Token 获取:应用使用 M2M Token 调用 RAM AssumeRoleWithOIDC API,获取具有指定权限的 STS Token。
实施步骤
准备工作
在开始实施前,请确保满足以下条件:
创建 M2M 客户端应用
创建 M2M 客户端应用用于应用接入 IDaaS 时的身份验证。此应用代表集群中需要访问云资源的应用实体,每个需要独立权限的应用应创建单独的 M2M 客户端应用。
访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台。
导航至。
单击添加应用,填写应用名称(本文档中设置为
M2M_Client)。在客户端权限管理页签中开启自定义权限开关。
创建 M2M 服务端应用
创建 M2M 服务端应用用于 IDaaS 接入 RAM 时的身份验证。M2M 服务端应用通常只需创建一个,可关联多个客户端应用并为不同应用分配不同权限。
访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台。
导航至。
单击添加应用,填写应用名称(本文档中设置为
M2M_Server)。单击服务端权限开放页签。
单击权限应用下的服务端权限开放开关按钮。
受众标识:受众标识是 M2M 服务端应用的唯一标识,录入后不可修改。应用向 IDaaS 获取权限时,scope 参数中需通过
受众标识|权限标识来获取指定服务端的指定权限。本文档设置为api://ram.aliyun.com。
单击权限管理下的添加权限。如有多个权限,可重复操作。
权限名称:权限标识的名称,仅用作控制台页面展示,不作为实际认证参数。本文档设置为
RAM_STS_Token。权限标识:权限标识是应用权限的唯一标识。应用向 M2M 服务端应用获取权限时,scope 参数中需通过
受众标识|权限标识来获取指定服务端的指定权限。本文档设置为ram:sts。
在授权应用下单击 M2M 客户端应用
M2M_Client的开关按钮,将 M2M 客户端应用关联至 M2M 服务端应用。如有多个 M2M 客户端应用,可重复操作。在权限列表下勾选名称为
RAM_STS_Token的权限。完成配置。
配置 ACK 为 OIDC 联邦信任源
将 ACK 集群配置为 IDaaS 的 OIDC 联邦信任源。
访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台。
导航至。
单击新增联邦信任源,选择 OIDC 选项。
填写配置参数:
联邦信任源名称:本文档设置为
oidc_ack。网络端点:本文档中选择共享端点。IDaaS 将使用网络端点地址访问“Issuer”地址,按照 OIDC 协议获取公钥。
信任来源:本文档中选择Issuer地址解析。
Issuer:身份提供方标识。从 ACK 集群信息中获取“提供商 URL”后填入。获取方式可参考获取集群中OIDC提供商的URL和ARN信息。
受众标识:
sts.aliyuncs.com(ACK 固定值)。信任条件:使用条件表达式对 ACK 做进一步认证。可选,本文档中不使用。如有需要,可参考联邦凭证表达式的使用进行填写。
完成配置。
创建 IDaaS 联邦凭证
为应用创建联邦凭证,用于获取 M2M Token。
访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台。
导航至。
找到
M2M_Client应用,单击管理。在中选择 OIDC凭证类型,。
单击新增联邦凭证,填写配置:
联邦信任源:选择
oidc_ack。联邦凭证名称:本文档设置为
oidc_ack_credential。应用在获取 M2M Token 时需要传入该名称。校验条件模式:选择kubernetes模式。
命名空间:容器 Pod 部署的命名空间。本文档中使用
default。Kubernetes 中默认命名空间为default,可以根据实际情况填写。服务账号:部署应用的容器 Pod 使用的服务账号(ServiceAccount)。本例中使用
default。Kubernetes 中默认服务账号为default,可以根据容器 Pod 实际情况填写。
完成配置。
创建 RAM OIDC 身份提供商及角色
在 RAM 中创建 OIDC 身份提供商和角色,用于验证 IDaaS 身份并授予云资源访问权限。
创建 OIDC 身份提供商,关键配置项如下。详细步骤参考创建OIDC身份提供商。
颁发者 URL:填写 M2M 服务端应用的 Issuer。在
M2M_Server应用(本文档中创建)中查看(进入 M2M 管理页面,在下的 Issuer 项)。客户端 ID:填写 M2M 服务端应用的受众标识,本例中为
api://ram.aliyun.com。
创建 OIDC 身份提供商角色,详细步骤参考创建OIDC身份提供商角色。推荐为不同应用创建独立的角色,实现权限最小化原则。
oidc:iss :填写 M2M 服务端应用的 Issuer。自动从 OIDC 身份提供商中带入,不需要修改。
oidc:aud:填写 M2M 服务端应用的受众标识。自动从 OIDC 身份提供商中带入,不需要修改。
(可选)新增条件,创建多个角色时使用,每个角色设置不同的
oidc:sub值。条件键:
oidc:sub,运算符:
StringEquals,条件值:M2M 客户端应用的
client_id。进入目标 M2M 客户端应用管理页面,在下查看。
为 OIDC 身份提供商角色授权,应用获取到指定 OIDC 身份提供商角色的临时凭证后即可在权限范围内访问阿里云资源。详细步骤参考角色授权。
配置ACK RRSA 功能
启用 ACK RRSA 功能。Kubernetes 通过 ServiceAccount 划分权限,可以为每个 Pod 设置不同 ServiceAccount,以实现 Pod 之间的权限隔离。
ACK 集群开启 RRSA。详细配置可参考通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
ACK 集群安装
ack-pod-identity-webhook组件。详细配置可参考组件。为
default命名空间增加标签(labels)pod-identity.alibabacloud.com/injection: 'on'。为
default服务账户增加注解(annotations)pod-identity.alibabacloud.com/role-name: default。说明仅用于 RRSA 匹配需向集群注入环境变量,
pod-identity.alibabacloud.com/role-name的值不影响认证过程。
验证步骤
获取 ACK OIDC Token
在命名空间
default中创建serviceAccountName为default的Pod。在 Pod 命令行中执行
cat $(echo $ALIBABA_CLOUD_OIDC_TOKEN_FILE),模拟应用获取 ACK OIDC Token。
获取 M2M 客户端 Token
在 Pod 中执行curl命令,模拟应用从 IDaaS 中获取 M2M Token。
url:
进入 M2M 管理页面,从下的 令牌端点 项获取。
header 参数:
参数 | 类型 | 说明 | 示例 |
Content-Type | String | 固定值:application/x-www-form-urlencoded | application/x-www-form-urlencoded |
请求参数:
参数 | 类型 | 说明 | 示例 |
grant_type | String | 固定值:client_credentials | client_credentials |
client_id | String | M2M 客户端应用的 client_id | 进入目标 M2M 客户端应用管理页面,在下的 client_id 项 |
client_assertion_type | String | 客户端assertion类型,固定值:urn:cloud:idaas:params:oauth:client-assertion-type:id-token-bearer | urn:cloud:idaas:params:oauth:client-assertion-type:id-token-bearer |
client_assertion | String | ACK OIDC Token | |
scope | String | 指定申请的权限。格式为: | api://ram.aliyun.com|ram:sts |
application_federated_credential_name | String | 联邦凭证名称 | oidc_ack_credential |
cURL 请求示例:
curl --request POST \
--url <token_endpoint_url> \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id=<m2m-client-id>' \
--data-urlencode 'client_assertion_type=urn:cloud:idaas:params:oauth:client-assertion-type:id-token-bearer' \
--data-urlencode 'client_assertion=<ack_oidc_token>' \
--data-urlencode 'scope=api://ram.aliyun.com|ram:sts' \
--data-urlencode 'application_federated_credential_name=oidc_ack_credential'获取 RAM 角色 STS Token
使用阿里云 OpenAPI 调试工具,模拟应用从 RAM 中获取 STS Token。
OpenAPI 调试工具地址:OpenAPI 调试工具。
关键请求参数如下:
OIDCProviderArn:创建 RAM OIDC 身份提供商及角色中创建的 OIDC 身份提供商的 ARN,进入对应 OIDC 身份提供商页面即可查看。
RoleArn:创建 RAM OIDC 身份提供商及角色中创建的 OIDC 身份提供商角色的 ARN,进入对应 OIDC 身份提供商角色页面即可查看。
OIDCToken:获取 M2M 客户端 Token中获取到的 M2M Token。
RoleSessionName:角色会话名称,用户自定义参数,建议设置成用户名即可。