基本概念
KMS,Key Management Service,即密鑰管理服務(wù),在K8S集群中,以驅(qū)動(dòng)和插件的形式啟用對(duì)Secret,Configmap進(jìn)行加密。以保護(hù)敏感數(shù)據(jù),
驅(qū)動(dòng)和插件需要使用者按照需求進(jìn)行定制和實(shí)現(xiàn)自己的KMS插件,插件可以是gRPC服務(wù)器或者啟用一個(gè)云服務(wù)商提供的KMS插件。
本文中演示使用的KMS 服務(wù)是京東云艦中的KMS加密服務(wù)。
目前KMS分為V1,V2,本文基于V1進(jìn)行演示。
架構(gòu)
內(nèi)部可以利用kms加密實(shí)現(xiàn)自己的加密算法,甚至國密算法。
當(dāng)用戶新建secret資源時(shí),kube-apiserver 會(huì)通過gRPC調(diào)用kms-plugin,而kms-plugin與加密服務(wù)器通信,進(jìn)行數(shù)據(jù)加密。
此時(shí)如果通過直接獲取etcd中的原始數(shù)據(jù),內(nèi)容為密文數(shù)據(jù)。
當(dāng)用戶獲取secret資源內(nèi)容時(shí),kube-apiserver 會(huì)通過gRPC調(diào)用kms-plugin,而kms-plugin與加密服務(wù)器通信,進(jìn)行數(shù)據(jù)解密,將明文展示給用戶。
操作步驟
需要一套已經(jīng)運(yùn)行的Kubernetes集群服務(wù),如果是多臺(tái)master節(jié)點(diǎn),需要同時(shí)配置。
新建目錄
/etc/kubernetes/kms/jdcloud
新建 EncryptionConfiguration
該配置是kms基本的加密配置,包括加密資源對(duì)象,socket地址等等。
apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets # 這里表示,只加密secret providers: - kms: name: myKmsPlugin endpoint: unix:///var/run/k8s-kms-plugin/kms-plugin.sock # 如果不以pod(jdcloud-kms-plugin.yaml)啟動(dòng),需要sock文件放到master節(jié)點(diǎn)。 cachesize: 100 timeout: 3s - identity: {}
以上內(nèi)容保存在/etc/kubernetes/kms/jdcloud/apiserver-encryption.conf
新建 jdcloud kms plugin 配置
kms server的上聯(lián)信息配置
{ "AccessKey": "xxx", # 部署前,該參數(shù)需要預(yù)先知道, "SecretKey": "yyy", # 部署前,該參數(shù)需要預(yù)先知道。 "KmsEndpoint": "kms.internal.cn-north-1.jdcloud-api.com", # 部署前,該參數(shù)需要預(yù)先知道。 "KmsKeyId": "abcd", # 部署前,該參數(shù)需要預(yù)先知道。 "KmsSchema": "http", "GRPCSocketPath": "/var/run/k8s-kms-plugin/kms-plugin.sock" }
以上內(nèi)容保存在/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json
新建 jdcloud kms plugin 服務(wù)
該服務(wù)是啟動(dòng)socket服務(wù),并按照配置和上聯(lián)的kms server進(jìn)行通信,加密和解密數(shù)據(jù),并通過socket服務(wù)和K8S APIServer交互。
該pod需要在kube-apiserver啟動(dòng)之前啟動(dòng),否則與apiserver可能產(chǎn)生循環(huán)依賴。
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: component: jdcloud-kms-plugin tier: control-plane name: jdcloud-kms-plugin-node-01 namespace: kube-system spec: containers: - command: - /k8s-kms-plugin - -f=/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 指定json image: hub-pub.jdcloud.com/k8s/jdcloudsec/k8s-kms-plugin:v1.0.1 imagePullPolicy: IfNotPresent name: jdcloud-kms-plugin resources: requests: cpu: 250m volumeMounts: - mountPath: /etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 注意路徑 name: jdcloud-kms-plugin-configfile readOnly: true - mountPath: /var/run/k8s-kms-plugin/ name: k8s-kms-plugin-unixsock-directory readOnly: false hostNetwork: true priorityClassName: system-cluster-critical volumes: - hostPath: path: /etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 注意路徑 type: File name: jdcloud-kms-plugin-configfile - hostPath: path: /var/run/k8s-kms-plugin/ type: DirectoryOrCreate name: k8s-kms-plugin-unixsock-directory status: {}
以上內(nèi)容保存在/etc/kubernetes/manifests/jdcloud-kms-plugin.yaml
修改 kube apiserver配置
... - --encryption-provider-config=/etc/kubernetes/kms/jdcloud/apiserver-encryption.conf image: hub-pub.jdcloud.com/k8s/kube-apiserver:v1.19.9-109 imagePullPolicy: IfNotPresent livenessProbe: ... - mountPath: /etc/kubernetes/kms/jdcloud/apiserver-encryption.conf name: apiserver-encryption-conf readOnly: true - mountPath: /var/run/k8s-kms-plugin/ name: k8s-kms-plugin-unixsock-directory readOnly: false ... - hostPath: path: /etc/kubernetes/kms/jdcloud/apiserver-encryption.conf type: File name: apiserver-encryption-conf - hostPath: path: /var/run/k8s-kms-plugin/ type: DirectoryOrCreate name: k8s-kms-plugin-unixsock-directory
修改后保存
驗(yàn)證
在默認(rèn)的命名空間里創(chuàng)建一個(gè)名為 secret1 的 Secret:
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
用 etcdctl 命令行,從 etcd 讀取出 Secret:
etcdctl.sh get /kubernetes.io/secrets/default/secret1 [...] | hexdump -C
結(jié)果為加密數(shù)據(jù)
驗(yàn)證 Secret 在被 API server 獲取時(shí)已被正確解密:
kubectl describe secret secret1 -n default
該結(jié)果為明文,mykey: mydata
產(chǎn)品能力
在K8S集群中,京東內(nèi)部一直比較重視對(duì)敏感數(shù)據(jù)加密,特別是云艦面對(duì)越來越多的金融行業(yè)客戶,加密服務(wù)基本是云艦中的標(biāo)準(zhǔn)配置。
經(jīng)過產(chǎn)品能力打磨和內(nèi)部實(shí)現(xiàn),KMS 加密服務(wù)和K8S自動(dòng)化集群以及一鍵配置創(chuàng)建都在云艦內(nèi)實(shí)現(xiàn)了很好的產(chǎn)品化能力,可以隨集群創(chuàng)建,一鍵啟用KMS加密服務(wù)。
參考:
1. 使用 KMS 驅(qū)動(dòng)進(jìn)行數(shù)據(jù)加密
審核編輯 黃宇
-
數(shù)據(jù)安全
+關(guān)注
關(guān)注
2文章
681瀏覽量
29950 -
KMS
+關(guān)注
關(guān)注
0文章
3瀏覽量
4684
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論