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

k8s,集群,使用,jd,kms,服务,敏感数据,安全,加密 · 浏览次数 : 55

小编点评

**KMS 概述** KMS 是一个加密服务,用于在 Kubernetes 中加密和解密数据。它可以用于各种目的,例如: * 对 Secret 和 Configmap 进行加密。 * 对 gRPC 服务和云服务进行加密。 * 对文件和目录进行加密。 **KMS 的工作原理** KMS 运行在 Kubernetes 中的控制节点上,与 Kubernetes API server 进行通信。当创建一个 Secret 或 Configmap 时,控制节点通过 gRPC 向 KMS 请求加密。KMS 使用一个加密算法对数据进行加密,并返回加密后的数据给控制节点。 当用户获取 Secret 或 Configmap 的内容时,控制节点通过 gRPC 向 KMS 请求解密数据。KMS 使用相同的加密算法对数据进行解密,并将明文数据返回给用户。 **KMS 的配置** KMS 的配置位于 /etc/kubernetes/kms/jdcloud目录中。该目录下包含以下文件: * `apiserver-encryption.conf`:用于配置 API Server 的加密。 * `k8s-kms-plugin.json`:用于配置 K8S 中的 KMS 插件。 * `jdcloud-kms-plugin.yaml`:用于配置京东云 KMS 插件。 **KMS 的使用** 1. 创建一个 Secret 或 Configmap。 2. 创建一个 KMS 插件,指定 KMS 配置文件。 3. 启动 KMS 服务。 4. 在用户创建或获取 Secret 或 Configmap 时,控制节点通过 gRPC 向 KMS 请求加密或解密数据。 5. 用户可以从 Kubernetes 中获取加密后的数据。 **示例配置** 以下是 KMS 配置的示例: ``` apiVersion: apiserver.config.k8s.io/v1kind: EncryptionConfigurationresources: - resources: - secrets # 这里表示,只加密secret providers: - kms: name: myKmsPlugin endpoint: unix:///var/run/k8s-kms-plugin/kms-plugin.sock cachesize: 100 timeout: 3s - identity: {} ``` 此配置允许您使用名为 `myKmsPlugin` 的 KMS 插件加密和解密 `secrets` 对象。

正文

基本概念

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加密服务。

参考:

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

作者:京东科技 王晓飞

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

与K8S集群中使用JD KMS服务对敏感数据安全加密相似的内容:

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

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

如何在 K8S 集群范围使用 imagePullSecret?

在这篇文章中,我将向你展示如何在 Kubernetes 中使用 imagePullSecrets。

运行在容器中Postgres数据库数据损坏后如何恢复?

前言 在使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss, 我介绍了将 RssHub + Tiny Tiny RSS 部署到 K8s 集群中的方案. 其中 TTRSS 会用到 Postgres 存储数据, 也一并部署到 K8s 容器中. 但是最近, 由于

DHorse日志收集原理

实现原理 基于k8s的日志收集主要有两种方案,一是使用daemoset,另一种是基于sidecar。两种方式各有优缺点,目前DHorse是基于daemoset实现的。如图1所示: 图1 在每个k8s集群中启动一个daemoset组件,即Filebeat的服务,监控/var/log/container

[转帖]k8spacket 和 Grafana 对 kubernetes 的 TCP 数据包流量可视化

https://devpress.csdn.net/k8s/62ff4fe47e66823466193b95.html 你知道你不看的时候你的k8s集群在做什么吗?谁与他建立 TCP 通信?他调用了谁,例如,来自第三方库? 使用k8spacket和Grafana,您可以可视化集群中的 TCP 流量。

【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例

问题描述 在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例 问题解答 在Azure Kubernetes Service(AKS)的官方网站中,关于存储的选项介绍中,并没有具体的yaml实例来创建PV, PVC。特别是使用自定

【Azure K8S | AKS】在AKS中创建 StatefulSet 示例

问题描述 【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例 【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况 【Azure K8S |

【Azure K8S】记录AKS VMSS实例日志收集方式

问题描述 如何从AKS的VMSS集群中收集实例日志? 参考步骤 第一步:登陆VMSS实例 参考官网步骤:使用 SSH 连接到 Azure Kubernetes 服务 (AKS) 群集节点以进行维护或故障排除: https://docs.azure.cn/zh-cn/aks/ssh#configure

五分钟k8s入门到实战-应用配置

背景 在前面三节中已经讲到如何将我们的应用部署到 k8s 集群并提供对外访问的能力,x现在可以满足基本的应用开发需求了。 现在我们需要更进一步,使用 k8s 提供的一些其他对象来标准化我的应用开发。 首先就是 ConfigMap,从它的名字也可以看出这是用于管理配置的对象。 ConfigMap 不管

[转帖]k8s 服务注册与发现(一)DNS

文章目录 什么是DNS域名层级域名服务器 工作原理反向代理水平扩展集群中的 DNS......DNS劫持 什么是DNS 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UD