0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

京东云 来源:jf_75140285 作者:jf_75140285 2024-08-09 16:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

基本概念

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

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

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

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

架构

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

wKgZoma1zJ6AcEuaAAD6dfqMV2U987.png

当用户新建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加密服务。

wKgaoma1zKCAHNK-AAA42TwSBXY885.png

参考:

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据安全
    +关注

    关注

    2

    文章

    755

    浏览量

    30744
  • KMS
    KMS
    +关注

    关注

    0

    文章

    4

    浏览量

    4784
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    K8s集群性能调优实战技巧

    大多数团队在遇到K8s性能问题时,第一反应是"加机器"。但根据我对超过50个生产集群的分析,80%的性能问题源于配置不当,而非资源不足。
    的头像 发表于 09-08 09:36 507次阅读

    K8s存储类设计与Ceph集成实战

    在云原生时代,存储是制约应用性能的关键瓶颈。本文将带你深入理解K8s存储类的设计原理,并手把手实现与Ceph的完美集成,让你的集群存储性能提升300%!
    的头像 发表于 08-22 11:50 617次阅读

    Kubernetes安全加固的核心技术

    在生产环境中,Kubernetes集群安全性直接关系到企业数据安全和业务稳定性。本文将从实战角度,带你掌握K8s
    的头像 发表于 08-18 11:18 520次阅读

    解析K8S实用命令

    前言: 作为运维工程师,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文将深入解析 K8S 最实用的命令,从基础操作到高级技巧,助你成为容器化集群管理专家。
    的头像 发表于 07-24 14:07 553次阅读

    k8s权限管理指南说明

    我们在目前的k8s集群环境里面,只能在master节点上执行kubectl的一些命令,在其他节点上执行就会报错。
    的头像 发表于 06-26 14:06 559次阅读

    什么是 K8S,如何使用 K8S

    连续性。 适用场景: 大规模容器集群管理。 微服务架构的部署与运维。 需要弹性伸缩的在线服务。 多租户环境(如开发测试、生产环境隔离)。 总的来说,K8S 通过标准化容器管理,极
    发表于 06-25 06:45

    Ubuntu K8s集群安全加固方案

    在Ubuntu系统上部署Kubernetes集群时,若服务器拥有外网IP,需采取多层次安全防护措施以确保集群安全。本方案通过系统防火墙配置、
    的头像 发表于 05-12 16:17 627次阅读

    简述K3SK8S的区别

    K3s 是CNCF 认证的 Kubernetes 发行版和Sandbox项目,专为低资源环境而设计。由 Rancher Labs 维护着 K3s
    的头像 发表于 04-18 10:27 1409次阅读

    k8s集群安全机制说明

    Kubernetes 作为一个分布式集群的管理工具,保证集群安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介, 也是外部控制的入口。所以 Kubernet
    的头像 发表于 04-03 14:09 615次阅读

    如何在MBDT中使S32k344进行加密

    我想加密和解密通过 CAN 总线发送的数据,为此我想使用 S32k344 中的 HSE 模块在 MBDT 1.5 中进行对称加密-解密,但工具箱中没有可用的块。那我该怎么做呢。请分享与
    发表于 03-25 07:21

    如何通过Docker和K8S集群实现高效调用GPU

    在有GPU资源的主机安装,改主机作为K8S集群的Node。
    的头像 发表于 03-18 16:50 958次阅读
    如何通过Docker和<b class='flag-5'>K8S</b><b class='flag-5'>集群</b>实现高效调用GPU

    搭建k8s需要买几台云主机?

    至少3台。搭建Kubernetes(K8s集群所需的云主机数量因实际需求而异。一个基本的K8s集群通常需要至少3台云主机,包括1个Master节点和2个Worker节点。如果考虑高可
    的头像 发表于 02-20 10:40 892次阅读

    Jtti.cc如何确保海外服务器租用过程中的数据安全

    标准(AES)和传输层安全协议(TLS)等技术进行加密。端到端加密、传输加密和存储加密可以有效防止数据
    的头像 发表于 02-18 15:23 552次阅读

    自建K8S集群认证过期

    今天使用kubectl命令查看pod信息时,一直正常运行的k8s集群突然不能访问了,输入任何命令都提示以下报错。
    的头像 发表于 02-07 12:32 654次阅读

    加密算法的选择对于加密安全有多重要?

    加密算法容易被破解,导致敏感数据泄露。 抗攻击能力: 不同的加密算法对各种攻击(如暴力破解、已知明文攻击、选择明文攻击等)的抵抗力不同。选择一个能够抵御当前和未来潜在攻击的加密算法至
    的头像 发表于 12-17 15:59 758次阅读