通过 IDaaS M2M 在 ACK 中实现无静态凭据获取 STS Token

更新时间:
复制为 MD 格式

阿里云容器服务 Kubernetes 版(ACK)集群应用访问阿里云资源时,传统固定访问密钥(AK/SK)方式导致凭证生命周期管理复杂且存在长期泄露风险。本方案通过 IDaaS 集成实现基于 OIDC 的联合身份认证,建立服务账号与 RAM 角色映射关系,使应用能够获取基于角色的临时安全令牌(STS Token),消除长期凭证存储需求,实现细粒度权限控制和自动化凭证轮转。

业务背景

在容器化应用架构中,ACK 集群内的应用需要安全访问阿里云资源(如对象存储、数据库等)。传统使用固定 AK/SK 的方式存在以下痛点:

  • 长期凭证存储在应用配置中,存在泄露风险

  • 凭证轮转复杂,需要应用重启或重新部署

  • 权限粒度粗放,难以实现基于应用或 Pod 的细粒度授权

  • 凭证生命周期管理困难,缺乏有效的审计追踪机制

本方案通过 IDaaS 实现联合身份认证,将 Kubernetes 服务账号(ServiceAccount)与阿里云 RAM 角色关联,使应用能够获取 STS Token,解决上述问题,实现安全、灵活的云资源访问控制。

方案架构

image

本方案采用三阶段 Token 交换架构,实现从 Kubernetes 服务账号到阿里云资源访问权限的安全映射。

  1. ACK OIDC Token 获取:Pod 中的应用通过 ACK RRSA 机制获取与特定 ServiceAccount 绑定的 OIDC Token。

  2. M2M Token 交换:应用使用 ACK OIDC Token 向 IDaaS 交换 M2M Token,IDaaS 验证 OIDC Token 有效性并确认应用身份。

  3. STS Token 获取:应用使用 M2M Token 调用 RAM AssumeRoleWithOIDC API,获取具有指定权限的 STS Token。

实施步骤

准备工作

在开始实施前,请确保满足以下条件:

创建 M2M 客户端应用

创建 M2M 客户端应用用于应用接入 IDaaS 时的身份验证。此应用代表集群中需要访问云资源的应用实体,每个需要独立权限的应用应创建单独的 M2M 客户端应用。

  1. 访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台

  2. 导航至应用管理 > M2M应用管理

  3. 单击添加应用,填写应用名称(本文档中设置为 M2M_Client)。

  4. 客户端权限管理页签中开启自定义权限开关。

创建 M2M 服务端应用

创建 M2M 服务端应用用于 IDaaS 接入 RAM 时的身份验证。M2M 服务端应用通常只需创建一个,可关联多个客户端应用并为不同应用分配不同权限。

  1. 访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台

  2. 导航至应用管理 > M2M应用管理

  3. 单击添加应用,填写应用名称(本文档中设置为 M2M_Server)。

  4. 单击服务端权限开放页签。

  5. 单击权限应用下的服务端权限开放开关按钮。

    1. 受众标识:受众标识是 M2M 服务端应用的唯一标识,录入后不可修改。应用向 IDaaS 获取权限时,scope 参数中需通过受众标识|权限标识来获取指定服务端的指定权限。本文档设置为api://ram.aliyun.com

  6. 单击权限管理下的添加权限。如有多个权限,可重复操作。

    1. 权限名称:权限标识的名称,仅用作控制台页面展示,不作为实际认证参数。本文档设置为RAM_STS_Token

    2. 权限标识:权限标识是应用权限的唯一标识。应用向 M2M 服务端应用获取权限时,scope 参数中需通过受众标识|权限标识来获取指定服务端的指定权限。本文档设置为ram:sts

  7. 授权应用下单击 M2M 客户端应用M2M_Client的开关按钮,将 M2M 客户端应用关联至 M2M 服务端应用。如有多个 M2M 客户端应用,可重复操作。

  8. 权限列表下勾选名称为RAM_STS_Token的权限。

  9. 完成配置。

配置 ACK 为 OIDC 联邦信任源

将 ACK 集群配置为 IDaaS 的 OIDC 联邦信任源。

  1. 访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台

  2. 导航至登录认证配置联邦信任源管理

  3. 单击新增联邦信任源,选择 OIDC 选项。

  4. 填写配置参数:

    1. 联邦信任源名称:本文档设置为oidc_ack

    2. 网络端点:本文档中选择共享端点。IDaaS 将使用网络端点地址访问“Issuer”地址,按照 OIDC 协议获取公钥。

    3. 信任来源:本文档中选择Issuer地址解析

    4. Issuer:身份提供方标识。从 ACK 集群信息中获取“提供商 URL”后填入。获取方式可参考获取集群中OIDC提供商的URLARN信息

    5. 受众标识sts.aliyuncs.com(ACK 固定值)。

    6. 信任条件:使用条件表达式对 ACK 做进一步认证。可选,本文档中不使用。如有需要,可参考联邦凭证表达式的使用进行填写。

  5. 完成配置。

创建 IDaaS 联邦凭证

为应用创建联邦凭证,用于获取 M2M Token。

  1. 访问IDaaS 实例控制台,单击目标 IDaaS 实例操作列中的访问控制台

  2. 导航至应用管理 > M2M应用管理

  3. 找到M2M_Client应用,单击管理

  4. 通用配置 > 凭证管理中选择 OIDC凭证类型,。

  5. 单击新增联邦凭证,填写配置:

    1. 联邦信任源:选择oidc_ack

    2. 联邦凭证名称:本文档设置为oidc_ack_credential。应用在获取 M2M Token 时需要传入该名称。

    3. 校验条件模式:选择kubernetes模式

    4. 命名空间:容器 Pod 部署的命名空间。本文档中使用default。Kubernetes 中默认命名空间为default,可以根据实际情况填写。

    5. 服务账号:部署应用的容器 Pod 使用的服务账号(ServiceAccount)。本例中使用default。Kubernetes 中默认服务账号为 default,可以根据容器 Pod 实际情况填写。

  6. 完成配置。

创建 RAM OIDC 身份提供商及角色

在 RAM 中创建 OIDC 身份提供商和角色,用于验证 IDaaS 身份并授予云资源访问权限。

  1. 创建 OIDC 身份提供商,关键配置项如下。详细步骤参考创建OIDC身份提供商

    1. 颁发者 URL:填写 M2M 服务端应用的 Issuer。在M2M_Server应用(本文档中创建)中查看(进入 M2M 管理页面,在通用配置 > 应用配置信息下的 Issuer 项)。

    2. 客户端 ID:填写 M2M 服务端应用的受众标识,本例中为api://ram.aliyun.com

  2. 创建 OIDC 身份提供商角色,详细步骤参考创建OIDC身份提供商角色。推荐为不同应用创建独立的角色,实现权限最小化原则。

    1. oidc:iss :填写 M2M 服务端应用的 Issuer。自动从 OIDC 身份提供商中带入,不需要修改。

    2. oidc:aud:填写 M2M 服务端应用的受众标识。自动从 OIDC 身份提供商中带入,不需要修改。

    3. (可选)新增条件,创建多个角色时使用,每个角色设置不同的oidc:sub值。

      1. 条件键oidc:sub

      2. 运算符StringEquals

      3. 条件值:M2M 客户端应用的client_id。进入目标 M2M 客户端应用管理页面,在通用配置 > 凭证管理 > 凭证类型 > Client Secret 凭证下查看。

  3. 为 OIDC 身份提供商角色授权,应用获取到指定 OIDC 身份提供商角色的临时凭证后即可在权限范围内访问阿里云资源。详细步骤参考角色授权

配置ACK RRSA 功能

启用 ACK RRSA 功能。Kubernetes 通过 ServiceAccount 划分权限,可以为每个 Pod 设置不同 ServiceAccount,以实现 Pod 之间的权限隔离。

  1. ACK 集群开启 RRSA。详细配置可参考通过RRSA配置ServiceAccountRAM权限实现Pod权限隔离

  2. ACK 集群安装ack-pod-identity-webhook组件。详细配置可参考组件

  3. default命名空间增加标签(labels)pod-identity.alibabacloud.com/injection: 'on'

  4. default服务账户增加注解(annotations)pod-identity.alibabacloud.com/role-name: default

    说明

    仅用于 RRSA 匹配需向集群注入环境变量,pod-identity.alibabacloud.com/role-name的值不影响认证过程。

验证步骤

获取 ACK OIDC Token

  1. 在命名空间default中创建serviceAccountNamedefaultPod。

  2. 在 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 Secret 凭证下的 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

参考获取 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 调试工具

关键请求参数如下: