K8S集群中使用JDOS KMS服务对敏感数据安全加密 | 京东云技术团队
基本概念
KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据,
驱动和插件需要使用者按照需求进行定制和实现自己的KMS插件,插件可以是gRPC服务器或者启用一个云服务商提供的KMS插件。
本文中演示使用的KMS 服务是京东云舰中的KMS加密服务。
目前KMS分为V1,V2,本文基于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 # 这里表示,只加密secret providers: - kms: name: myKmsPlugin endpoint: unix:///var/run/k8s-kms-plugin/kms-plugin.sock # 如果不以pod(jdcloud-kms-plugin.yaml)启动,需要sock文件放到master节点。 cachesize: 100 timeout: 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: 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: {}
以上内容保存在/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
修改后保存
验证
在默认的命名空间里创建一个名为 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
结果为加密数据
验证 Secret 在被 API server 获取时已被正确解密:
kubectl describe secret secret1 -n default
该结果为明文,mykey: mydata
产品能力
在K8S集群中,京东内部一直比较重视对敏感数据加密,特别是云舰面对越来越多的金融行业客户,加密服务基本是云舰中的标准配置。
经过产品能力打磨和内部实现,KMS 加密服务和K8S自动化集群以及一键配置创建都在云舰内实现了很好的产品化能力,可以随集群创建,一键启用KMS加密服务。
参考:
作者:京东科技 王晓飞
来源:京东云开发者社区 转载请注明来源
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
chineseocr —— 中文自然场景 OCR 工具
chineseocr 是一款OCR 工具,基于 yolo3 与 crnn 实现中文自然场景文字检测及识别。 实现功能 文字方向检测 0、90、180、270度检测(支持dnn/tensorflow) 支持(darknet/opencv dnn /keras)文字检测,支持darknet/keras训练 不定长OCR训练(英文、中英文) crnn\dense ocr 识别及训练 ,新增pytorch转keras模型代码(tools/pytorch_to_keras.py) 支持darknet 转keras, keras转darknet, pytorch 转keras模型 身份证/火车票结构化数据识别 新增CNN+ctc模型,支持DNN模块调用OCR,单行图像平均时间为0.02秒以下 运行效果
- 下一篇
【实践篇】DDD脚手架及编码规范 | 京东云技术团队
一、背景介绍 我们团队一直在持续推进业务系统的体系化治理工作,在这个过程中我们沉淀了自己的DDD脚手架项目。脚手架项目是体系化治理过程中比较重要的一环,它的作用有两点: (1)可以对新建的项目进行统一的规范; (2)对于指导老项目进行DDD的改造提供指导。 本文主要是梳理和总结了DDD脚手架使用中的编码规范以及遇到的问题。 二、脚手架的理论基础 DDD相关的应用架构有很多种,比如四层架构,洋葱架构,六边形架构,整洁架构等。这些应用架构都有各自的特点和不同。但是他们的总体思想都是相似的,主要是通过分层来实现功能和关注点的隔离。达到的目标是领域层不依赖任何其他外部实现,这样就能保证核心业务逻辑的干净和稳定。 左图是整洁架构的示意图,左图为分层,右图表示各个分层的变化频率和抽象层级。整洁架构主要分为4层: (1)Frameworks&Drivers层:这一层表示系统依赖的外部系统,比如数据库、缓存、前端页面等。这一层是变化频率最高的,也是需要和我们的核心业务逻辑做隔离的。 (2)Interface Adapters层:这一层是一个适配层,主要负责外部系统和内部业务系统的适配,这一层的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路