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地址等等。

1apiVersion: apiserver.config.k8s.io/v1 2kind: EncryptionConfiguration 3resources: 4 - resources: 5 - secrets # 这里表示,只加密secret 6 providers: 7 - kms: 8 name: myKmsPlugin 9 endpoint: unix:///var/run/k8s-kms-plugin/kms-plugin.sock # 如果不以pod(jdcloud-kms-plugin.yaml)启动,需要sock文件放到master节点。 10 cachesize: 100 11 timeout: 3s 12 - identity: {} 13

以上内容保存在/etc/kubernetes/kms/jdcloud/apiserver-encryption.conf

新建 jdcloud kms plugin 配置

kms server的上联信息配置

1{ 2 "AccessKey": "xxx", # 部署前,该参数需要预先知道, 3 "SecretKey": "yyy", # 部署前,该参数需要预先知道。 4 "KmsEndpoint": "kms.internal.cn-north-1.jdcloud-api.com", # 部署前,该参数需要预先知道。 5 "KmsKeyId": "abcd", # 部署前,该参数需要预先知道。 6 "KmsSchema": "http", 7 "GRPCSocketPath": "/var/run/k8s-kms-plugin/kms-plugin.sock" 8} 9

以上内容保存在/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json

新建 jdcloud kms plugin 服务

该服务是启动socket服务,并按照配置和上联的kms server进行通信,加密和解密数据,并通过socket服务和K8S APIServer交互。

该pod需要在kube-apiserver启动之前启动,否则与apiserver可能产生循环依赖。

1apiVersion: v1 2kind: Pod 3metadata: 4 creationTimestamp: null 5 labels: 6 component: jdcloud-kms-plugin 7 tier: control-plane 8 name: jdcloud-kms-plugin-node-01 9 namespace: kube-system 10spec: 11 containers: 12 - command: 13 - /k8s-kms-plugin 14 - -f=/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 指定json 15 image: hub-pub.jdcloud.com/k8s/jdcloudsec/k8s-kms-plugin:v1.0.1 16 imagePullPolicy: IfNotPresent 17 name: jdcloud-kms-plugin 18 resources: 19 requests: 20 cpu: 250m 21 volumeMounts: 22 - mountPath: /etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 注意路径 23 name: jdcloud-kms-plugin-configfile 24 readOnly: true 25 - mountPath: /var/run/k8s-kms-plugin/ 26 name: k8s-kms-plugin-unixsock-directory 27 readOnly: false 28 hostNetwork: true 29 priorityClassName: system-cluster-critical 30 volumes: 31 - hostPath: 32 path: /etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json # 注意路径 33 type: File 34 name: jdcloud-kms-plugin-configfile 35 - hostPath: 36 path: /var/run/k8s-kms-plugin/ 37 type: DirectoryOrCreate 38 name: k8s-kms-plugin-unixsock-directory 39status: {} 40

以上内容保存在/etc/kubernetes/manifests/jdcloud-kms-plugin.yaml

修改 kube apiserver配置

1... 2 - --encryption-provider-config=/etc/kubernetes/kms/jdcloud/apiserver-encryption.conf 3 image: hub-pub.jdcloud.com/k8s/kube-apiserver:v1.19.9-109 4 imagePullPolicy: IfNotPresent 5 livenessProbe: 6... 7 - mountPath: /etc/kubernetes/kms/jdcloud/apiserver-encryption.conf 8 name: apiserver-encryption-conf 9 readOnly: true 10 - mountPath: /var/run/k8s-kms-plugin/ 11 name: k8s-kms-plugin-unixsock-directory 12 readOnly: false 13... 14 - hostPath: 15 path: /etc/kubernetes/kms/jdcloud/apiserver-encryption.conf 16 type: File 17 name: apiserver-encryption-conf 18 - hostPath: 19 path: /var/run/k8s-kms-plugin/ 20 type: DirectoryOrCreate 21 name: k8s-kms-plugin-unixsock-directory 22

修改后保存

验证

在默认的命名空间里创建一个名为 secret1 的 Secret:

1kubectl create secret generic secret1 -n default --from-literal=mykey=mydata 2

用 etcdctl 命令行,从 etcd 读取出 Secret:

1etcdctl.sh get /kubernetes.io/secrets/default/secret1 [...] | hexdump -C 2

结果为加密数据

验证 Secret 在被 API server 获取时已被正确解密:

1kubectl describe secret secret1 -n default 2

该结果为明文,mykey: mydata

产品能力

在K8S集群中,京东内部一直比较重视对敏感数据加密,特别是云舰面对越来越多的金融行业客户,加密服务基本是云舰中的标准配置。

经过产品能力打磨和内部实现,KMS 加密服务和K8S自动化集群以及一键配置创建都在云舰内实现了很好的产品化能力,可以随集群创建,一键启用KMS加密服务。

参考:

1. 使用 KMS 驱动进行数据加密

作者:京东科技 王晓飞

来源:京东云开发者社区 转载请注明来源

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

mysql中like用法

like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

Oracle 10g R2 Transparent Data Encryption 透明数据加密

Oracle10gR2TransparentDataEncryption透明数据加密本章介绍如何使用透明数据加密来保护Oracle数据库中的敏感数据,该功能使您可以加密数据库列并管理加密密钥。本章包含以下主题:关于透明数据加密