首页 > 其他分享 >K8S集群中使用JDOS KMS服务对敏感数据安全加密

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

时间:2024-08-09 16:16:47浏览次数:14  
标签:加密 KMS plugin apiserver JDOS 敏感数据 kms k8s jdcloud

基本概念

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 驱动进行数据加密

标签:加密,KMS,plugin,apiserver,JDOS,敏感数据,kms,k8s,jdcloud
From: https://www.cnblogs.com/Jcloud/p/18350938

相关文章

  • CentOS搭建KMS服务器
    CentOS搭建KMS服务器CentOS搭建KMS服务器一、使用git拉取vlmcsd项目并在本地编译若还未安装git,使用命令yuminstallgit-y进行安装。使用[email protected]:Wind4/vlmcsd.git拉取项目。cdvlmcsd#进入项目目录make#进行编译二、开放防火墙端口,创建开机自启脚本......
  • 本地自建KMS服务器
    本地自建KMS服务器本地自建KMS服务器一、前期准备下载安装以下软件、文件:VMwareGithub中的开源项目:vlmcsd二、在VMware下部署KMS服务器解压vlmcsd项目中release文件下的binaries.tar.gz,打开floppy目录,使用VMware打开运行vlmcsdembedded.vmx,这是VMware虚拟机的配置文件,......
  • 详解Web应用安全系列(5)敏感数据泄露漏洞
    在最近几年,这是最常见的,最具影响力的攻击。这个领域最常见的漏洞是不对敏感数据进行加密。在数据加密过程中,常见的问题是不安全的密钥生成和管理以及使用弱密码算法,弱协议和弱密码。特别是使用弱的哈希算法来保护密码。在服务端,检测数据传输过程中的数据弱点很容易,但检测存储数据......
  • 如何对SQL Server中的敏感数据进行加密解密?
    为什么需要对敏感数据进行加密?近几年有不少关于个人数据泄露的新闻(个人数据通常包含如姓名、地址、身份证号码、财务信息等),给事发公司和被泄露人都带来了不小的影响。许多国家和地区都出台了个人数据保护的法律法规,如欧盟的通用数据保护条例(GDPR)。不管是出于遵守法规、数据保护......
  • 大型研发机构是如何保护敏感数据不泄露的?
    研发型机构企业通常是指那些将研发活动作为其核心业务的公司,这些企业往往在科技、工程、医药、电子等领域进行大量的研究与开发工作,会存在大量的研发数据,这类数据都是极其核心且敏感的数据,都需要用各种手段保护起来!研发数据在流转传输过程中,会存在跨区域、异地同步、实验机台数据......
  • 敏感数据泄露-基于Pikachu的学习
    敏感数据泄露原理由于管理员或者技术人员等各种原因导致敏感信息泄露。许多web应用程序和app都无法正确保护敏感数据,攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输......
  • 知识管理系统(Knowledge Management System,KMS)
    知识管理系统(KnowledgeManagementSystem,KMS):一、定义知识管理系统是收集、处理、分享一个组织的全部知识的信息系统,通常由计算机系统支持。它利用软件系统或其他工具,对组织中大量的有价值的方案、策划、成果、经验等知识进行分类存储和管理,从而积累知识资产,避免流失,并促进知识......
  • 安全机密管理:Asp.Net Core中的本地敏感数据保护技巧
    前言在我们开发过程中基本上不可或缺的用到一些敏感机密数据,比如SQL服务器的连接串或者是OAuth2的Secret等,这些敏感数据在代码中是不太安全的,我们不应该在源代码中存储密码和其他的敏感数据,一种推荐的方式是通过Asp.NetCore的机密管理器。机密管理器在ASP.NETCore中,机密管......
  • Windows Server之KMS
    KMS是什么?KMS全称是KeyManagementService,本身就是微软官方提供的一种激活方式,通常用于大型组织客需要激活的客户端数量不固定的情况。正常情况下,激活Windows系统需要电脑通过网络连接微软服务器,由微软服务器验证你的Key是否可以激活,返回激活成功或激活失败两种结果。而KMS......
  • 多快好省| 4 条策略完美化解 BI 场景的敏感数据保护难题
    超过2000人每天取数、用数查看报表BI平台原生的权限控制和脱敏难以有效落地敏感数据基本处于“裸奔”状态4条策略如何实现有效保护?项目背景金融消费者个人信息保护与数据安全风险排查成为近年来金融监管机构的检查重点之一。G保险企业开展数据安全治理自查,已逐步完成了数据分类分......