您可以在应用Pod中以挂载Secret的形式,将存储在阿里云KMS凭据管家中的密文引入到应用程序中使用,避免敏感数据在应用开发构建流程中传播和泄露,可以通过ack-secret-manager组件向集群导入或同步凭据信息,实现密钥数据的自动更新。本文介绍如何使用ack-secret-manager获取KMS服务凭据权限。
背景信息
- ack-secret-manager是容器服务ACK应用市场提供的一款开源组件,可帮您将凭据管家中的密钥凭据以K8s原生Secret对象的形式自动导入到集群中并实现密钥数据的自动更新。关于KMS凭据管家的更多信息,请参见凭据管家概述。
- 您需要确保ack-secret-manager组件有权限获取KMS服务中的凭据信息,否则ack-secret-manager组件将无法向集群中导入或同步凭据信息,您可以根据集群信息选择如下三种授权方式。
方式一:为集群对应的WorkRole添加权限
由于ASK集群没有绑定WorkerRole,该方式只适用于ACK托管集群。
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群信息页面,单击集群资源页签,然后单击Worker RAM角色右侧链接。
- 在RAM角色基本信息的权限管理页签,单击以k8sWorkerRole****为前缀的权限策略名称。
- 在策略内容页签下,单击修改策略内容。
- 在脚本编辑框中修改权限策略内容,增加以下授权规则,修改完成后单击下一步:编辑基本信息。然后单击确定。

{
"Action": [
"kms:GetSecretValue"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
- 安装ack-secret-manager组件。
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,选择。
- 在应用目录页签下选中全部页签,在搜索框中搜索并选中ack-secret-manager。
- 在弹出面板中,选择集群和命名空间,然后单击下一步。
- 在参数配置页面,设置相应参数,然后单击确定。
方式二:RRSA
RRSA适用于1.22版本的ACK托管集群和ASK集群。相比其他授权方式,RRSA授权方式可以实现Pod维度的权限隔离,推荐在多租场景下使用。
- 在容器服务管理控制台开启集群的RRSA功能。具体操作,请参见启用RRSA功能。
- 创建RAM角色。
- 修改RAM角色信任策略。
- 您需要修改RAM角色的信任策略,确保指定的服务账户的ack-secret-manager组件有权限获取一个扮演这个RAM角色的临时凭证。更多信息,请参见修改RAM角色的信任策略。
- RAM角色信任策略内容示例如下,您也可以使用命令行工具ack-ram-tool中的associate-role命令帮助完成指定的服务账户到角色的信任绑定。
注意 在下面的策略内容中,需要替换如下字段:
<oidc_issuer_url>
:替换为当前集群的OIDC提供商URL,该URL可以在集群详情的基本信息页签获取。示例格式为:https://oidc-ack-****.oss-****.aliyuncs.com/****
<namespace>
:替换为部署ack-secret-manager的命名空间, 默认为kube-system。
<account_uid>
:替换为阿里云主账号UID。
<cluster_id>
:替换为集群ID。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"oidc:aud": "sts.aliyuncs.com",
"oidc:iss": "<oidc_issuer_url>",
"oidc:sub": "system:serviceaccount:<namespace>:ack-secret-manager"
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"acs:ram::<account_uid>:oidc-provider/ack-rrsa-<cluster_id>"
]
}
}
],
"Version": "1"
}
- 创建自定义授权策略并为步骤2已创建的RAM角色授权。
- 创建访问KMS服务凭据的自定义授权策略。
策略内容如下。具体操作,请参见
创建自定义授权策略。
{
"Version": "1",
"Statement": [
{
"Action": "kms:GetSecretValue",
"Resource": "*",
"Effect": "Allow"
}
]
}
- 为步骤2已创建的RAM角色授权。具体操作,请参见为RAM角色授权。
- 在集群中创建名称为alibaba-credentials的Secret,用于配置RRSA中的角色ARN和指定OIDC服务提供商ARN。
- 使用以下内容,创建alibaba-credentials.yaml文件。
如下
oidcproviderarn
表示当前集群的OIDC提供商ARN,获取该ARN可登录
RAM管理控制台,在左侧导航栏选择
SSO管理,然后单击
OIDC页签,在OIDC身份供应商列表中找到集群对应的OIDC提供商并进入详情页面,获取对应的ARN详情。
apiVersion: v1
data:
oidcproviderarn: ****
rolearn: **** #指定扮演的RAM角色ARN,需要base64编码。
kind: Secret
metadata:
name: alibaba-credentials
namespace: kube-system
type: Opaque
- 执行以下命令,部署Secret。
kubectl apply -f alibaba-credentials.yaml
- 安装ack-secret-manager组件,并更新参数配置中的
envVarsFromSecret
信息。安装具体操作,请参见
步骤8,参数配置时您需要将RRSA的
enable
设置为
true
。并使用以下
envVarsFromSecret
替换默认配置中的
envVarsFromSecret
。
envVarsFromSecret:
ALICLOUD_ROLE_ARN:
secretKeyRef: alibaba-credentials
key: rolearn
ALICLOUD_OIDC_PROVIDER_ARN:
secretKeyRef: alibaba-credentials
key: oidcproviderarn
rrsa:
# Specifies whether using rrsa and enalbe sa token volume projection, default is false
enable: true
参数配置完成后的界面如下:

方式三:通过设置AK扮演指定RAM角色
- 创建RAM角色。
- 创建自定义授权策略并为上一步已创建的RAM角色授权。
- 创建访问KMS服务凭据的自定义授权策略。
策略内容如下。具体操作,请参见
创建自定义授权策略。
{
"Version": "1",
"Statement": [
{
"Action": "kms:GetSecretValue",
"Resource": "*",
"Effect": "Allow"
}
]
}
- 为上一步已创建的RAM角色授权。具体操作,请参见为RAM角色授权。
- 创建扮演上述角色的自定义授权策略,并为指定RAM用户授权。
- 创建扮演上述角色的自定义授权策略。
策略内容如下。具体操作,请参见
创建自定义授权策略。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "acs:ram::***:role/****" #方式三的步骤1创建的RAM角色ARN。
}
],
"Version": "1"
}
- 为指定RAM用户授权。具体操作,请参见为RAM用户授权。
- 在集群中创建名称为alibaba-credentials的Secret,用于配置角色扮演的凭证信息。
- 使用以下内容,创建alibaba-credentials.yaml文件。
apiVersion: v1
data:
id: **** #方式三的步骤3指定RAM用户的AK。
secret: **** #方式三的步骤3指定RAM用户的SK。
rolearn: **** #方式三的步骤1创建的RAM角色ARN。
rolesessionname: **** #可自定义的角色sessionname。
kind: Secret
metadata:
name: alibaba-credentials
namespace: kube-system
type: Opaque
- 执行以下命令,部署Secret。
kubectl apply -f alibaba-credentials.yaml
- 安装ack-secret-manager组件,并更新参数配置中的
envVarsFromSecret
信息。安装具体操作,请参见
步骤8,参数配置时您需要使用以下
envVarsFromSecret
替换默认配置中的
envVarsFromSecret
。
envVarsFromSecret:
ACCESS_KEY_ID:
secretKeyRef: alibaba-credentials
key: id
SECRET_ACCESS_KEY:
secretKeyRef: alibaba-credentials
key: secret
ALICLOUD_ROLE_ARN:
secretKeyRef: alibaba-credentials
key: rolearn
ALICLOUD_ROLE_SESSION_NAME:
secretKeyRef: alibaba-credentials
key: rolesessionname
参数配置完成后的界面如下:
