K8S集群中使用JDOS KMS服务对敏感数据安全加密

京东云开发者
• 阅读 270

基本概念

KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据,

驱动和插件需要使用者按照需求进行定制和实现自己的KMS插件,插件可以是gRPC服务器或者启用一个云服务商提供的KMS插件。

本文中演示使用的KMS 服务是京东云舰中的KMS加密服务。

目前KMS分为V1,V2,本文基于V1进行演示。




架构

内部可以利用kms加密实现自己的加密算法,甚至国密算法。

K8S集群中使用JDOS 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加密服务。 K8S集群中使用JDOS KMS服务对敏感数据安全加密 

参考:

  1. 使用 KMS 驱动进行数据加密
点赞
收藏
评论区
推荐文章
爱库里 爱库里
3年前
Kubernetes笔记:十分钟部署一套K8s环境
Kubernetes是Goole开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理——百度百科。接触K8s也有半年多了,也基于阿里云平台搭建了包含多级服务、目前运行较为稳定的K8s集群(感兴趣的可参考\k8s云集群混搭模式,可能帮你节省50%以上的服务成本\,\k8s云集群混搭模式落地分享\,但一直没来得及对其进行系统
Chase620 Chase620
3年前
MyBatis 源码分析 - 插件机制
1.简介一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作。以MyBatis为例,我们可基于MyBatis插件机制实现分页、分表,监控等功能。由于插件和业务无关,业务也无法感知插件的存在。因此可以无感植入插件,在无形中增强
Wesley13 Wesley13
3年前
1.5 万 Star!Vim 党不能缺少的 IDE:SpaceVim
【导语】:SpaceVim是一个社区驱动的模块化的VimIDE,以模块的方式管理插件,旨在维护一个模块化、开箱即用、稳定的Vim开发环境。目前在GitHub的Star数已有15.2k。简介SpaceVim是一个社区驱动的模块化的VimIDE,以模块的方式组织管理插件以及相关配置,为不同的语言开发定制了相关的开发模块
Stella981 Stella981
3年前
API网关 kong 的初步认识
Kong是Mashape开源的高性能高可用API网关和API服务管理层。自2015年在github开源后,广泛受到关注。它基于OpenResty,进行API管理,并提供了插件实现API的AOP。Kong的插件机制是其高可扩展性的根源,Kong可以很方便地为路由和服务提供各种插件,网关所需要的基本特性。Kong支持特性:云原生:与平台无关,K
Stella981 Stella981
3年前
Jetbrains插件Protobuf Generator,支持GO等多种语言
ProtobufGenerator是基于GenProtobuf开发的一款jetbrains插件,在GenProtobuf的基础上增加了对PHP,GO和gomicro的支持。以替代命令行生成方式使得生成代码更加便捷。支持jetbrains全系列IDE(idea,phpstrom,goland,webstrom等)。插件使用说明:1,使用插件前需要安
Wesley13 Wesley13
3年前
Oracle 10g R2 Transparent Data Encryption 透明数据加密
Oracle10gR2TransparentDataEncryption透明数据加密本章介绍如何使用透明数据加密来保护Oracle数据库中的敏感数据,该功能使您可以加密数据库列并管理加密密钥。本章包含以下主题:关于透明数据加密
DevOpSec DevOpSec
1年前
自建k8s集群之负载均衡使用
自建k8s而非云环境,组件mysql类(部分有状态服务)部署在虚机里也即集群外,业务服务部署在k8s集群内。需求:集群内、集群外,业务服务和组件相互间通过负载均衡、高可用的形式连通。此需求拆解成两个问题进行解决,接着往下看。集群内:k8s集群集群外:k8s集群外的应用部署在虚拟机或物理机环境
四儿 四儿
1年前
点云标注中的隐私保护和数据安全问题
点云标注过程中涉及到大量的敏感数据和隐私信息,如车辆位置、道路环境等。因此,在点云标注中确保隐私保护和数据安全是非常重要的。首先,隐私保护需要注重数据匿名化和加密技术。通过对点云数据进行匿名处理,如去除位置信息、对数据进行加密等,可以保护车辆和个人的隐私信
K8S集群中使用JDOS KMS服务对敏感数据安全加密 | 京东云技术团队
KMS,KeyManagementService,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据
API 小达人 API 小达人
11个月前
5分钟上手 浏览器插件测试——Eolink Apikit
EolinkApikit研发管理和自动化测试产品中,提供了多种发起API测试的方式,包括浏览器插件测试。通过EolinkApikit官方浏览器插件发送请求,需要安装Chrome或者Firefox插件,可访问本地服务器(localhost)、内网、局域网。