KubeCon2018 -- Secret Management Deep Dive

简介:

  在刚刚过去的Kubecon2018上,诸多大厂的安全专家为我们带来了很多kubernetes安全相关的精彩分享,议题包含集群权限控制,安全配置,漏洞分析等多个方向,其中secret management作为一个热点topic,有多位演讲者对其相关工作做了详尽分析。

什么是Secret?

  连接是一个应用系统的灵魂,无论是人机或是机机之间的通讯,都会包含一些敏感信息用于我们常说的认证和鉴权,比如用户相关的用户名密码,配置文件中的数据库连接凭证,一个请求的API token,TLS证书等,这些都属于Secret的范畴。Google的安全工程师给了Secret一个很好的定义:

Credentials, configurations, API keys, and other small bits of information needed by applications at build or run time

用户遇到的问题

  • 诸如数据库密码等敏感信息写死在源码或未经保护的配置文件中
  • 管理员密码或证书密钥被开发者push到github上造成泄露
  • 由于不完备的权限控制造成一个未授权用户看到了授权域外的敏感信息
  • 一个即将离职的开发者仍旧可以使用之前颁发的证书凭证访问获取业务系统敏感文件
     

而一个完备的密文管理系统正是帮助我们解决诸如此类信息泄露或滥用问题的关键。

Secret Management

 基于上述问题Google大牛给出了密文管理的五大需求:

  • 身份认证:读取secret需要难以复制的身份并遵从权限最小化原则
  • 审计:对secret读写的审计
  • 加密:保证secret加密落盘
  • 轮转:当密文或加密密钥存在泄露风险时具备对其轮转的能力
  • 隔离:secret管控组件保证隔离性

image.png

  对于k8s应用场景下用户数据的加解密,Google大神给出的推荐方式是分层加密。如果我是一个云端的应用用户,我可以把自己用于加解密的密钥放置在云上的KMS服务存储中,而通过KMS服务暴露的REST接口,实现应用敏感信息与存储之间通讯过程中的加解密。

image.png

  可以想到,采用这种分层架构的加密方案会有如下优点:

  1)加密密钥(Key)是整个业务应用安全的核心,从上面Google的插图中可以看到,面对一个经过加密的业务敏感数据,即使它经过异常强大的加密算法保护,攻击者仍旧可以通过泄露的密钥轻易获取数据。(例如给密钥管理员下药。。用一个5刀的扳手对其严刑逼供。。。)而利用密钥管理服务,终端应用用户无需具备专业的安全领域知识即可让其业务应用满足密钥的权限控制、审计、轮转等关键安全合规要求。
  2)减轻了管控集群的业务处理压力。

  当然,这种单一的分层方式也还存在一些不可避免的问题:

  1)KMS通常只能加密一定大小(64KB)的数据,如何处理超过阈值的大规格敏感数据?
  2)经过加密的敏感数据在安全信道上的传输存在隐患和传输成本;同时终端客户也存在对KMS服务可靠和可信性的质疑。

  针对上述问题,Google详述了基于信封加密的密文管理方式。

信封加密

  信封加密是一种多层加密的方式,数据被对应的数据加密密钥(DEK)加密,然后由KEK(Key encryption key)加密DEK,这样在数据的传输过程中,DEK就好像被封存在信封中一样。

  在Google给出的最佳实践中,DEK建议和应用数据存储在相同安全域内的存储中(如集群etcd),不同的应用用户在自己的作用域内有独立的DEK,同时建议在每次加密时分发新的密钥;对于KEK,需要一个集中式的KMS服务对其进行统一管理,包括选择加密方式、访问的权限控制、密钥更新等业务功能。

image.png

  k8s官方1.7版本发布了EncryptionConfig,用户可通过模板配置指定需要加密的资源对象,并通过相应的Providers定义所需的加密方式和密钥。

image.png

​  在1.10版本,k8s发布了KMS plugins相关功能,应用发布者可以通过在EncryptionConfig中定义kms类型的provider指定对接一个外部的kms服务完成上述信封加密式的分层加密方式。

image.png

  以下图的一个secret数据加密落盘过程为例,首先应用用户向apiserver发送了一个向secret中写入数据的请求,apiserver会为每次加密请求生成一个新的DEK,用户数据会被DEK加密,同时KMS provider会通过gRPC协议与指定的KMS plugin通讯;而KMS plugin作为gRPC server端以sidecar的形式部署在集群master节点上,通过它与远端的KMS服务通讯获取用于加密DEK的KEK(key encryption key),完成加密后将加密过的KEK返回给KMS plugin并与加密后的应用数据一起存入etcd中。

  解密时,经过KEK加密的DEK会由plugin发送到远端KMS中获取解密后的DEK返回,再利用该DEK解密存储在etcd中的加密数据。

image.png

  当然,采用信封加密的分层secret管理方式也并不是最优解,远端的KMS server、sidecar方式部署的KMS plugin以及plugin中用于对接KMS服务的认证token等信息都是潜在的攻击点。对于安全等级有更高要求的用户,可以考虑使用对接外部的secret management组件,如HashiCorp Vault,作为当红的secret管理工具,在本次kubecon上也被多位演讲者提及,Vault的一些关键特性如下:

  • Secret存储形式的多样性,任意的kv形式敏感信息(如数据库密码,证书,ssh登录秘钥,openapi身份凭证等);
  • 支持插件式的存储引擎扩展,可对接如etcd,阿里云OSS, Consul,NoSQL,KV,PKI,SSH等多种插件引擎;
  • 支持对接Kubernetes,阿里云RAM,LDAP,TLS,JWT等进行访问认证;
  • 支持加密秘钥的动态生成,续租,撤销和滚动更新;
  • 完备的审计日志;
  • 完备的CLI和RESTful API

image.png

  当前用户可以在阿里云容器服务的应用目录里通过helm方便的部署Vault,我们也会持续关注Vault社区的动向,在后续提供与其对接的KMS plugin方案。

总结

 最后看一下k8s secret管理的特性对比:

image.png

 如何在kubernetes集群中管理secrets的最佳实践总结如下:

  • 根据应用具体的危险模型选取加密方法,比如结合全盘加密和应用层加密
  • 定期轮转加密秘钥
  • 使用信封加密模式,实现秘钥和secret管理的分离
  • 对于kubernetes集群应用的敏感信息防护,推荐使用KMS plugin或对接外部的secrets管理工具。

image.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
JavaScript 数据可视化 PHP
想要快速开发一个系统?选 BuildAdmin 就对了!
Part1介绍 基于 Vue3.3 + ThinkPHP8 + TypeScript + Vite + Pinia + Element Plus 等流行技术栈的后台管理系统,自适应多端、可视化 CRUD 代码生成、自带 WEB 终端、同时提供 Web、WebNuxt、Server 端、内置全局数据回收站和字段级数据修改保护、自动注册路由、无限子级权限管理等,无需授权即可免费商用,希望能帮助大家实现快速开发。
833 0
|
安全 架构师 编译器
鲲鹏开发重点-–扭转x86乾坤的挑战,ARM64内存模型
因为X86及其CISC架构生态的封闭性,中国市场对未来处理器的选择,将是更开放、更模块化的RISC架构。 鲲鹏处理器就是符合这个潮流的创新产品和生态,将直面一系列挑战,和Apple一样赢得这场挑战,来扭转X86的封闭性的乾坤,创造出中国的处理器新生态。
1966 0
鲲鹏开发重点-–扭转x86乾坤的挑战,ARM64内存模型
|
前端开发 搜索推荐 UED
解密前端路由: hash模式vs.history模式
解密前端路由: hash模式vs.history模式
|
人工智能 API C++
【AI绘画大比拼】通义万相VS文心一格:探索十种风格下的绘画生成差异!
近日,通义大模型家族的新成员——通义万相已在人工智能大会上亮相。其中,通义万相的强大的“文生图”功能,不禁让我想到了去年八月由百度依托飞桨、文心大模型的技术创新推出的“AI作画”首款产品——文心一格。 那么,在类似的Prompt下,两款产品的表现将会如何呢?今天就让我们就十种风格下二者生成图像的表现力,来看看这两款产品的差异。
|
NoSQL Java Shell
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
504 8
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
|
11月前
|
算法 Java 大数据
Java 大视界 --Java 大数据在智能医疗远程手术机器人控制与数据传输中的技术支持(215)
本文深入探讨 Java 大数据在智能医疗远程手术机器人控制与数据传输中的关键技术应用,涵盖数据采集、分布式计算、延迟补偿算法、数据压缩与加密传输等内容,并结合多个跨国手术案例,展示 Java 大数据如何赋能远程医疗,实现高精度、低延迟、安全可靠的手术支持,为医疗行业的数字化转型提供坚实技术支撑。
|
网络协议 图形学 Windows
unity获取本机IP地址
在 Unity 中,通过 .NET 框架的 System.Net 命名空间提供的 Dns 和 NetworkInterface 类,可以获取本机的 IPv4 和 IPv6 地址。使用 Dns.GetHostEntry 方法获取主机信息,并根据地址族(AddressFamily.InterNetwork 或 AddressFamily.InterNetworkV6)筛选出相应的 IP 地址。代码示例展示了如何分别获取 IPv4 和 IPv6 地址并输出到控制台。
857 10
|
XML Java 程序员
保姆级教程,手把手教你实现SpringBoot自定义starter
保姆级教程,手把手教你实现SpringBoot自定义starter
14911 2
保姆级教程,手把手教你实现SpringBoot自定义starter
|
SQL 存储 关系型数据库
MySQL新增字段/索引会不会锁表?
MySQL新增字段/索引会不会锁表?
1757 0
|
安全 网络安全 数据安全/隐私保护
Pikachu File Inclusion 通关解析
Pikachu File Inclusion 通关解析