您可以在应用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托管集群。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 集群信息页面,单击集群资源页签,然后单击Worker RAM角色右侧链接。
  5. 在RAM角色基本信息的权限管理页签,单击以k8sWorkerRole****为前缀的权限策略名称
  6. 策略内容页签下,单击修改策略内容
  7. 在脚本编辑框中修改权限策略内容,增加以下授权规则,修改完成后单击下一步:编辑基本信息。然后单击确定
    策略
    {
      "Action": [
        "kms:GetSecretValue"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  8. 安装ack-secret-manager组件。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,选择市场 > 应用市场
    3. 应用目录页签下选中全部页签,在搜索框中搜索并选中ack-secret-manager
    4. 在弹出面板中,选择集群命名空间,然后单击下一步
    5. 参数配置页面,设置相应参数,然后单击确定

方式二:RRSA

RRSA适用于1.22版本的ACK托管集群和ASK集群。相比其他授权方式,RRSA授权方式可以实现Pod维度的权限隔离,推荐在多租场景下使用。

  1. 容器服务管理控制台开启集群的RRSA功能。具体操作,请参见启用RRSA功能
  2. 创建RAM角色。
    您需要创建ack-secret-manager组件使用的RAM角色。具体操作,请参见创建可信实体为阿里云账号的RAM角色
  3. 修改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"
      }
  4. 创建自定义授权策略并为步骤2已创建的RAM角色授权。
    1. 创建访问KMS服务凭据的自定义授权策略。
      策略内容如下。具体操作,请参见创建自定义授权策略
      {
        "Version": "1",
        "Statement": [
          {
            "Action": "kms:GetSecretValue",
            "Resource": "*",
            "Effect": "Allow"
          }
        ]
      }
    2. 步骤2已创建的RAM角色授权。具体操作,请参见为RAM角色授权
  5. 在集群中创建名称为alibaba-credentials的Secret,用于配置RRSA中的角色ARN和指定OIDC服务提供商ARN。
    1. 使用以下内容,创建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                           
    2. 执行以下命令,部署Secret。
      kubectl apply -f alibaba-credentials.yaml
  6. 安装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

    参数配置完成后的界面如下:

    para

方式三:通过设置AK扮演指定RAM角色

  1. 创建RAM角色。
    您需要创建ack-secret-manager组件使用的RAM角色。具体操作,请参见创建可信实体为阿里云账号的RAM角色
  2. 创建自定义授权策略并为上一步已创建的RAM角色授权。
    1. 创建访问KMS服务凭据的自定义授权策略。
      策略内容如下。具体操作,请参见创建自定义授权策略
      {
        "Version": "1",
        "Statement": [
          {
            "Action": "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. 在集群中创建名称为alibaba-credentials的Secret,用于配置角色扮演的凭证信息。
    1. 使用以下内容,创建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
    2. 执行以下命令,部署Secret。
      kubectl apply -f alibaba-credentials.yaml
  5. 安装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

    参数配置完成后的界面如下:

    para1