English | 简体中文
ack-secret-manager 可以帮助您将存储在阿里云KMS凭据管家 中的密钥凭据以K8s原生Secret对象的形式导入到集群中并实现密钥数据的自动同步,您可以在应用Pod中以挂载Secret等形式将存储在凭据管家中的密文引入到应用程序中使用,避免敏感数据在应用开发构建流程中的传播和泄露。
-
请确保组件使用的凭据有足够的权限访问阿里云凭据管家服务,可以使用如下两种配置方式,推荐使用RRSA方式,实现Pod维度的授权。
-
在集群对应的 WorkerRole 中添加权限
-
登录容器服务控制台
-
选择对应集群进入到集群详情页
-
在集群信息中选择集群资源页,点击Worker RAM角色中对应的命名为KubernetesWorkerRole-xxxxxxxxxxxxxxx 的角色名称,会自动导航到RAM角色对应的控制台页面
-
点击添加权限按钮,创建自定义权限策略,策略内容如下:
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }
-
绑定上面创建的自定义策略给集群对应的WorkerRole
-
-
. 通过 RRSA方式 实现Pod维度的授权
-
-
登录到容器服务控制台
-
在左侧导航栏选择市场 -> 应用市场,在搜索栏中输入ack-secret-manager,选择进入到应用页面;
-
选择需要安装的目标集群和命名空间、发布名称;
-
在参数配置页面进行自定义参数配置,包括 values.yaml 中的
rrsa.enable
以及配置envVarsFromSecret
中的相关参数,参数说明参见下方的配置说明; -
点击确定按钮完成安装。
-
- 登录到容器服务控制台;
- 选择目标集群点击进入到集群详情页面;
- 在左侧的导航栏选择应用-> Helm,找到 ack-secret-manager 对应的更新,修改配置后点击确定按钮完成安装。
- 登录到容器服务控制台;
- 选择目标集群点击进入到集群详情页面;
- 在左侧的导航栏选择应用-> Helm,找到 ack-secret-manager 对应的发布,点击操作拦中的删除按钮进行删除。
参数 | 说明 | 默认值 |
---|---|---|
env.WATCH_NAMESPACE | 指定组件watch的namespace(默认空值代表watch所有命名空间) | |
envVarsFromSecret.ACCESS_KEY_ID | 可以通过设置ACCESS_KEY_ID变量指定凭证AK构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret.SECRET_ACCESS_KEY | 可以通过设置SECRET_ACCESS_KEY变量指定凭证SK构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret.ALICLOUD_ROLE_ARN | 可以通过设置ALICLOUD_ROLE_ARN变量指定RAM角色ARN用于构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret.ALICLOUD_ROLE_SESSION_NAME | 可以通过设置ALICLOUD_ROLE_SESSION_NAME变量指定RAM角色session name用于构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret.ALICLOUD_ROLE_SESSION_EXPIRATION | 可以通过设置ALICLOUD_ROLE_SESSION_EXPIRATION变量指定RAM角色session过期时长用于构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret. ALICLOUD_OIDC_PROVIDER_ARN | 可以通过设置ALICLOUD_OIDC_PROVIDER_ARN变量指定RAM OIDC供应商的ARN用于构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret.ALICLOUD_OIDC_TOKEN_FILE | 可以通过设置ALICLOUD_OIDC_TOKEN_FILE变量指定pod内oidc token文件路径用于构建SDK client,需要定义在名称为alibaba-credentials的secret实例中 | |
envVarsFromSecret.ALICLOUD_REMOTE_ROLE_ARN | 可以通过设置 ALICLOUD_REMOTE_ROLE_ARN 变量指定另一个账号的 RAM Role Arn,用于在跨账号拉取凭据数据时进行角色扮演 | |
envVarsFromSecret.ALICLOUD_REMOTE_ROLE_SESSION_NAME | 可以通过设置 ALICLOUD_REMOTE_ROLE_SESSION_NAME 变量指定 RAM Role Session Name,于在跨账号拉取凭据数据时进行角色扮演 | |
rrsa.enable | 是否启用RRSA特性,默认为false,启用后需要配置envVarsFromSecret中的ALICLOUD_ROLE_ARN和 ALICLOUD_OIDC_PROVIDER_ARN参数 | false |
command.backend | 对接的外部密钥管理系统后端,当前仅支持阿里云凭据管家,配置为alicloud-kms | alicloud-kms |
command.reconcilePeriod | 控制器重新协调externalSecret实例的间隔时间,默认5秒 | 5s |
command.reconcileCount | 指定并发协调externalSecret实例的worker数量,默认是1 | 1 |
command.tokenRotationPeriod | 检查KMS client访问STS token是否过期的轮询时间 | 120s |
command.region | 从指定region拉取secret凭据 | |
command.disablePolling | 关闭从KMS后端自动同步拉取最新的凭据内容,默认false | false |
command.pollingInterval | 从KMS后端同步存量secret实例的间隔时间 | 120s |
image.repository | 指定的ack-secret-manager 镜像仓库名称 | acs/ack-secret-manager |
image.tag | 指定的ack-secret-manager 镜像tag | v0.5.0 |
image.pullPolicy | 镜像拉取策略,默认为Always | Always |
nameOverride | 覆盖应用名称 | nil |
fullnameOverride | 覆盖应用全名 | nil |
rbac.create | 是否创建并使用RBAC资源,默认为true | true |
securityContext.fsGroup | 指定应用的security context配置 | {} |
serviceAccount.create | 是否创建serviceaccount | true |
serviceAccount.name | 指定创建serviceaccount的名称 | 自动生成 |
serviceAccount.annotations | 指定添加serviceaccount annotation标签 | nil |
podAnnotations | 指定添加到pod中的annotation标签 | {} |
podLabels | 指定添加到pod中的Label标签 | {} |
replicaCount | 控制器副本个数 | 1 |
nodeSelector | 指定的nodeSelector标签 | {} |
tolerations | 指定的污点容忍配置 | [] |
affinity | 指定的Pod亲和性配置 | {} |
resources | 指定的Pod requests和limits配置 | {} |
ack-secret-manager 包含两种 CRD,其中SecretStore 用于存放访问凭据(例如 RRSA ,ClientKey,AK 配置等),ExternalSecret 用于存放需要同步的凭据基础信息(如凭据名称,版本等)以及指定 SecretStore,保证了权限与数据分离,增强使用灵活性。具体介绍 CRD参数配置指导
-
创建凭据
在KMS凭据管家中添加如下凭证,详细流程请参考管理通用凭据
SecretName: test1 SecretData: {"name":"tom","age":"14","friends":[{"name":"lili"},{"name":"edf"}]} VersionId: v1
-
创建SecretStore & ExternalSecret
前提:给集群开启 RRSA,并且正确配置相关 RAM Role 权限
创建 SecretStore 的测试实例,测试模板如下,需对部分字段进行替换
apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo spec: KMS: KMSAuth: oidcProviderARN: "acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{accountID}:role/{roleName}"
创建名称为
hello-service-external-secret.yml
的ExternalSecret的测试模版文件,测试模板如下:apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: esdemo spec: data: #无需特殊处理的数据源 - key: test1 # kms 凭据名称 name: test1 # 存入 secret 字段 versionId: v1 #kms 凭据版本 secretStoreRef: name: scdemo namespace: default
执行命令创建externalsecret测试实例:
kubectl apply -f hello-service-external-secret.yml
查看目标secret是否创建成功:
kubectl get secret esdemo -oyaml
如果创建成功,查看secret内容如下:
apiVersion: v1 data: test1: eyJuYW1lIjoidG9tIiwiYWdlIjoiMTQiLCJmcmllbmRzIjpbeyJuYW1lIjoibGlsaSJ9LHsibmFtZSI6ImVkZiJ9XX0= kind: Secret metadata: name: esdemo namespace: default type: Opaque
在没有关闭自动同步配置的前提下,可以修改KMS凭据管家中的密钥内容,等待片刻后查看目标secret是否已经完成同步
另外ack-secret-manager支持跨账号同步凭据,在
SecretStore.Spec.KMS.KMSAuth
中配置remoteRamRoleArn
,remoteRamRoleSessionName
即可,以下为样例 SecretStore:apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo spec: KMS: KMSAuth: oidcProviderARN: "acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{accountID}:role/{roleName}" remoteRamRoleArn: "acs:ram::{accountID}:role/{roleName}" remoteRamRoleSessionName: ""
-
JSON凭据解析
如果您希望解析一个 JSON 格式的 secret 并将其中指定的 key-value 对同步到 k8s secret 中,可以使用
jmesPath
字段。以下是一个使用jmesPath
字段的样例,我们将其部署在集群中apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: es-json-demo spec: data: #无需特殊处理的数据源 - key: test1 # kms 凭据名称 name: test1 # 存入 secret 字段 versionId: v1 #kms 凭据版本 secretStoreRef: name: scdemo namespace: default jmesPath: # 解析 json 串中的部分字段 - path: "name" objectAlias: "name" - path: "friends[0].name" objectAlias: "friendname"
当您使用
jmesPath
字段时,必需指定下面两个子字段:-
path
: 必需项,基于 JMES path 规范解析 json 中的指定字段 -
objectAlias
: 必需项,用于指定解析出的字段同步到 k8s secret 中的 key 名称
-
部署后检查 secret 是否创建成功
```sh
kubectl get secret es-json-demo -oyaml
```
同步成功即可看到如下结果
```yaml
apiVersion: v1
data:
friendname: bGlsaQ==
name: dG9t
kind: Secret
metadata:
creationTimestamp: "2023-10-09T13:11:05Z"
labels:
lastUpdatedAt: 2023-10-09T13.11.05Z
name: es-json-demo
namespace: default
resourceVersion: "7313940"
uid: 18d84558-f526-4ff5-ab9a-720ec1861c30
type: Opaque
```
-
dataProcess
如果您想将 JSON 凭据解析后再存放入 secret 中,但又不知道凭据的具体结构,可以采用自解析功能,即 dataProcess.Extract 字段。并且可以针对解析后的字段键进行规则替换,即 dataProcss.replaceRule 字段,防止不规则的 secret data key 导致无法创建 secret,以下为样例 ExternalSecret
apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: extract-secret spec: dataProcess: - extract: key: test1 name: extract versionId: v1 secretStoreRef: name: dkms-client namespace: default replaceRule: - source: "^n.*e$" #替换 以n开头以e结尾 的 key 为 alibabacloud target: "alibabacloud" - source: "^f.*s$" target: "ack"
同步成功即可看到如下结果,JSON 凭据被解析为三部分,且各自的键根据 replaceRule 规则进行了替换
apiVersion: v1 data: ack: W3sibmFtZSI6ImxpbGkifSx7Im5hbWUiOiJlZGYifV0= age: IjE0Ig== alibabacloud: InRvbSI= kind: Secret metadata: creationTimestamp: "2023-10-09T14:07:35Z" labels: lastUpdatedAt: 2023-10-09T14.07.35Z name: extract-secret namespace: default resourceVersion: "7328187" uid: a3ab5278-02bd-4544-bae7-b502acccfe3c type: Opaque
对于发现的安全漏洞,请发送邮件至[email protected],您可在SECURITY.md文件中找到更多信息。
版本号 | 变更时间 | 变更内容 |
---|---|---|
0.4.0 |
2022年12月22日 | 支持基于JMES解析提取JSON格式的密文字段 |
0.5.0 |
2023年10月10日 | 1.支持专属版 KMS 凭据同步 2.多阿里云访问凭据管理 3.凭据自解析与键规则替换 4.共享版 KMS 跨账号凭据同步 |