ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] 原来没有加密secret数据直接存储在etcd数据库上的,这样子存在一定的风险。 kubernetes 提供静态加密 Secret 数据的方法。 > **重要**: 如果通过加密配置无法读取资源(因为密钥已更改),唯一的方法是直接从底层 etcd 中删除该密钥。 任何尝试读取资源的调用将会失败,直到它被删除或提供有效的解密密钥。 ## 加密数据 1. 创建新的加密配置文件 ```yaml apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - secretbox: keys: - name: key1 secret: <BASE 64 ENCODED SECRET> - identity: {} ``` > - `head -c 32 /dev/urandom | base64` 生成一个 32 字节的随机密钥并进行 base64 编码,将这个值放入到 secret 字段中。 > - 【重要】secret 字段不能被改,或者该文件不能丢失 2. 修改 kube-apiserver 的配置文件 设置 kube-apiserver 的 --experimental-encryption-provider-config 参数,将其指向 配置文件所在位置。 > 示例:--encryption-provider-config=/root/secret.yml 3. 重启 kube-apiserver ```shell systemctl restart kube-apiserver.service ``` 4. 验证 ```shell $ kubectl create secret generic secret1 -n default --from-literal=mykey=mydata secret/secret1 created # 新建的secret,不合protobuf格式,所以解析不到。由于被加密的原因 $ etcdhelper get /registry/secrets/default/secret1 WARN: unable to decode /registry/secrets/default/secret1: yaml: control characters are not allowed # 新建的secret,呈现乱码 etcdctl --cacert /data/etcd/certs/ca.pem --cert /data/etcd/certs/etcd.pem --key /data/etcd/certs/etcd-key.pem --endpoints=https://192.168.31.95:2379,https://192.168.31.78:2379,https://192.168.31.253:2379 get /registry/secrets/default/secret1 /registry/secrets/default/secret1 k8s:enc:secretbox:v1:key1:uKAE+G>\$e29&u/9oisX_]s#!9-=تD4ɯ02 # 以前的secret,还可以正常解析 $ etcdhelper get /registry/secrets/default/app-v1-tls /v1, Kind=Secret { "kind": "Secret", "apiVersion": "v1", "metadata": { "name": "app-v1-tls", "namespace": "default", "uid": "55d3ce46-1f18-4b7a-9e6a-8dff6f49ea9b", "creationTimestamp": "2022-01-12T06:18:06Z", "managedFields": [ ... } ``` 5. 确保所有 Secret 都被加密 ```shell kubectl get secrets --all-namespaces -o json | kubectl replace -f - ``` ## 解密数据 1. 修改加密配置文件 请将 identity provider 作为配置中的第一个条目。 ```yaml apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - identity: {} # 将此项移动到 provider 第一项 - secretbox: keys: - name: key1 secret: uXl5US+HQCIGZL6IRvLXgq11O9dZbbqODJ8onZINhaA= ``` > 其他内部都不变 2. 重启kube-apiserver ```shell systemctl restart kube-apiserver.service ``` 3. 确保所有 Secret 都被解密 ```shell kubectl get secrets --all-namespaces -o json | kubectl replace -f - ``` 4. 验证 ```shell $ etcdhelper get /registry/secrets/default/secret1 /v1, Kind=Secret { "kind": "Secret", "apiVersion": "v1", "metadata": { "name": "secret1", "namespace": "default", "uid": "2171177e-4392-4ce3-9391-2aea38364a0e", "creationTimestamp": "2022-01-28T09:03:35Z", "managedFields": [ { "manager": "kubectl", "operation": "Update", "apiVersion": "v1", "time": "2022-01-28T09:03:35Z", "fieldsType": "FieldsV1", "fieldsV1": {"f:data":{".":{},"f:mykey":{}},"f:type":{}} } ] }, "data": { "mykey": "bXlkYXRh" }, "type": "Opaque" } $ kubectl get secrets NAME TYPE DATA AGE app-v1-tls kubernetes.io/tls 2 16d app-v2-tls-ca Opaque 1 11d app-v2-tls-server Opaque 2 11d default-token-zmhtw kubernetes.io/service-account-token 3 144d jiaxzeng-token-fwk7j kubernetes.io/service-account-token 3 174m secret1 Opaque 1 19m ``` 5. 修改 kube-apiserver 的配置文件 移除 kube-apiserver 的 --experimental-encryption-provider-config 参数。 6. 重启kube-apiserver ```shell systemctl restart kube-apiserver.service ``` ## 参考文章 https://kubernetes.io/zh/docs/tasks/administer-cluster/encrypt-data/