Skip to content

Latest commit

 

History

History
315 lines (242 loc) · 15.9 KB

README-zh_CN.md

File metadata and controls

315 lines (242 loc) · 15.9 KB

ACK Secret Manager

English | 简体中文

ack-secret-manager 可以帮助您将存储在阿里云KMS凭据管家 中的密钥凭据以K8s原生Secret对象的形式导入到集群中并实现密钥数据的自动同步,您可以在应用Pod中以挂载Secret等形式将存储在凭据管家中的密文引入到应用程序中使用,避免敏感数据在应用开发构建流程中的传播和泄露。

安装

  1. 请确保组件使用的凭据有足够的权限访问阿里云凭据管家服务,可以使用如下两种配置方式,推荐使用RRSA方式,实现Pod维度的授权。

    • 在集群对应的 WorkerRole 中添加权限

      • 登录容器服务控制台

      • 选择对应集群进入到集群详情页

      • 在集群信息中选择集群资源页,点击Worker RAM角色中对应的命名为KubernetesWorkerRole-xxxxxxxxxxxxxxx 的角色名称,会自动导航到RAM角色对应的控制台页面

      • 点击添加权限按钮,创建自定义权限策略,策略内容如下:

        {
            "Action": [
               "kms:GetSecretValue",
               "kms:Decrypt"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
      • 绑定上面创建的自定义策略给集群对应的WorkerRole

    • . 通过 RRSA方式 实现Pod维度的授权

  2. 登录到容器服务控制台

    • 在左侧导航栏选择市场 -> 应用市场,在搜索栏中输入ack-secret-manager,选择进入到应用页面;

    • 选择需要安装的目标集群和命名空间、发布名称;

    • 在参数配置页面进行自定义参数配置,包括 values.yaml 中的rrsa.enable以及配置 envVarsFromSecret 中的相关参数,参数说明参见下方的配置说明

    • 点击确定按钮完成安装。

升级

  1. 登录到容器服务控制台;
  2. 选择目标集群点击进入到集群详情页面;
  3. 在左侧的导航栏选择应用-> Helm,找到 ack-secret-manager 对应的更新,修改配置后点击确定按钮完成安装。

卸载

  1. 登录到容器服务控制台;
  2. 选择目标集群点击进入到集群详情页面;
  3. 在左侧的导航栏选择应用-> 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参数配置指导

  1. 创建凭据

    在KMS凭据管家中添加如下凭证,详细流程请参考管理通用凭据

    SecretName: test1
    SecretData: {"name":"tom","age":"14","friends":[{"name":"lili"},{"name":"edf"}]} 
    VersionId: v1
  2. 创建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 中配置 remoteRamRoleArnremoteRamRoleSessionName 即可,以下为样例 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: ""
  3. 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文件中找到更多信息。

Release Note

版本号 变更时间 变更内容
0.4.0 2022年12月22日 支持基于JMES解析提取JSON格式的密文字段
0.5.0 2023年10月10日 1.支持专属版 KMS 凭据同步
2.多阿里云访问凭据管理
3.凭据自解析与键规则替换
4.共享版 KMS 跨账号凭据同步