容器引擎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 支持周期、定时伸缩部署最佳实践
    下一篇
    API参考