全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用ack-secret-manager导入阿里云OOS加密参数

更新时间:Dec 24, 2025

ack-secret-manager支持以Kubernetes Secret实例的形式向集群导入或同步OOS加密参数,确保您集群内的应用能够安全地访问敏感信息。通过该组件,您可以实现密钥数据的自动更新,使应用负载通过文件系统挂载指定Secret实例来使用加密参数,同时帮助您解决负载应用和阿里云OOS加密参数交互的兼容性问题。

image

安全说明

通常情况下,用户的密钥会保存在文件中供应用程序读取,这种情况和通过阿里云OOS加密参数直接读取密钥存在兼容性问题。ack-secret-manager可以解决此类兼容性问题,同时支持将密钥同步创建为集群中的Kubernetes原生Secrets实例,以供环境变量挂载使用。使用前请您评估如下的安全风险。

  • 当密钥在文件系统中可以被访问时,如果应用中存在某些有缺陷的软件,该软件的漏洞可能会造成目录遍历的风险,导致敏感信息泄露。

  • 由于一些Debug端点或Logs权限的误配置都可能导致密钥泄露,所以通过环境变量挂载引用的方式消费密钥是不安全且不推荐的。

  • 当开启Secret实例同步特性时,需要基于权限最小化原则严格控制访问权限。

鉴于上述原因,如果应用中并不需要密文的持久化存储,推荐通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离为应用配置Pod维度的最小化权限,并通过GetSecretParameter直接在应用中获取加密参数,以减少密文内容在Pod文件系统或Kubernetes集群Secrets中的暴露风险。

前提条件

步骤一:安装ack-secret-manager组件

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. Helm页面,单击创建,在Chart区域搜索并选中ack-secret-manager,其他设置保持默认,然后单击下一步

    根据弹出的页面提示确认,组件将被安装在默认的kube-system命名空间中,并以组件名称发布应用。如果您需要自定义应用名和命名空间,请根据页面提示设置。

  4. 参数配置页面,选择Chart版本为最新版本,并设置相应参数,然后单击确定

    • 如需开启RRSA认证功能,您需要将参数rrsa.enable设置为trueimage

    • 如需开启定时同步加密参数功能,您需要配置如下参数。image

      • command.disablePolling:是否关闭加密参数的自动轮询功能,设置为false,开启加密参数自动轮询功能。

      • command.pollingInterval:加密参数同步的频率,设置为120s,此处以两分钟同步一次加密参数为例,您可以根据实际需求调整。

    • 配置限流参数:如果您集群中具有较多的ExternalSecret(待同步的 OOS 加密参数),配置不当可能会引发OOS或RAM侧的限流,因此,您需要配置以下限流参数避免发生限流。imagecommand.maxConcurrentOosSecretPulls:每秒可以同步的最大OOS加密参数数量,默认为10。

    • 如需禁止ExternalSecret跨命名空间引用SecretStore,需要将参数command.enableCrossNamespaceSecretStore设置为false

      image

    • 如需禁止SecretStore跨命名空间引用ServiceAccount,需要将参数command.enableCrossNamespaceAuthRef设置为false

      image

    • 如需禁用集群维度的控制器,需要配置以下参数,crdscommand 参数值是相互关联的,对于集群维度的控制器说明请参考集群级别资源说明

      image

      • crds.createClusterSecretStore:控制是否安装 ClusterSecretStore CRD,默认为true安装

      • crds.createClusterExternalSecret:控制是否安装 ClusterExternalSecret CRD,默认为true安装

      • command.processClusterSecretStore:控制是否处理 ClusterSecretStore 资源,默认为true处理

      • command.processClusterExternalSecret:控制是否处理 ClusterExternalSecret 资源,默认为true处理

    创建成功后,会自动跳转到目标集群的ack-secret-manager页面,检查安装结果。若下图中所有资源创建成功,则表明组件安装成功。image.png

步骤二:配置组件认证信息

您需要通过自定义资源SecretStore来配置ack-secret-manager的认证信息,以确保该组件有权限获取OOS服务中的加密参数信息,否则ack-secret-manager将无法向集群中导入或同步加密参数信息。您可以根据集群类型选择如下四种授权方式进行配置。

  • 使用ServiceAccount维度的细粒度RRSA授权:适用于1.22及以上版本的ACK托管集群ACK Serverless集群

  • 使用ack-secret-manager的ServiceAccount无AK授权:适用于1.22及以上版本的ACK托管集群ACK Serverless集群

  • 为集群对应的Worker RAM角色添加权限:由于ACK Serverless集群没有绑定Worker RAM角色,该方式只适用于ACK托管集群ACK专有集群ACK One注册集群

  • 通过设置AK扮演指定RAM角色:适用于所有容器服务Kubernetes集群。

使用ServiceAccount维度的细粒度RRSA授权

基于Namespace维度下不同ServiceAccount的RRSA授权实现多租场景下的OOS加密参数访问权限隔离。相比其他授权方式,RRSA授权方式可以实现Pod维度的权限隔离,还可以避免直接使用AK、SK引起的凭据泄露风险。

image

  1. 容器服务管理控制台开启集群的RRSA功能,用于创建集群的身份提供商信息具体操作,请参见启用RRSA功能

    说明

    安装ack-secret-manager时,需要将参数rrsa.enable设置为true,以启用RRSA功能。

  2. 为不同的ServiceAccount创建可信实体为身份提供商的RAM角色。

    选择信任主体类型身份提供商,添加主体时主要参数设置如下,具体操作,请参见创建OIDC身份提供商的RAM角色

    配置项

    描述

    身份提供商类型

    OIDC

    身份提供商

    选择ack-rrsa-<CLUSTER_ID>。其中,<CLUSTER_ID>为集群ID。

    条件

    • oidc:iss:保持默认。

    • oidc:aud:保持默认。

    • oidc:sub:需手动添加该条件。

      • 条件键:选择oidc:sub

      • 运算符:选择StringEquals

      • 条件值:输入system:serviceaccount:<NAMESPACE>:<SERVICEACCOUNT_NAME>。其中<NAMESPACE>为指定ServiceAccount的命名空间,<SERVICEACCOUNT_NAME>为服务账户ServiceAccount的名称。

        说明

        其中<NAMESPACE><SERVICEACCOUNT_NAME>需要与4.在指定命名空间下创建访问指定OOS加密参数的独立ServiceAccount中的配置保持一致。

  3. 创建自定义权限策略并为上一步创建的RAM角色授权。

    1. 创建指定导入OOS加密参数时所需的权限策略。具体操作,请参见创建自定义权限策略

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
               "oos:GetSecretParameter",
               "kms:GetSecretValue"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
          }
        ]
      }
    2. 为上一步创建的RAM角色授权。具体操作,请参见为RAM角色授权

  4. 在指定命名空间下创建访问指定OOS加密参数的独立ServiceAccount。注意ServiceAccount需要添加键值为ack.alibabacloud.com/role-arn的指定annotation,值为该ServiceAccount绑定的目标RAM角色ARN。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        ack.alibabacloud.com/role-arn: acs:ram::<ACCOUNT_ID>:role/<ROLE_NAME> # RAM角色的ARN
      name: <SERVICEACCOUNT_NAME>     # 需与RAM角色配置的oidc:sub条件值<SERVICEACCOUNT_NAME>保持一致
      namespace: <NAMESPACE>         # 需与RAM角色配置的oidc:sub条件值<NAMESPACE>保持一致
  5. 使用serviceAccountRef认证方式部署自定义资源SecretStore。

    1. 基于以下内容,替换相关字段后,创建secretstore-rrsa.yaml文件。

      1. <NAME>:替换为指定的SecretStore实例名称。

      2. <NAMESPACE>:替换为指定的集群命名空间名称。

      3. <SERVICEACCOUNT_NAME>:替换为上一步中创建的ServiceAccount实例名称。

        apiVersion: alibabacloud.com/v1alpha1
        kind: SecretStore
        metadata:
          name: <NAME>
          namespace: <NAMESPACE>
        spec:
          OOS:
            OOSAuth:
              serviceAccountRef:
                name: <SERVICEACCOUNT_NAME>
    2. 执行以下命令,部署SecretStore。

      kubectl apply -f secretstore-rrsa.yaml

使用ack-secret-manager的ServiceAccount无AK授权

相比其他授权方式,RRSA授权方式可以实现Pod维度的权限隔离,还可以避免直接使用AK、SK引起的凭据泄露风险。

  1. 容器服务管理控制台开启集群的RRSA功能,用于创建集群的身份提供商信息具体操作,请参见启用RRSA功能

    说明

    安装ack-secret-manager时,需要将参数rrsa.enable设置为true,以启用RRSA功能。

  2. 创建可信实体为身份提供商的RAM角色,以供ack-secret-manager使用。主要参数设置如下,具体操作,请参见创建OIDC身份提供商的RAM角色

    配置项

    描述

    身份提供商类型

    OIDC

    身份提供商

    选择ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。

    条件

    • oidc:iss:保持默认。

    • oidc:aud:保持默认。

    • oidc:sub:需手动添加该条件。

      • 条件键:选择oidc:sub

      • 运算符:选择StringEquals

      • 条件值:输入system:serviceaccount:<namespace>:<serviceAccountName>。其中,<namespace>为应用所在的命名空间。<serviceAccountName>为服务账户名称。根据本文测试应用的信息,此处需填入system:serviceaccount:kube-system:ack-secret-manager

        说明

        如果您将ack-secret-manager安装在其他的命名空间,请将kube-system替换为对应命名空间的名称。

  3. 创建自定义授权策略并为上一步创建的RAM角色授权。

    1. 创建ack-secret-manager导入OOS加密参数时所需的权限策略。策略内容如下。具体操作,请参见创建自定义权限策略

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
               "oos:GetSecretParameter",
               "kms:GetSecretValue"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
          }
        ]
      }
    2. 为上一步创建的RAM角色授权。具体操作,请参见为RAM角色授权

  4. 创建自定义资源SecretStore关联对应的认证方式并部署。

    1. 使用以下内容,替换相关字段后,创建secretstore-rrsa.yaml文件。

      • <accountID>:替换为同步OOS加密参数的阿里云账号ID。

      • <clusterID>:替换为您的集群ID。

      • <roleName>:替换为步骤2中创建的RAM角色名称。

        apiVersion: alibabacloud.com/v1alpha1
        kind: SecretStore
        metadata:
          name: scdemo-rrsa
        spec:
          OOS:
            OOSAuth:
              oidcProviderARN: "acs:ram::<accountID>:oidc-provider/ack-rrsa-<clusterID>"
              ramRoleARN: "acs:ram::<accountID>:role/<roleName>"
  5. 执行以下命令,部署SecretStore。

    kubectl apply -f secretstore-rrsa.yaml

为集群对应的Worker RAM角色添加权限

  1. 创建如下自定义权限策略。具体操作,请参见创建自定义权限策略

  2. {
      "Version": "1",
      "Statement": [
        {
          "Action": [
             "oos:GetSecretParameter",
             "kms:GetSecretValue"
          ],
          "Resource": [
              "*"
          ],
          "Effect": "Allow"
        }
      ]
    }
  3. 为集群的Worker RAM角色添加上一步创建的自定义权限。具体操作,请参见步骤二:为集群的Worker RAM角色授权

通过设置AK扮演指定RAM角色

  1. 创建可信实体为阿里云账号的RAM角色,以供ack-secret-manager组件使用。具体操作,请参见创建可信实体为阿里云账号的RAM角色

  2. 创建自定义授权策略并为上一步已创建的RAM角色授权。

    1. 创建访问OOS服务加密参数所需的权限策略。策略内容如下。具体操作,请参见创建自定义权限策略

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
               "oos:GetSecretParameter",
               "kms:GetSecretValue"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
          }
        ]
      }
    2. 为上一步已创建的RAM角色授权。具体操作,请参见为RAM角色授权

  3. 创建扮演上述角色的自定义授权策略,并为指定的RAM用户授权。

    1. 创建扮演上述角色的自定义授权策略,其中Resource的值为步骤1中创建的RAM角色的ARN。具体操作,请参见创建自定义权限策略

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Resource": "acs:ram::***:role/****"
              }
          ],
          "Version": "1"
      }
    2. 为指定的RAM用户授权。具体操作,请参见为RAM用户授权

  4. 创建Secret用于存放指定RAM用户的AK、SK信息。

    1. 使用以下内容,替换您的AK、SK的Base64编码信息后,创建ramuser.yaml文件。

      apiVersion: v1
      data:
        accessKey: <AK base64编码>
        accessKeySecret: <SK base64 编码>
      kind: Secret
      metadata:
        name: ramuser
        namespace: kube-system
      type: Opaque
    2. 执行以下命令,创建名为ramuser的Secret。

      kubectl apply -f ramuser.yaml
  1. 创建自定义资源SecretStore关联对应的认证方式并部署。

    1. 使用以下内容,替换相关字段后,创建secretstore-ramrole.yaml文件。

      • <accountID>:替换为同步OOS加密参数的阿里云账号ID。

      • <roleName>:替换为步骤1中创建的RAM角色名称。

      • <secretName> :替换为存储AK、SK的Secret名称。

      • <secretNamespace> :替换为存储AK、SK的Secret的Namespace。

      • <secretKey> :替换为存储AK、SK的Secret Key。

      • <roleSessionName> :替换为角色会话名称(自定义字符串)。

        apiVersion: alibabacloud.com/v1alpha1
        kind: SecretStore
        metadata:
          name: scdemo-ramrole
        spec:
          OOS:
            OOSAuth:
              accessKey:
                name: <secretName>
                namespace: <secretNamespace>
                key: <secretKey>
              accessKeySecret:
                name: <secretName>
                namespace: <secretNamespace>
                key: <secretKey>
              ramRoleARN: "acs:ram::<accountID>:role/<roleName>"  
              ramRoleSessionName: <roleSessionName>
    2. 执行以下命令,部署SecretStore。

      kubectl apply -f secretstore-ramrole.yaml

步骤三:配置数据同步信息

认证信息配置完成后,您需要通过自定义资源ExternalSecret来配置待访问的OOS加密参数信息,从而将OOS加密参数导入到Kubernetes Secret。

说明

OOS加密参数导入的Kubernetes Secret的命名空间、名称均与ExternalSecret的命名空间、名称一致。

  1. 创建自定义资源ExternalSecret并部署。

    1. 使用以下内容,替换相关字段后,创建external.yaml文件。

      参数

      替换说明

      <OOS parameter name>

      必填,替换为目标OOS加密参数名称。

      <Kubernetes secret key>

      必填,为一系列键值对的集合。OOS的单个加密参数会存放在Kubernetes Secret Data的某一条键值对中,需将<Kubernetes secret key>替换为目标键值对的键。

      <secret store name>

      选填,替换为对应SecretStore的名称,表示使用某个认证配置来导入目标OOS加密参数。

      说明

      组件通过Worker RAM角色授权时,无需配置该参数。

      <secret store namespace>

      选填,替换为对应SecretStore的Namespace。

      说明

      组件通过Worker RAM角色授权时,无需配置该参数。

      apiVersion: alibabacloud.com/v1alpha1
      kind: ExternalSecret
      metadata:
        name: esdemo
      spec:
        provider: oos # 需要同步的阿里云服务类型,默认是kms,当同步OOS加密参数时,必须指定字段值为 oos
        data: # 无需特殊处理的数据源。
          - key: <OOS parameter name>
            name: <Kubernetes secret key>
            secretStoreRef:   # 组件通过Worker RAM授权时,无需配置该参数。
              name: <secret store name>
              namespace: <secret store namespace>
    2. 执行以下命令,部署ExternalSecret。

      kubectl apply -f external.yaml
  2. 执行以下命令,查看集群中是否存在对应的Kubernetes Secret。

    kubectl get secret esdemo

    查询存在Secret,表明Secret同步成功。

ack-secret-manager组件更多高级用法

跨账号同步加密参数

如果您的OOS实例与集群不在同一个阿里云账号中,您需要将OOS加密参数跨账号同步到集群中。ack-secret-manager支持跨账号同步加密参数。下文以RRSA认证方式为例,介绍如何将账号A中的OOS实例导入账号B的集群中。

OOS实例所在账号A下的配置步骤

  1. 创建信任集群所在账号的RAM角色。具体操作,请参见创建可信实体为阿里云账号的RAM角色

    重要

    在选择信任的云账号时,选择其他云账号,填入集群所在的阿里云账号B的账号ID。

  2. 创建访问OOS服务加密参数所需的权限策略。策略内容如下。具体操作,请参见创建自定义权限策略

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
             "oos:GetSecretParameter",
             "kms:GetSecretValue"
          ],
          "Resource": [
              "*"
          ],
          "Effect": "Allow"
        }
      ]
    }
  3. 为上一步创建的RAM角色授权。具体操作,请参见为RAM角色授权

集群所在账号B下的配置步骤

  1. 容器服务管理控制台开启集群的RRSA功能,用于创建集群的身份提供商信息具体操作,请参见启用RRSA功能

    说明

    安装ack-secret-manager时,需要将参数rrsa.enable设置为true,以启用RRSA功能。

  2. 创建可信实体为身份提供商的RAM角色,以供ack-secret-manager使用。主要参数设置如下,具体操作,请参见创建OIDC身份提供商的RAM角色

    配置项

    描述

    身份提供商类型

    OIDC

    身份提供商

    选择ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。

    条件

    • oidc:iss:保持默认。

    • oidc:aud:保持默认。

    • oidc:sub:需手动添加该条件。

      • 条件键:选择oidc:sub

      • 运算符:选择StringEquals

      • 条件值:输入system:serviceaccount:<namespace>:<serviceAccountName>。其中,<namespace>为应用所在的命名空间。<serviceAccountName>为服务账户名称。根据本文测试应用的信息,此处需填入system:serviceaccount:kube-system:ack-secret-manager

        说明

        如果您将ack-secret-manager安装在其他的命名空间,请将kube-system替换为对应命名空间的名称。

  3. 创建自定义授权策略并为上一步账号B下创建的RAM角色授权。

    1. 创建ack-secret-manager导入OOS加密参数时所需的权限策略。

      策略内容如下,其中Resource的值为在OOS所在账号A下创建的RAM角色的ARN。具体操作,请参见创建自定义权限策略

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Resource": "acs:ram:*:<account-id>:role/<role-name>"
          }
        ],
        "Version": "1"
      }

      上述自定义策略中的Resource为角色ARN,其中,<account-id>为OOS实例所在的阿里云账号A的账号ID,<role-name>为账号A中创建的RAM角色名称。关于如何查看角色ARN,请参见如何查看RAM角色的ARN?

    2. 为上一步在账号B下创建的RAM角色授权。具体操作,请参见为RAM角色授权

  4. 创建自定义资源SecretStore并部署。

    1. 使用以下内容,替换相关字段后,创建secretstore-ramrole.yaml文件。

      • <ACK-accountID>:替换为集群所在的阿里云账号B的账号ID。

      • <clusterID>:替换为您的集群ID。

      • <ACK-roleName>:替换为集群所在的阿里云账号B下创建的RAM角色的名称。

      • <OOS-accountID>:替换为OOS实例所在的阿里云账号A的账号ID。

      • <OOS-roleName>:替换为OOS实例所在的阿里云账号A下创建的RAM角色的名称。

      • <roleSessionName>:替换为角色会话名称(自定义字符串)。

      apiVersion: alibabacloud.com/v1alpha1
      kind: SecretStore
      metadata:
        name: scdemo-cross-account
      spec:
        OOS:
          OOSAuth:
            oidcProviderARN: "acs:ram::<ACK-accountID>:oidc-provider/ack-rrsa-<clusterID>"
            ramRoleARN: "acs:ram::<ACK-accountID>:role/<ACK-roleName>"
            remoteRamRoleARN: "acs:ram::<OOS-accountID>:role/<OOS-roleName>"
            remoteRamRoleSessionName: <roleSessionName>
  5. 配置数据同步信息。具体操作,请参见步骤三:配置数据同步信息

加密参数解析与Key替换

您可以参考以下方式对JSON格式和YAML格式的加密参数进行解析。

JSON格式的加密参数解析

JSON中指定的Key解析

如果您需要解析一个JSON格式的OOS Secret,并将其中指定的key-value键值对同步到Kubernetes Secret中,可以使用JMESPath字段。以下是一个使用JMESPath字段的样例,例如,如果您在OOS加密参数中有如下JSON格式的Secret。

{"name":"tom","friends":[{"name":"lily"},{"name":"mark"}]}

对应的ExternalSecret样例如下。当您使用JMESPath字段时,必须指定以下两个子字段:

  • path:必选项,基于JMESPath规范解析JSON中的指定字段。

  • objectAlias:必选项,用于指定解析出的字段同步到Kubernetes Secret中的Key名称。

apiVersion: alibabacloud.com/v1alpha1
kind: ExternalSecret
metadata:
  name: es-json-demo
spec:
  provider: oos
  data: 
    - key: <OOS parameter name>
      secretStoreRef:
        name: <secret store name>
        namespace: <secret store namespace>
      jmesPath: # Parse some fields in json string
        - path: "name"
          objectAlias: "myname"
        - path: "friends[0].name"
          objectAlias: "friendname"

JSON自解析

如果您不知道加密参数的具体结构,但还需要将JSON加密参数解析后再存储在Secret中,您可以定义dataProcess.extract字段采用JSON自解析功能,同时还可以定义dataProcess.replaceRule字段,针对解析后的字段键进行规则替换,以防止不规则的Secret data key导致无法创建Secret。

例如,如果您在OOS加密参数中有如下JSON格式的Secret。

{"/name-invalid":"lily","name-invalid/":[{"name":"mark"}]}

对应的ExternalSecret样例如下。

apiVersion: alibabacloud.com/v1alpha1
kind: ExternalSecret
metadata:
  name: extract-secret
spec:
  provider: oos
  dataProcess:
    - extract:
        key: <OOS parameter name>
        secretStoreRef:
          name: <secret store name>
          namespace: <secret store namespace>
      replaceRule: # 替换规则。
        - source: "^/.*d$" # 替换以“/“开头以”d“结尾的key为tom。
          target: "tom"
        - source: "^n.*/$" # 替换以”n“开头以”/“结尾的key为mark。
          target: "mark"

YAML格式的加密参数解析

YAML中指定的Key解析

如果您需要解析一个YAML格式的OOS Secret,并将其中指定的key-value键值对同步到Kubernetes Secret中,可以使用JMESPath字段。以下是一个使用JMESPath字段的样例,例如,如果您在OOS加密参数中有如下YAML格式的Secret。

name: tom
friends:
  - name: lily
  - name: mark

对应的ExternalSecret样例如下。当您使用JMESPath字段时,必须指定以下两个子字段:

  • path:必选项,基于JMESPath规范解析YAML中的指定字段。

  • objectAlias:必选项,用于指定解析出的字段同步到Kubernetes Secret中的Key名称。

apiVersion: alibabacloud.com/v1alpha1
kind: ExternalSecret
metadata:
  name: es-yaml-demo
spec:
  provider: oos
  data: 
    - key: <OOS parameter name>
      secretStoreRef:
        name: <secret store name>
        namespace: <secret store namespace>
      jmesPath: # Parse some fields in yaml string
        - path: "name"
          objectAlias: "myname"
        - path: "friends[0].name"
          objectAlias: "friendname"

YAML自解析

如果您不知道加密参数的具体结构,但还需要将YAML加密参数解析后再存储在Secret中,您可以定义dataProcess.extract字段采用YAML自解析功能,同时还可以定义dataProcess.replaceRule字段,针对解析后的字段键进行规则替换,以防止不规则的Secret data key导致无法创建Secret。

例如,如果您在OOS加密参数中有如下YAML格式的Secret。

/name-invalid: lily
name-invalid/:
  - name: mark

对应的ExternalSecret样例如下。

apiVersion: alibabacloud.com/v1alpha1
kind: ExternalSecret
metadata:
  name: extract-secret
spec:
  provider: oos
  dataProcess:
    - extract:
        key: <OOS parameter name>
        secretStoreRef:
          name: <secret store name>
          namespace: <secret store namespace>
      replaceRule: # 替换规则。
        - source: "^/.*d$" # 替换以“/“开头以”d“结尾的key为tom。
          target: "tom"
        - source: "^n.*/$" # 替换以”n“开头以”/“结尾的key为mark。
          target: "mark"

CRD 资源说明

当前提供了四种自定义资源定义(CRD),分为两类:

认证资源配置类

  1. SecretStore: 命名空间级别资源,用于定义访问凭据(如RRSA、ClientKey、AK配置等)。

  2. ClusterSecretStore: 集群级别资源,功能与SecretStore相同,但可被集群中任意命名空间的ExternalSecret引用,并支持访问控制配置。

数据同步配置类

  1. ExternalSecret: 命名空间级别资源,用于定义需要同步的凭据基础信息(如凭据名称、版本等)以及指定SecretStore。

  2. ClusterExternalSecret: 集群级别资源,用于管理和协调多个命名空间下的ExternalSecret,能够在匹配的命名空间中自动创建ExternalSecret。

集群级别资源说明

ClusterExternalSecret

集群级别资源,用于管理和协调多个命名空间下的ExternalSecret,支持使用 spec.namespaceSelectors 配置匹配的命名空间,在匹配的命名空间中自动创建ExternalSecret

apiVersion: "alibabacloud.com/v1alpha1"
kind: ClusterExternalSecret
metadata:
  name: cluster-kms
spec:
  externalSecretSpec:
    provider: kms
    data:
      - key: test
        name: test
        versionId: v1
        secretStoreRef:
          name: alibaba-credentials
          kind: ClusterSecretStore
  externalSecretName: kms
  externalSecretMetadata:
    labels:
      app: "my-app"
      team: "backend"
    annotations:
      annotation-key1: "annotation-value1"
      annotation-key2: "annotation-value2"
  namespaceSelectors:
  - matchLabels:
      kubernetes.io/metadata.name: default
  - matchExpressions: 
    - key: kubernetes.io/metadata.name
      operator: In
      values:
      - test
  rotationInterval: 10s

spec字段说明

crd 字段

描述

是否必选

externalSecretSpec

要创建的 ExternalSecret 的规格定义

externalSecretName

要创建的 ExternalSecret 的名称,默认是 ClusterExternalSecret 的名称

externalSecretMetadata

要创建的 ExternalSecret 的元数据

namespaceSelectors

用于选择目标命名空间的标签选择器列表

rotationInterval

控制器检查命名空间标签和协调对象的时间间隔

externalSecretMetadata字段说明

externalSecretMetadata 字段允许您自动为 ClusterExternalSecret 创建的 ExternalSecret 资源添加额外的元数据:

crd 字段

描述

是否必选

annotations

要创建的 ExternalSecret 的注解

labels

要创建的 ExternalSecret 的标签

ClusterSecretStore

集群级别资源,功能与SecretStore相同,但可被集群中任意命名空间的ExternalSecret引用,并支持使用 spec.conditions 配置访问控制

apiVersion: alibabacloud.com/v1alpha1
kind: ClusterSecretStore
metadata:
  name: alibaba-credentials
spec:
  conditions: 
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: test
  KMS:
    KMSAuth:
      oidcProviderARN: acs:ram::<role-name>:oidc-provider/ack-rrsa-<cluster-id>
      serviceAccountRef:
        name: test-serviceaccount-auth
        namespace: test

spec字段说明

crd 字段

描述

是否必选

conditions

定义允许访问该资源的命名空间条件

KMS

连接KMS凭据管家服务获取密钥

OOS

连接OOS服务获取加密参数

conditions字段说明

crd 字段

描述

是否必选

namespaceSelector

使用标签选择器匹配允许访问的命名空间

namespaces

明确列出允许访问的命名空间名称列表

namespaceRegexes

使用正则表达式匹配允许访问的命名空间名称列表

跨命名空间访问控制

为了增强安全性和灵活性,ack-secret-manager提供了多种跨命名空间访问控制机制:

ExternalSecret 引用 SecretStore 控制
  • 通过 command.enableCrossNamespaceSecretStore参数控制ExternalSecret是否可以跨命名空间引用SecretStore。

  • 默认值为true,即允许跨命名空间引用。

  • 设置为false时,ExternalSecret只能引用同命名空间的SecretStore。

SecretStore 引用认证资源控制
  • 通过 command.enableCrossNamespaceAuthRef参数控制SecretStore是否可以跨命名空间引用认证资源(ServiceAccount、AccessKey Secret)。

  • 默认值为true,即允许跨命名空间引用。

  • 设置为false时,SecretStore只能引用同命名空间的认证资源。

ClusterSecretStore 访问控制
  • ClusterSecretStore 通过 spec.conditions 字段定义允许访问该资源的命名空间条件

  • 支持三种访问控制方式,条件之间是或的关系:

    1. namespaceSelector:使用标签选择器匹配允许访问的命名空间。

    2. namespaces:明确列出允许访问的命名空间名称列表。

    3. namespaceRegexes:使用正则表达式匹配允许访问的命名空间名称列表。

      conditions: 
        - namespaceSelector:
            matchLabels:
              app: myapp
            matchExpressions: 
            - key: environment
              operator: In
              values:
              - dev
        - namespaces:
          - default
          - test
        - namespaceRegexes:
          - "kube-.*"

推荐使用方式

跨命名空间访问推荐方案

对于需要跨命名空间访问的场景,推荐使用以下组合:

  1. ClusterSecretStore + ExternalSecret:当多个命名空间需要使用相同的认证配置时。

  2. ClusterSecretStore + ClusterExternalSecret:当需要在多个命名空间中自动创建相同配置的ExternalSecret时。

安全最佳实践
  1. 最小权限原则:

    • 在不需要跨命名空间访问的场景中,将 command.enableCrossNamespaceSecretStore 和 command.enableCrossNamespaceAuthRef设置为false

    • 优先使用命名空间级别的资源(SecretStore 和 ExternalSecret)。

  2. 访问控制配置:

    • 使用 ClusterSecretStore 时,明确配置 spec.conditions 来限制可访问的命名空间。

    • 避免创建无访问限制的 ClusterSecretStore。

  3. 认证方式选择:

    • 优先使用 RRSA 或 ServiceAccount 方式进行认证,避免在配置中直接暴露AccessKey。

    • 将认证配置与数据配置分离,提高安全性。

  4. 非必要不使用 ClusterExternalSecret,以减少Secrets在不同命名空间中的泄露风险:

    • 如果业务需要在多个命名空间中同步Secrets实例,可以利用 spec.namespaceSelectors 精确控制 ExternalSecret 的创建范围。

相关文档

为了保护从OOS读取后缓存在ACK集群中的Secret,您可以对ACK集群Secret进行一键加密。具体操作,请参见使用阿里云KMS进行Secret的落盘加密