使用ack-secret-manager导入阿里云OOS加密参数

更新时间:2025-03-24 06:16:11

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

image

安全说明

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

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

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

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

鉴于上述原因,如果应用中并不需要密文的持久化存储,推荐通过RRSA配置ServiceAccountRAM权限实现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 加密参数),配置不当可能会引发OOSRAM侧的限流,因此,您需要配置以下限流参数避免发生限流。imagecommand.maxConcurrentOosSecretPulls:每秒可以同步的最大OOS加密参数数量,默认为10。

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

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

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

  • 通过RRSA授权:适用于1.22及以上版本的ACK托管集群ACK Serverless集群

  • 为集群对应的Worker RAM角色添加权限:适用于ACK托管集群ACK专有集群ACK One注册集群

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

通过RRSA授权
为集群对应的Worker RAM角色添加权限
通过设置AK扮演指定RAM角色

RRSA适用于1.22及以上版本的ACK托管集群ACK Serverless集群。相比其他授权方式,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加密参数时所需的权限策略。策略内容如下。具体操作,请参见创建自定义权限策略

      {
          "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

由于ACK Serverless集群没有绑定Worker RAM角色,该方式只适用于ACK托管集群ACK专有集群ACK One注册集群

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

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

适用于所有容器服务Kubernetes集群。

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

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

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

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

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

    1. 创建扮演上述角色的自定义授权策略。策略内容如下。具体操作,请参见创建自定义权限策略

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Resource": "acs:ram::***:role/****"  # 方式三的步骤1创建的RAM角色ARN。
              }
          ],
          "Version": "1"
      }
    2. 为指定的RAM用户授权。具体操作,请参见RAM用户授权

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

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

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

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

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

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

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

      • {secretName} :替换为存储AK、SKSecret名称。

      • {secretNamespace} :替换为存储AK、SKSecretNamespace。

      • {secretKey} :替换为存储AK、SKSecret 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}

      替换为对应SecretStoreNamespace。

      说明

      组件通过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服务加密参数所需的权限策略。策略内容如下。具体操作,请参见创建自定义权限策略

    {
        "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>" # OOS所在账号A下的RAM角色的ARN。
          }
        ],
        "Version": "1"
      }

      上述自定义策略中的Resource为角色ARN,其中,<account-id>KMS实例所在的阿里云账号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中指定的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"

相关文档

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

  • 本页导读 (1)
  • 安全说明
  • 前提条件
  • 步骤一:安装ack-secret-manager组件
  • 步骤二:配置组件认证信息
  • 步骤三:配置数据同步信息
  • ack-secret-manager组件更多高级用法
  • 跨账号同步加密参数
  • 加密参数解析与Key替换
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等