【AliCloud】ack + ack-secret-manager + kms 敏感数据安全存储

介绍

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

模块图(Modules Digram)

集成

ACK 即是Aliyun Kubernetes, 阿里云提供了若干版本的k8s云上集群,这边测试选用ack-serverless版本。

假设你有一套ack(ali cloud k8s)集群,一般来说我们的敏感数据会选用k8s secrets组件来存储。如下:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: my-namespace
type: Opaque
data:
  xx_token: <BASE64ENCODE Your Secret Value>

xx_token 一般来说默认的加密是基于base64。但是这样的加密程度是远远不够的。几乎还是裸奔的存在。但是我们也可以依赖一些插件选择合适的加密算法进行加密来避免简单base64 encode。这是一种解决方案。

由于aliyun已经提供了一个密钥凭据管理的组件KMS。他在提供了加密存储的同时也对加解密的性能提供了SLA和Latency的保证。支持一些rotate的策略,并且支持多个VPC账号的访问,对于企业级应用来说是个不错的选择。

那么我们接下来就操作下如何在ack中集成kms,让你的pod可以访问使用kms的凭据。

安装ack-secret-manager组件

手动方式

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

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

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

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

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

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

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

Helm安装ack-secret-manager

helm 配置链接你的ack集群,请自行查询helm 使用。简单来说是在kubectl之上封装了一层,可以帮我们生成我们需要发布的yaml并且带有版本控制概念。

  1. 首先安装helm,然后下载ack-secret-manger的chart包
    下载地址:https://github.com/AliyunContainerService/ack-secret-manager/tree/master

  2. 运行命令安装

    helm install ./ack-secret-manager ack-secret-manager
    

配置组件认证信息RRSA

说明

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

  1. 容器服务管理控制台开启集群的RRSA功能。具体操作,请参见启用RRSA功能

  2. 创建可信实体为身份提供商的RAM角色,以供ack-secret-manager使用。

    说明

    阿里云账号(主账号)对账号中的资源具有完全管理权限,您也可以在RAM中创建一个RAM用户,授予AdministratorAccess权限,充当账号管理员,该管理员可以对账号下所有云资源进行管控操作。更多信息,请参见创建RAM用户作为账号管理员

    1. 使用阿里云账号(主账号)登录RAM控制台

    2. 在左侧导航栏,选择身份管理 > 角色

    3. 角色 页面,单击创建角色

    4. 创建角色 页面,选择可信实体类型为身份提供商 ,然后单击下一步

    5. 在配置角色页面,配置如下角色信息后,单击完成

|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 置项 | 描述 |
| 角色名称 | 自定义角色名称。 |
| 备注 | 选填有关该角色的备注信息。 |
| 身份提供商类型 | OIDC。 |
| 选择身份提供商 | ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。 |
| 限制条件 | 说明 如果您将ack-secret-manager安装在其他的命名空间,请将kube-system替换为对应命名空间的名称。 * oidc:iss:保持默认。 * oidc:aud :选择sts.aliyuncs.com。 * oidc:sub :条件判定方式选择StringEquals ,值的格式为system:serviceaccount:<namespace>:<serviceAccountName>。 * <namespace>:应用所在的命名空间。 * <serviceAccountName>:服务账户名称。 * 根据测试应用的信息,此处需要填入system:serviceaccount:kube-system:ack-secret-manager。 |

terraform 创建, 关于terraform语法自行百度或者查阅官方文档。

# Role
resource "alicloud_ram_role" "default" {
  name        = role_name
  document    = <<EOF
  {
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "oidc:aud": [
            "sts.aliyuncs.com"
          ],
          "oidc:iss": "https://oidc-ack-<region>.oss-<regionID>.aliyuncs.com/<your-ack-cluster-id>",
          "oidc:sub": "system:serviceaccount:<your namespace>:<service account name>"
        }
      },
      "Effect": "Allow",
      "Principal": {
        "Federated": [
          "<oidc-provider-arn>"
        ]
      }
    }
  ],
  "Version": "1"
  }
  EOF
  description = "desc"
}

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

  1. 创建ack-secret-manager导入KMS凭据时所需的权限策略。

    {
        "Action": [
           "kms:GetSecretValue",
           "kms:Decrypt"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }
    

    使用terraform创建, 关于terraform语法自行百度或者查阅官方文档。

    resource "alicloud_ram_policy" "default" {
      policy_name     = your policy name
      policy_document = <<EOF
      {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "kms:GetSecretValue",
                    "kms:Decrypt"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
      }
      EOF
      description     = "desc"
    }
    
    • 为上一步创建的RAM角色授权。具体操作,请参见为RAM角色授权

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

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

      1.{roleName}:替换为步骤2中创建的RAM角色名称。
      2.{clusterID}:替换为您的集群ID。
      3.{accountID}:替换为同步KMS凭据的阿里云账号ID。

    apiVersion: 'alibabacloud.com/v1alpha1'
    kind: SecretStore
    metadata:
    name: scdemo-rrsa
    spec:
    KMS:
    KMSAuth:
    oidcProviderARN: "acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}"
    ramRoleARN: "acs:ram::{accountID}:role/{roleName}"

执行以下命令,部署SecretStore。

配置数据同步信息

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

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

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

    apiVersion: 'alibabacloud.com/v1alpha1'
    kind: ExternalSecret
    metadata:
      name: esdemo
    spec:
      data: # 无需特殊处理的数据源。
        - key: {KMS secret name}
          name: {Kubernetes secret key}
          versionStage: {KMS secret version stage}
          secretStoreRef:
            name: {secret store name}
            namespace: {secret store namespace}
    

    2.执行以下命令,部署ExternalSecret。

    kubectl apply -f external.yaml
    

执行以下命令,查看集群中是否存在对应的Kubernetes Secret生成。

kubectl get secret esdemo

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

相关推荐
hotlinhao1 天前
阿里云IIS虚拟主机部署ssl证书
阿里云·云计算·ssl
daizikui1 天前
docker使用阿里云容器镜像服务下载公共镜像
阿里云·docker·容器
天草二十六_简村人1 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
技术-hxy1 天前
由于centos停更,yum、docker等不支持,采用阿里云仓库搭建K8S
centos·k8s
tundra381 天前
DTH11传感器温度湿度+esp8266+阿里云+小程序
阿里云·小程序·云计算
联蔚盘云1 天前
阿里云 DevOps 资源安全扫描实践
安全·阿里云·devops
广东航连科技1 天前
RFID手持终端的国内外参数标准
大数据·网络·人工智能·物联网·安全·阿里云·交通物流
天草二十六_简村人2 天前
kubepi管理k8s集群,演示如何连接阿里云k8s容器
运维·阿里云·云原生·容器·kubernetes·云计算
九河云2 天前
阿里云轻量应用服务器可以用在哪些场景呢
服务器·阿里云·云计算
智慧城市20302 天前
109页PPT丨全面优化:制造企业运营生产成本削减战略与实践指南
阿里云·策略模式