网站内容维护合同,学院网站板块,wordpress中文插件推荐,推广营销方案基本概念
KMS#xff0c;Key Management Service#xff0c;即密钥管理服务#xff0c;在K8S集群中#xff0c;以驱动和插件的形式启用对Secret#xff0c;Configmap进行加密。以保护敏感数据#xff0c;
驱动和插件需要使用者按照需求进行定制和实现自己的KMS插件Key Management Service即密钥管理服务在K8S集群中以驱动和插件的形式启用对SecretConfigmap进行加密。以保护敏感数据
驱动和插件需要使用者按照需求进行定制和实现自己的KMS插件插件可以是gRPC服务器或者启用一个云服务商提供的KMS插件。
本文中演示使用的KMS 服务是京东云舰中的KMS加密服务。
目前KMS分为V1V2本文基于V1进行演示。
架构
内部可以利用kms加密实现自己的加密算法甚至国密算法。 当用户新建secret资源时kube-apiserver 会通过gRPC调用kms-plugin而kms-plugin与加密服务器通信进行数据加密。
此时如果通过直接获取etcd中的原始数据内容为密文数据。
当用户获取secret资源内容时kube-apiserver 会通过gRPC调用kms-plugin而kms-plugin与加密服务器通信进行数据解密将明文展示给用户
操作步骤
需要一套已经运行的Kubernetes集群服务如果是多台master节点需要同时配置。
新建目录
/etc/kubernetes/kms/jdcloud
新建 EncryptionConfiguration
该配置是kms基本的加密配置包括加密资源对象socket地址等等。
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:- resources:- secrets # 这里表示只加密secretproviders:- kms:name: myKmsPluginendpoint: unix:///var/run/k8s-kms-plugin/kms-plugin.sock # 如果不以podjdcloud-kms-plugin.yaml启动需要sock文件放到master节点。cachesize: 100timeout: 3s- identity: {}
以上内容保存在/etc/kubernetes/kms/jdcloud/apiserver-encryption.conf
新建 jdcloud kms plugin 配置
kms server的上联信息配置
{AccessKey: xxx, # 部署前该参数需要预先知道SecretKey: yyy, # 部署前该参数需要预先知道。KmsEndpoint: kms.internal.cn-north-1.jdcloud-api.com, # 部署前该参数需要预先知道。KmsKeyId: abcd, # 部署前该参数需要预先知道。KmsSchema: http,GRPCSocketPath: /var/run/k8s-kms-plugin/kms-plugin.sock
}
以上内容保存在/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json
新建 jdcloud kms plugin 服务
该服务是启动socket服务并按照配置和上联的kms server进行通信加密和解密数据并通过socket服务和K8S APIServer交互。
该pod需要在kube-apiserver启动之前启动否则与apiserver可能产生循环依赖。
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:component: jdcloud-kms-plugintier: control-planename: jdcloud-kms-plugin-node-01namespace: kube-system
spec:containers:- command:- /k8s-kms-plugin- -f/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 指定jsonimage: hub-pub.jdcloud.com/k8s/jdcloudsec/k8s-kms-plugin:v1.0.1 imagePullPolicy: IfNotPresentname: jdcloud-kms-pluginresources:requests:cpu: 250mvolumeMounts:- mountPath: /etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 注意路径name: jdcloud-kms-plugin-configfilereadOnly: true- mountPath: /var/run/k8s-kms-plugin/name: k8s-kms-plugin-unixsock-directoryreadOnly: falsehostNetwork: truepriorityClassName: system-cluster-criticalvolumes:- hostPath:path: /etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 注意路径type: Filename: jdcloud-kms-plugin-configfile- hostPath:path: /var/run/k8s-kms-plugin/type: DirectoryOrCreatename: k8s-kms-plugin-unixsock-directory
status: {}
以上内容保存在/etc/kubernetes/manifests/jdcloud-kms-plugin.yaml
修改 kube apiserver配置
...- --encryption-provider-config/etc/kubernetes/kms/jdcloud/apiserver-encryption.confimage: hub-pub.jdcloud.com/k8s/kube-apiserver:v1.19.9-109imagePullPolicy: IfNotPresentlivenessProbe:
...- mountPath: /etc/kubernetes/kms/jdcloud/apiserver-encryption.confname: apiserver-encryption-confreadOnly: true- mountPath: /var/run/k8s-kms-plugin/name: k8s-kms-plugin-unixsock-directoryreadOnly: false
...- hostPath:path: /etc/kubernetes/kms/jdcloud/apiserver-encryption.conftype: Filename: apiserver-encryption-conf- hostPath:path: /var/run/k8s-kms-plugin/type: DirectoryOrCreatename: k8s-kms-plugin-unixsock-directory
修改后保存
验证
在默认的命名空间里创建一个名为 secret1 的 Secret
kubectl create secret generic secret1 -n default --from-literalmykeymydata
用 etcdctl 命令行从 etcd 读取出 Secret
etcdctl.sh get /kubernetes.io/secrets/default/secret1 [...] | hexdump -C
结果为加密数据
验证 Secret 在被 API server 获取时已被正确解密
kubectl describe secret secret1 -n default
该结果为明文mykey: mydata
产品能力
在K8S集群中京东内部一直比较重视对敏感数据加密特别是云舰面对越来越多的金融行业客户加密服务基本是云舰中的标准配置。
经过产品能力打磨和内部实现KMS 加密服务和K8S自动化集群以及一键配置创建都在云舰内实现了很好的产品化能力可以随集群创建一键启用KMS加密服务。 参考
1. 使用 KMS 驱动进行数据加密 作者京东科技 王晓飞 来源京东云开发者社区 转载请注明来源