跳到主要内容

搭建你的 K3s 环境 -- 使用 Sealed Secrets 加密 Kubernetes Secrets

前面的文章里我们使用到了最简单的 Kubernetes Secrets,并将 MySQL 的密码以 base64 加密的方式存放在了 secret.yaml 文件里,并存放到了 Git 的私有仓库里。这样做具备一定的安全性,但是还是有较高的暴露风险,特别是在一个多人协作的开发团队里。

在云原生环境中,保护敏感数据,如数据库凭证、API密钥等,变得尤为重要。暴露这些敏感信息可能导致数据泄露和不正当访问,从而对组织造成严重损害。

Sealed Secrets 是一种 Kubernetes 控制器,允许用户通过 Kubeseal CLI 工具将 Secrets 加密为Sealed形式。这些密封的 Secrets 可以安全地存储在 Git 仓库中,而不会暴露其包含的敏感数据。只有在集群内的 Sealed Secrets 控制器可以解密这些密封的 Secrets,并在集群中创建常规的 Kubernetes Secrets。

安装 Sealed Secrets #

使用 K3sup 在 K3s 集群环境里安装 Sealed Secret 非常简单:

k3sup app install sealed-secrets

用下面的命令验证安装是否成功:

kubectl get pods -n kube-system -l name=sealed-secrets-controller

安装 Kubeseal CLI #

For MacOS:

brew install kubeseal

For Linux,see release-tag here

wget https://github.com/bitnami-labs/sealed-secrets/releases/download/<release-tag>/kubeseal-<version>-linux-amd64.tar.gz
tar -xvzf kubeseal-<version>-linux-amd64.tar.gz kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal

你通过执行kubeseal --version来验证 Kubeseal 是否正确安装。 更多内容请查看官方安装文档

加密 Secrets #

我们如何保护 Secrets 不会让敏感信息泄露,以下是一个简要的流程:

  1. 创建原始 Secret:在本地创建一个包含敏感数据的原始 Secret 文件。此文件应当保留在本地,并不应提交到Git仓库。
  2. 使用 Kubeseal 加密 Secret:使用 Kubeseal 工具将原始 Secret 加密。这将创建一个新的文件,其中包含加密后的数据。这个新文件就是所谓的 Sealed Secret。
  3. 提交 Sealed Secret 到 Git 仓库:将 Sealed Secret 文件提交到 Git 仓库。由于它已经加密,所以即使有人能够访问这个文件,他们也无法读取其中的敏感数据。
  4. 在集群中应用 Sealed Secret:最后,使用 kubectl 或 kustomize 将 Sealed Secret 应用到 K3s 集群。Sealed Secrets Controller 会自动解密 Sealed Secret,并创建一个普通的 Kubernetes Secret。

加密 MySQL 的 Secret #

这是我们之前创建的 Secret YAML 文件:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  username: d29yZHByZXNz
  password: cGFzc3dvcmQ=

使用 Kubeseal 加密 Secret:

kubeseal < ./mysql/secret.yaml > sealed-secret.yaml

这会生成一个名为 sealed-secret.yaml 的新文件。 删除旧的 secret.yaml 并提交 sealed-secret.yaml 到 Git 仓库。 我们部署好的 GitOps 会自动将新的改动部署到 K3s 环境。

FAQ #

  • 更新 Sealed Secrets: Sealed Secrets 一旦被创建并部署到集群,它们就无法直接被修改。如果您需要更改原始Secret的内容,需要回到最初并修改原始文件并重新部署。

  • 备份和恢复: Sealed Secrets 的一个重要方面是公私钥对的管理。Sealed Secrets Controller 在首次安装时会自动生成一个新的公私钥对。私钥用于解密Sealed Secrets,并且只会在 Kubernetes 集群内部使用,公钥用于加密原始的 Secrets。为了避免灾难性的数据丢失,应该定期备份 Sealed Secrets Controller 的私钥。私钥存储在一个名为 sealed-secrets-key 的Secret中,位于 Sealed Secrets Controller 的安装 namespace(默认为 kube-system)。

  • 备份 Sealed Secert 私钥

kubectl get secret -n kube-system sealed-secrets-key -o yaml > sealed-secrets-key.yaml
  • 恢复 Sealed Secert 私钥
kubectl apply -f sealed-secrets-key.yaml

++ 定期更新 Sealed Secert 私钥 要更新密钥,需要删除当前的密钥 Secret,然后 Sealed Secrets Controller 将自动生成一个新的密钥对。

kubectl delete secret -n kube-system sealed-secrets-key