一、背景
Kubernetes 集群具有不同类型的资源,例如 Deployment、DaemonSet、ConfigMap 和 Secret 等。Secret 是一种资源,可帮助集群操作员管理对密码、OAuth 令牌和 SSH 密钥等敏感信息的部署。 这些 Secret 可作为数据卷进行挂载,也可以作为环境变量向 Kubernetes Pod 中的容器公开,从而解耦 Pod 部署与管理 Pod 中容器化应用程序所需的敏感数据。 我们面临的是需要将编排文件 YAML 清单存储到集群外部的 Git 存储库中(deployment、daemonset、configmap、secret…), 集成到 GitOps 工作流中。 Secret 中的数据仅使用 Base64 编码进行混淆。解码 Base64 编码的数据很简单,因此将这样的文件存储在 Git 存储库中是非常不安全的。 Sealed Secrets 开源项目提供了针对 Secret 对象的加密机制。 Sealed Secrets 包括以下组成部分: 一个部署到集群的控制器 一个名为 kubeseal 的 CLI 工具 一个名为 SealedSecret 的定制化资源定义 (CRD) 启动后,控制器会查找集群范围的私钥/公钥对,如果未找到,则会生成一个新的 4096 位 RSA 密钥对。私钥保存在一个 Secret 对象中,该对象位于控制器所在的命名空间中。任何想要在此集群中使用 Sealed Secrets 的人都可以公开获得此密钥的公钥部分。
二、工作原理
Sealed Secrets 包括以下组成部分:
-
1. 一个部署到集群的控制器
-
2. 一个名为 kubeseal 的 CLI 工具
-
3. 一个名为 SealedSecret 的定制化资源定义 (CRD)
启动后,控制器会查找集群范围的私钥/公钥对,如果未找到,则会生成一个新的 4096 位 RSA 密钥对。私钥保存在一个 Secret 对象中,这个对象位于控制器所在的命名空间中。任何想要在此集群中使用 Sealed Secrets 的人都可以公开获得此密钥的公钥部分。 加密时,原始 Secret 中的每个值都使用带有随机生成的会话密钥的 AES-256 方式进行对称加密。然后,将 SHA256 和原始 Secret 的命名空间/名称作为输入参数,使用控制器的公钥对会话密钥进行非对称加密。加密过程的输出结果是一个字符串,其构造为:加密会话密钥的长度(2 个字节)+ 加密会话密钥 + 已加密的 Secret。 将 SealedSecret 自定义资源部署到 Kubernetes 集群时,控制器会拾取该资源,然后使用私钥将其解封并创建一个 Secret 资源。解密时,会再次使用 SealedSecret 的命名空间/名称作为输入参数。这样可以确保 SealedSecret 和 Secret 严格绑定到相同的命名空间和名称。 配套的 CLI 工具 kubeseal 用于使用公钥从 Secret 资源定义中创建 SealedSecret 定制化资源定义 (CRD)。kubeseal 可以通过 Kubernetes API 服务器与控制器进行通信,并在运行时检索加密 Secret 所需的公钥。
三、特性
单向加密
SealedSecrets是一种“只写”设备。其思想是SealedSecret只能由运行在目标集群中的控制器解密,其他人(甚至是原始作者)都无法从SealedSecret获得原始秘密。
密钥自更新
密封钥匙每30天自动更新一次。这意味着创建一个新的密封密钥并将其附加到控制器可以用来解封密封的秘密资源的活动密封密钥集。
密封秘密度量
运行在Kubernetes中的密封秘密控制器暴露了Prometheus度量。这些指标使操作员能够观察它的运行情况。例如,已经尝试了多少次SealedSecret解封,以及由于RBAC权限、错误的密钥、损坏的数据等原因可能发生了多少错误。

三、安装 kubeseal 客户端
对于 Linux x86_64 系统,可以使用以下命令将客户端工具安装到 /usr/local/bin 中:
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.10.0/kubeseal-linux-amd64 -O kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal
对于 macOS 系统,客户端工具的安装方式如下:
brew install kubeseal
安装k8s Secret Controller
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.17.2/controller.yaml
创建一个secret文件
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: null
name: my-secret
namespace: my-namespace
data:
password: dGVzdAo= # <- base64 encoded test
username: dGVzdDEyMzQK # <- base64 encoded test1234
基于secret创建sealed-secret
cat secret.yaml | kubeseal
--controller-namespace kube-system
--controller-name sealed-secrets-controller
--format yaml
> sealed-secret.yaml
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: my-secret
namespace: my-namespace
spec:
encryptedData:
password: AgASAPp1w0i+RA1Lt+29QHCeol6D8VGdPAnQh0Qal8mTXDBC5H9RMWtxSgnPngJiv2aqy3998HnZaxsfxuIgq8pAMI2S/wr/EPaDP6G845aRpipPsapdz3ziH9fax2veaAB/Spsl6YfI3NDrU4PgTahhL1tdyRkpkPK9P+pOwLVawiFffACOCgLyxcA4APAUMXUGLW6Cn8DKRhcf6A5fywFcg9WrMJ3IWXZ/IagXsnQa5WeoXdfyxFkNuoL0VWBjlSRcq6QF3SJ/i5IDrbRWsgPtqhmLApef4v+V+nCDGJAY74sN316fne+GTMhzeJo4EdrG+UmK9NVB/rbwnvUI5SwlwQhyT8syZh1HhPRBOBL8jGdFH1hBk3QpDPZkchUnhhUYX7tsX7Jleqj2fHlXkqxNP1oMn9L/re4YGFkOBJa8JMy4vH75VEUFlkco6qTiX0vaWIL4yveBV4J2MYIbKRfSjPao5PCalpumXIaBfrAxoTZGeQd2AXA0Nob9iTp18d6eD2ML9t26bYqjCzP4vQfug3PEgQGvMJnr0dDiQlJiUNkduZA0H/3x4BLtkxYNvW4sRGQ6bBOY3ZnaxeReWdjg9u0PR4yioxoJo7xAszwAPuNRsjU6FK7GGNGhXmgw2WHFH+mOaEPwmZfuwcWYbZ1bMgOYRHi6o0wSk6jAf3e2kKJjowjqRrkVQUtdveejCp+MVNEfhQ==
username: AgANhIsoTlITX5gGJFJL6Ds52I2UoCdmhSbT9CHT8A5II64CiJFNlYPAYzOs+6r1NHySFCyC2tTFh64/fvRptc5Pb1uT/cd6+HmNKAF/HnxoMvqBUcZLS0TycfI9VIXe7aFGbxvT6LFwiejTkczNgV8pKJenxGagcImbAKi8L0JNQ6DHr8aRc+3b0fXAxMmxPHYXXNlEUBm1hvM+DsQ14qobV5vnYJsuBNlFD5fC9ELxesoEtim3gzAxwmBtZ12VNqygyM2F0UzJbHNlXElohst1p7MfSOE4kzNjpseMrpqjWaiAaacdvQYISANuUXAsmYHbBqfCHxmGMVLIwvFTmkRjERgWJi9EgjfHkS2v5swgFPnG+NvTE0rItjas3YFq1owzYNTlcvi2Uh1PbTNMXF3Q4wTg9x/yGUPjE4Z3ezQb4N+5xh9GmB88x+DxDN8kepbL4KaysL1Zpb/efQUxxodJChwPQ77sjArcSZW2UsgS5IbWTNt4G2PkIvTZONRmY5i09HmtJ4OdVSr3wRp5Qr/U7wzOv9m/x315mHdczH4cJcL1W/ijK7ng+56IoU6zd4VN1IF+qWnZrzopZrNDpWBv7j2L6cAF4wDakJOHqfrpO7vR9uYbmnuRt1InekwpHUCrweCnL9S91KL3So1VpJM8iYYy/UtaaG3OUw6kikPfF5XL/q8IJvbsZLYOb3Ap3z1Pp8Iu2Y0b1cQ=
template:
data: null
metadata:
creationTimestamp: null
name: my-secret
namespace: my-namespace
系统环境使用加密后的secret文件
kubectl apply -f sealed-secret.yaml
原文始发于微信公众号(背带裤的云原生):使用Sealed Secrets 在 Kubernetes 中管理密钥安全
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/218907.html