Kubernetes Secrets 加密实践

本文介绍了多种加密 Kubernetes Secrets 的方法,作为保护集群敏感数据的关键措施。原文: ☸️ How to Encrypt Kubernetes Secrets

你可能已经听说过好几次这个不算秘密的秘密了:Kubernetes Secrets 是不加密的!实际上 Secret 的值是一个存储在 etcd 中的 base64 编码字符串

这意味着任何可以访问集群的人都可以轻松解码敏感数据,尤其是在集群 RBAC 设置不正确的情况下,几乎任何人都可以访问 API 或访问 etcd。

任何人都有可能被授权在命名空间中创建 pod 或进行部署,然后通过该权限检索命名空间中的所有 Secrets。如何确保集群的 Secrets 和其他敏感信息(如令牌)不被泄露?本文将讨论在 K8S 上构建、部署和运行应用程序时加密 Secrets 的几种方法。

K8S 的 Secrets

在 Kubernetes 集群上运行的应用程序可以使用 Kubernetes Secrets,从而无需在应用程序代码中存储令牌或密码等敏感数据。

当前 Kubernetes 集群中默认的 Secrets 典型工作流程如下:

  • 开发阶段:使用 CICD 的应用程序开发人员将 git 作为管理部署到集群的配置的真实来源。访问控制有助于确保对资源库的访问安全,但这本身并不总能确保应用程序的敏感信息不被暴露。
  • 运行阶段:API 服务器在集群上创建 Kubernetes Secrets 资源。可以查看 Kubernetes 官方文档获取有关 Secrets 生命周期的更多信息。应用 pod 可以通过三种方式使用存储在 etcd 中的 Secrets:

这三种情况都会在使用前解码密文中的值。

现在我们知道了它的工作原理,那为什么只对密文进行 base64 编码还不够呢?

为什么 Base64 编码不被视为加密文本?

Base64 编码是一种二进制到文本的编码方案,它将 24 位二进制数据表示为 6 位 base64 数字,可用于在网络上传输大量数据,尤其是图片等大型文件。主要功能是在网络传输过程中提供数据完整性。需要明确的是,编码并不是加密。

尝试在任意 Linux 终端上执行:

$ echo -n 'not encrypted' | base64 bm90IGVuY3J5cHRlZA== $ echo -n 'bm90IGVuY3J5cHRlZA==' | base64 --decode not encrypted SHELL

如上所述,任何人只要能访问你的系统,无论是在传递还是在使用 Secrets,都能轻松将其解码。

问题来了

作为 DevSecOps 管理员,显然面临两个挑战:

  • 如何在集群外部(即在构建和部署阶段,并且在进入集群之前)加密和管理敏感数据?
  • 在集群内运行应用程序时,如何确保敏感数据安全?

以下是加密 K8S Secrets 的几个选项。

作为将代码推送到 git 仓库的开发人员,可以在将代码推送到 git 仓库之前对应用程序使用的敏感信息进行加密。

以下是两种在 Secrets 提交到 git 仓库并部署到 OpenShift 集群之前进行加密的常用方法:

Bitnami 封装的 Secrets 简介

Bitnami Sealed Secrets:Kubernetes 的 "加密 Secrets"。

典型使用场景:

遇到的问题:"我可以在 git 中管理所有 K8S 配置,但 Secrets 除外"。

解决方案:将 Secret 加密为 SealedSecret,并将其安全的存储在公共存储库中。只有在目标集群中运行的控制器才能解密 SealedSecret,其他人(即使是原作者)也无法从 SealedSecret 中获取原始 Secret。

Bitnami Sealed Secrets 使用流程

使用 Bitnami Sealed Secrets 的工作流程示例如下:

  • 集群管理员在 K8s 集群中部署 SealedSecret 控制器。
  • 开发人员需要在本地计算机上安装 kubeseal CLI。
  • 开发者创建 Secret 资源,然后 kubeseal CLI 在运行时从控制器获取密钥,对资源进行加密或封装。对于网络受限的环境,公钥也可以存储在本地并由 kubeseal 使用。
  • Kubeseal 将创建 SealedSecret 自定义资源。
  • 开发人员将此自定义资源推送至 git 仓库。
  • 可使用 ArgoCD 等 CD 工具在集群上部署自定义资源。
  • 控制器将检测 SealedSecret 资源,并使用集群上的私钥对其进行解密。
使用 KSOPS / Mozilla SOPS

KSOPS/Mozilla SOPS 简介

  • Mozilla SOPS - sops 是一款加密文件编辑器,支持 YAML、JSON、ENV、INI 和 BINARY 格式,并使用 AWS KMS、GCP KMS、Azure Key Vault、age 和 PGP 进行加密。
  • KSOPS - 用于 SOPS 加密资源的 Kustomize 插件。

KSOPS/Mozilla SOPS 使用流程

如果使用 Argo CD 在 Kubernetes 中部署应用程序,可以使用 Kustomize SOPS 插件,该插件用于解密使用 SOPS 加密的资源。

管理员在集群上:

  • 部署 ArgoCD
  • 使用 age 生成密钥
  • 创建一个可将公钥和私钥存储在特定命名空间中的密钥
  • 定制 Argo CD 以使用 Kustomize SOPS 插件
  • 将公钥推送到 Git 仓库

开发人员将:

  • 在本地控制台创建 Secret
  • 使用 SOPS CLI 下载公钥并加密密文
  • 使用加密的 Secret 生成 KSOPS yaml 并将其推送到 Git 仓库

ArgoCD 在集群上部署 Secret 之前,会使用 KSOPS 对加密文件进行解密。

上述两种方法都适用于使用非对称加密技术加密 Secret 文件。在敏感数据作为 Secret 部署到集群之前,这两种方法都提供了解密敏感数据的方法。

SealedSecrets 与 Kubernetes 原生集成。SOPS / KSOPS 可以独立工作,不需要额外的集群控制器。此外,SealedSecrets 使用 AES-256-GCM 等强加密技术,而 SOPS 使用 gpg 和 age。SOPS 提供与云提供商 KMS 的集成,而 SealedSecrets 还没有,但计划在未来集成(参考:https://github.com/bitnami-labs/sealed-secrets/issues/779)。

SOPS 不仅可以对 Secrets 的值进行加密,还支持对 yaml、json、环境变量和二进制值进行加密,因此也可用于对 helm charts 进行加密。

不过,如你所见,加密数据一旦进入集群,就会在使用前解密。因此,上述方法只能解决部分问题。接下来,我们需要看看如何在集群中保护数据安全,看看在集群中加密数据的不同选项。

用于 K8S 的 etcd 加密选项

默认情况下,K8S 容器平台不会加密 etcd 数据。但原生 K8S 和某些 K8S 发行版提供了启用基于 etcd 加密的选项。

以下是相关参考文档:

使用 KMS 驱动进行数据加密

除上述 etcd(静态)加密方案外,原生 K8S 和某些 K8S 发行版还提供基于 KMS 驱动的(动态)数据加密方案。

以下是相关参考文档:

公共云/私有云/数据中心磁盘加密选项

在 K8S 中使用 EBS 的公有云/私有云/数据中心节点级加密可以提供额外的加密层。我们以公有云为例:

  • 加密卷内的静态数据
  • 在卷和实例之间移动的所有数据
  • 从加密卷创建的所有快照
  • 根据这些快照创建的所有卷
    • Azure 密钥库为连接到 Azure Key Vault 的 Azure 托管磁盘提供加密选项
    • Google 为 Google Cloud Storage 提供加密选项。两者默认都使用 AES 256 密钥,但也可以使用客户管理和提供的密钥,并与 KMS 集成。

集成第三方 Secrets 存储

选择第三方 Secrets 存储的一个重要原因是确保通过集中式 Secrets 存储解决方案在群集外管理 Secrets 生命周期。这些 Secrets 存储提供的身份验证和授权策略及程序与群集上的不同,可能更适合控制应用程序数据访问。

这些解决方案大多还提供监管机构要求的封装加密和 HSM 支持。流行的解决方案包括 HashiCorp Vault、CyberArk Conjur、AWS Secret Store、Azure Key Vault、Google Secret Manager、1Password 等。

Sidecar 解决方案

Vault 等解决方案可用于注入应用程序 pod 的特定 Secrets。在这种情况下,sidecar/init 容器负责向 Secret 提供者进行身份验证,然后应用可以在必要时使用返回的 Secret。底层通过 TLS 与提供者进行连接,以确保 Secret 检索的安全性。

选择这些解决方案的客户可以决定在集群上或集群外存储 Secret。通常情况下,如果客户一直使用 Vault 以满足其基础架构和其他应用需求,会倾向于与这些解决方案集成,以便在 K8S 上获得无缝的 Secret 管理体验。

Secrets Storage CSI (SSCSI) 驱动和供应商解决方案

Secrets Store CSI 驱动允许将 Secrets 和其他敏感信息作为卷挂载到应用程序 pod 中。Secrets Store CSI 驱动使用 gRPC 与供应商通信,以便从 SecretProviderClass 自定义资源中指定的外部 Secrets Store 中检索 Secrets 内容。一旦卷被加载,其中的数据就会加载到容器文件系统中。

与从特定供应商获取 Secret 内容的上述 sidecar 解决方案不同,SSCSI 驱动可以配置为从多个不同的 Secret 供应商获取 Secret 内容。有关驱动和供应商程序工作原理的更多信息,请参阅官方文档

不想在 etcd 中存储 Kubernetes Secret 的客户会选择 SSCSI,原因如下:

  • 客户可能有严格的合规性要求,因此有必要在中央存储区而不是集群中存储和管理 Secret。
  • 客户可能会将工作负载引入不在他们管理之下的控制平面环境中,因此希望完全控制工作负载的保密性,而不相信平台管理员能做到这一点。例如,客户将工作负载引入托管提供商集群的租户,或引入控制平面不由其管理的云平台。

SSCSI 驱动并不直接提供保护非卷标 Secret 的方法,例如那些需要作为环境变量或镜像提取的 Secret,以及那些可能直接在集群上创建以管理入口证书的 Secret。不过,可以使用同步秘钥功能,该功能会创建 Kubernetes 秘钥,然后为作为环境变量秘钥提供支持。

外部 Secrets 操作员(ESO,External Secrets Operator)

外部 Secrets 操作员(ESO)是一种用户友好型解决方案,用于将外部 Secrets 管理解决方案中的 Secret 同步到 Kubernetes Secrets 中。ESO 作为部署资源在 Kubernetes 集群中运行,使用自定义资源定义(CRD)通过 SecretStore 资源配置访问 Secret 供应商,并使用 ExternalSecret 资源管理 Kubernetes Secret 资源。

客户在以下情况下会选择ESO:

  • 客户需要与平台轻松集成,并便于开发人员使用。
  • 客户高度信任集群控制平面,尤其是 etcd 的加密配置方式或集群的 RBAC 管理方式。
  • 客户有多集群 Secret 管理用例,需要跨集群集成 Secret。
  • 客户需要将管理平台 Secret 用于非应用程序,例如用于 Ingress、自动化和镜像拉取的 Secret。
  • 需要在集群上修改 Secret,并为特定应用程序提供模板。
  • 最后,也是最重要的一点是,客户的用例需要在集群上访问 Secret。

本文介绍了 K8S 提供的各种加密选项,以及每种选项如何保护敏感数据,以便你可以根据自己的实际情况做出明智选择。

以下是一些个人建议,仅供参考:

  • 如果主要使用 AWS,可以根据安全级别选择 EBS 加密或 KMS 加密。
  • 如果在数据中心使用 K8S,且需要管理 K8S 集群之外的 Secrets,建议使用 Hashicorp Vault。
  • 如果在数据中心使用 K8S,且只需要 K8S Secrets 加密,则可以考虑使用 etcd 静态加密和 ESO。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容