使用KMS对etcd数据加密
所有文档

          容器引擎 CCE

          使用KMS对etcd数据加密


          您可以使用密钥管理服务(Key Management Service,简称:KMS)中创建的密钥加密 Kubernetes Secret 数据。本文主要介绍如何使用 KMS 服务对存储在 etcd 中的 Kubernetes Secret 数据进行加密。

          前提条件

          配置 KMS 多用户访问控制并获取 AKSK

          创建子用户

          1. 主账号用户登录后在控制台选择“多用户访问控制”进入用户管理页面。

          kms-image-1.png

          1. 在左侧导航栏点击“用户管理”,在“用户管理 > 子用户”列表页,点击“创建子用户”,勾选编程访问。

          kms-image-2.png

          1. 下载并保存 AKSK,KMS 插件部署时需使用该 AKSK。

          kms-image-3.png

          配置策略

          1. 创建策略:页面左侧选择"策略管理",在新的页面中点击"创建策略",选择"按策略生成器创建"。

          kms-image-4.png

          1. 添加权限:点击添加权限,选择"密钥管理服务 KMS"、"加解密",填写完成后确认。

          kms-image-5.png

          配置子用户权限

          左侧导航栏点击“用户管理 -> 子用户”列表页,在对应子用户右侧点击 "编辑权限",勾选策略并确认。

          kms-image-6.png

          安装 k8s-cloudkms-plugin 插件

          下列操作需要在每台 master 节点上依次执行

          下载 k8s-cloudkms-plugin 二进制文件。

          wget -O /opt/kube/bin/k8s-cloudkms-plugin https://cce-plugin.bj.bcebos.com/kms-plugin/v1.0.0/k8s-cloudkms-plugin
          
          chmod +x /opt/kube/bin/k8s-cloudkms-plugin

          创建 k8s-cloudkms-plugin 配置文件,并填入必要信息(AKSK 建议使用上文中保存的值),内容如下:

          vim /etc/systemd/system/k8s-cloudkms-plugin.service
          
          [Unit]
          Description=Kubernetes kms plugin
          After=network.target
          
          [Service]
          ExecStart=/opt/kube/bin/k8s-cloudkms-plugin \
          --region={{region}} \
          --key-id={{Kms Key ID}} \
          --access-key={{Access Key ID}} \
          --secret-key={{Secret Access Key}} \
          --kms-endpoint={{Kms Endpoint}}
          Restart=always
          Type=simple
          LimitNOFILE=65536
          
          [Install]
          WantedBy=multi-user.target

          北京地域配置如下:

          [Unit]
          Description=Kubernetes kms plugin
          After=network.target
          
          [Service]
          ExecStart=/opt/kube/bin/k8s-cloudkms-plugin \
          --region=bj \
          --key-id=your-kms-key-id \
          --access-key=your-ak-id \
          --secret-key=your-sk-id \
          --kms-endpoint=https://bkm.bj.baidubce.com
          Restart=always
          Type=simple
          LimitNOFILE=65536
          
          [Install]
          WantedBy=multi-user.target

          启动 k8s-cloudkms-plugin

          systemctl daemon-reload && systemctl enable k8s-cloudkms-plugin.service && systemctl restart k8s-cloudkms-plugin.service

          创建 kms-encryption-config.yaml 例子如下:

          vim /etc/kubernetes/kms-encryption-config.yaml
          
          kind: EncryptionConfiguration
          apiVersion: apiserver.config.k8s.io/v1
          resources:
            - resources:
              - secrets
              providers:
              - kms:
                  name: cceKMSPlugin
                  endpoint: unix:///var/run/kmsplugin/socket.sock
                  cachesize: 1000
                  timeout: 3s
              - identity: {}

          增加 kube-apiserver启动参数: --encryption-provider-config 开启 etcd 落盘加密, 例子如下:

          vim /etc/systemd/system/kube-apiserver.service
          
          ...
          --v=6 \
          --encryption-provider-config=/etc/kubernetes/kms-encryption-config.yaml \
          --requestheader-client-ca-file=/etc/kubernetes/pki/ca.pem \
          ...
          
          # 重启 kube-apiserver
          systemctl daemon-reload && systemctl restart kube-apiserver.service

          依次操作完所有master节点即可。

          验证

          1. 在集群中新建 Secret

            kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
          2. 执行下列命令,验证 Secret 已正确解密。

            # 输出结果为 mydata
            kubectl get secret secret1 -o=jsonpath='{.data.mykey}' | base64 -d
          3. (可选)验证 etcd 中数据是否已加密,登录master节点,替换下列命令中的IP为机器IP,并执行:

            ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://{hostIP}:2379 get  /registry/secrets/default/secret1 | hexdump -C
            # 输出结果包含:cceKMSPlugin,且没有明文数据, 则加密成功
          4. 如需对所有 secret 加密落盘,可执行:

            kubectl get secrets --all-namespaces -o json| kubectl replace -f -

          参考文档

          上一篇
          CCE 支持周期、定时伸缩部署最佳实践
          下一篇
          通过 CCE Ingress 实现虚机和容器服务的统一接入