共计 12310 个字符,预计需要花费 31 分钟才能阅读完成。
Kubernetes (K8s) 是一种开源容器编排系统,由于其可扩展性和弹性,已成为运行容器化工作负载的事实上的标准。
尽管 K8s 具有简化部署流程的功能,但应用程序的实际部署可能很麻烦,因为将应用程序部署到 K8s 集群通常需要在 YAML 中管理多个 K8s 清单(如 Deployment、Service、ConfigMap、Secret、Ingress 等)格式。这并不理想,因为它会由于一个应用程序的文件数量增加而引入额外的操作开销。此外,它通常会导致同一应用程序在不同环境中出现重复、复制粘贴的部分,从而更容易出现人为错误。
Helm 是一款流行的 Kubernetes 包管理器,旨在解决这些部署问题并帮助我们管理 K8s 应用程序。
Helm 图表和 Helm 秘密
Helm 提供了一种在 K8s 集群上定义、安装和升级应用程序的简单方法。它基于称为 Helm 图表的可重用模板,将所有必要的 K8s 清单、配置和依赖项封装到一个包中,从而使一致的版本控制、发布 / 共享和部署应用程序变得更加容易。
由于大多数应用程序依赖于配置,因此 Helm 图表通常依赖 ConfigMap 和 Secret(用于敏感信息)将值作为环境变量传递给应用程序,遵循十二因素应用程序方法。然而,由于安全问题和协作 / 访问控制原因,在 Helm 中处理机密可能具有挑战性:
1、安全问题:机密包含敏感信息,例如密码、API 密钥和数据库凭据。安全地管理机密对于保护敏感数据免遭未经授权的访问至关重要。Helm 必须确保秘密被正确加密、存储和传输。
2、协作 / 访问控制:Helm 通过共享图表和配置来促进团队之间的协作。然而,如果这些共享图表中包含秘密,控制访问就变得具有挑战性。确保只有授权个人才能访问和修改机密信息对于维护安全性和合规性至关重要。
在本文中,我们的目标是提供全面的解决方案来一劳永逸地解决这些挑战。以下是您可以期待的:
1、实践教程:helm-secrets 我们将指导您完成实用教程,演示插件和外部秘密操作器等专用工具的用法。这些教程将为您提供有效管理 Helm 部署中的机密的知识和技能。
2、与 CI/CD 集成:Helm 秘密也是 CI/CD 管道的一个重要方面。我们将探索 CI/CD 集成的可能性、优点和缺点,确保 Helm 机密和安全不仅在手动部署中得到处理,而且在自动化工作流程中得到处理。
3、秘密轮换:秘密轮换是必要的安全实践。我们将引入一个工具,可以在发生机密轮换时简化应用程序的重新部署。
4、工具比较和常见问题解答:为了帮助您选择适合您特定需求的正确工具,我们将列出优缺点以及流程图来帮助您做出决定。此外,我们将解决一些常见问题,以进一步澄清您可能存在的任何疑问。
言归正传,让我们深入探讨彻底改变 Helm 图表中的秘密管理的解决方案。
教程:helm-secrets 插件
如上一节所述,管理 Helm 图表的机密可能具有挑战性,因为 Helm 图表机密包含敏感信息,并且很难控制团队成员之间的访问。
考虑到这一点,有两种(也许只有两种)方法来管理 Helm 图表中的秘密:要么我们将敏感信息加密存储在 Helm 图表中,要么根本不将它们存储在图表中:
1、加密 Helm 图表值文件中的 Secrets 值。通过这种方式,我们可以确保图表可以安全地共享和签入版本控制,而不必担心泄露敏感信息。我们仍然需要找出一种控制机制来在团队成员之间共享访问(解密值)。
2、根本不要将 Secrets 值存储在 Helm 图表中。这样,敏感信息就根本不在 Helm 图表中,因此完全安全。然后我们需要找到一种方法将 Secrets 实际部署到 K8s 集群中。
helm-secrets 插件快速简介
TL;DR:该 helm-secrets 插件可以在上述两种方法中工作:
1、加密 Helm 图表中的敏感信息并动态解密这些值。
2、将机密存储在其他地方(例如在机密管理器中),并在发生 Helm 部署时将它们注入 Helm 图表中。
如何 helm-secrets 运作
好的,现在是长版本。
Helm-secrets 是一个管理机密的 Helm 插件。
那么 Helm 插件是什么?好问题。
Helm 插件是为 Helm 添加附加功能和功能的扩展。这些可以是新命令、功能或集成。插件可用于执行各种任务,例如管理机密、加密值、验证图表等。要使用 Helm 插件,我们通常使用命令安装它,然后我们可以像任何其他本机 Helm 一样调用插件的 helm plugin install 命令命令。
使用 helm-secrets,可以将值加密存储在 Helm 图表中。然而,该插件本身并不处理加密 / 解密操作;它将加密工作卸载并委托给另一个工具:SOPS
SOPS 是 Secrets OP eration S 的缩写,是 Mozilla 的开源文本文件编辑器,可以自动加密 / 解密文件。使用 SOPS,当我们写入文件时,SOPS 在将文件保存到磁盘之前会自动加密该文件。为此,它使用我们选择的加密密钥:这可以是 PGP 密钥、AWS KMS 密钥或许多其他密钥。
helm-secrets 还可以在“云”模式下工作,其中机密不存储在 Helm 图表中,而是存储在云机密管理器中。然后,我们只需在文件中引用密钥在云端的路径,调用时就会自动注入密钥 helm install。
示例 1:helm-secrets 使用 SOPS
在此示例中,我们将在 Helm 图表中存储加密的机密。由于这依赖于 SOPS,因此我们首先需要安装它。安装 SOPS 最简单的方法是通过 brew:
brew install sops
对于其他操作系统用户,请参阅 SOPS 的官方 GitHub 存储库。
https://github.com/getsops/sops
然后,让我们将 SOPS 配置为使用 PGP 密钥进行加密:
brew install gnupg
如果您使用的是其他操作系统,例如 Linux,则可以使用相应的包管理器。最有可能的是,这会起作用:
sudo apt-get install gnupg
使用 GnuPG,创建密钥就像下面一样简单(记住将您的名字作为 的值 KEY_NAME):
export KEY_NAME="KEY_NAME"
export KEY_COMMENT="sops 测试密钥"
gpg --batch --full-generate-key 获取 GPG 密钥指纹:
$ gpg --list-secret-keys "${KEY_NAME}"
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
sec rsa4096 2023-10-17 [SCEAR]
BE574406FE117762E9F4C8B01CB98A820DCBA0FC
uid [ultimate] KEY_NAME (sops 测试密钥)
ssb rsa4096 2023-10-17 [SEAR]
在输出的“pub”部分,您可以获得 GPG 密钥指纹(在我的例子中,它是“BE574406FE117762E9F4C8B01CB98A820DCBA0FC”)。
然后我们需要配置 SOPS 使用这个 PGP 密钥进行加密 / 解密。为此,请.sops.yaml 在您的 $HOME 目录下创建一个包含以下内容的文件:
creation_rules:
- pgp: >-
BE574406FE117762E9F4C8B01CB98A820DCBA0FC
请记住替换上一步中生成的密钥指纹。
使用 PGP 密钥安装和配置 SOPS 并不简单;有关更多详细信息,请参阅 SOPS 综合指南 。
最后我们就可以安装了 helm-secrets。单击此处获取最新版本(https://github.com/jkroepke/helm-secrets/releases)(在撰写本文时,最新版本为 v4.5.1)。然后,运行以下命令进行安装:
helm plugin install https://github.com/jkroepke/helm-secrets --version v4.5.1
让我们创建一个秘密文件并将其命名为 credentials.yaml.dec 以下内容:
password: test
要使用 加密该文件 helm-secrets,请运行以下命令:
helm secrets encrypt credentials.yaml.dec > credentials.yaml
如果打开生成的 credentials.yaml 文件,您将看到其内容已通过 SOPS 加密。
接下来我们可以参考 Helm 图表的 Secrets 中的加密值。假设我们有一个名为 your-chart/templates/secrets.yaml 以下内容的文件:
apiVersion: v1
kind: Secret
metadata:
name: helloworld
labels:
app: helloworld
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
release: "{{.Release.Name}}"
heritage: "{{.Release.Service}}"
type: Opaque
data:
password: {{.Values.password | b64enc | quote}}
helm-secrets 该模板将使用加密后的值 credentials.yaml。安装 Helm 图表时,不要使用 helm install,而是使用 helm secrets install:
helm secrets install release-name -f values.yaml -f credentials.yaml your-chart
请记住不要将 credentials.yaml.dec 文件提交到 git 存储库,因为它包含明文密码。但是,SOPS 加密结果 credentials.yaml 可以作为 Helm 图表的一部分提交(尽管通常建议不要在 Helm 图表中包含秘密值)。如果您选择提交加密值,请确保使用仅供内部使用的私有图表存储库。
在这种情况下,我们可以将敏感信息存储在加密值文件中。要与团队成员共享加密值文件,您可以将他们的公钥指纹添加到 SOPS 配置中。这样,访问控制由 SOPS 而不是 helm-secrets.
SOPS 支持各种加密方法,例如使用 AWS KMS 密钥进行加密以及通过 AWS IAM 策略共享访问权限。SOPS 支持的更多加密方式可以参考 。
有关使用 helm-secretsSOPS 的更多详细信息,请参阅此处的官方文档。
https://github.com/jkroepke/helm-secrets/wiki/Usage
示例 2:helm-secrets 使用 Cloud Secrets Manager
在前面的示例中,我们讨论了如何在值文件中以加密形式存储敏感信息。但是,helm-secrets 提供了另一种模式,可以与 Hashicorp Vault 或 AWS Secrets Manager 等流行的云秘密管理器集成。
要启用与云机密管理器的集成,您需要 HELM_SECRETS_BACKEND=vals 在运行 Helm 之前设置环境变量。这将激活 vals 集成 helm-secrets:
export HELM_SECRETS_BACKEND=vals
Vals 是专门为管理 Helm 中的秘密值而设计的工具。它需要云提供商凭据才能从秘密服务获取秘密。在尝试使用它们之前,请确保您拥有必要的凭据。
假设您有一个名为 的文件,secrets.yaml 位于 your-chart/templates/secrets.yaml. 这是其内容的示例:
apiVersion: v1
kind: Secret
metadata:
name: helloworld
labels:
app: helloworld
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
release: "{{.Release.Name}}"
heritage: "{{.Release.Service}}"
type: Opaque
data:
password: '{{.Values.password | b64enc}}'
在您的 values.yaml 文件中,您可以包含以下代码片段:
password: ref+awssecrets://path/to/my/secret/value
最后,您可以使用以下命令将所有内容安装在一起:
helm secrets install release-name -f values.yaml your-chart
此命令会将位于“path/to/my/secret/value”的 AWS Secrets Manager 中的密钥值注入到值文件中定义的变量“password”中。
简化持续部署集成 helm-secrets
如果您已经在使用 SOPS,那么这 helm-secrets 是无缝集成的绝佳选择。如果您不想将加密数据存储在值文件中,它还提供云集成。
虽然 helm-secrets 可以与 Argo CD 等主要 CD 工具集成,但会涉及一些操作开销。这是因为 CD 工具需要 SOPS 和 helm-secrets 插件,如前面的示例所示。
例如,要将 Argo CD 与 集成 helm-secrets,您需要确保 Argo CD 服务器容器同时具有 SOPS 和 helm-secrets. 这可以通过构建定制的 Docker 镜像来实现
helm-secret 另一种选择是通过部署上的 init 容器安装 SOPS 或 vals argocd-repo-server。这需要更改 initContainers 参数。
然而,这两种选择都有其缺点。自定义 Docker 镜像意味着维护一个额外的镜像,同时自定义 initContainers 命令会导致 Argo CD 的值文件更加复杂,这可能难以维护。
是否有更好或替代的方法来管理 Helm 机密?让我们继续探索吧。
Docker 镜像来实现更多详情内容,请查看以下:https://github.com/jkroepke/helm-secrets/wiki/ArgoCD-Integration
initContainers 参数,更多详情可在这找到。https://github.com/jkroepke/helm-secrets/wiki/ArgoCD-Integration
外部秘密运营商
外部秘密操作员快速介绍
external Secrets Operator 是一个 K8s 操作器,可促进外部秘密管理系统(例如 AWS Secrets Manager、HashiCorp Vault、Google Secrets Manager 和 Azure Key Vault)与 K8s 的集成。
简而言之,该操作员使用外部 API 自动从这些机密管理器中检索机密,并将其注入到 Kubernetes Secret 中。
与使用其他工具 (SOPS) 将加密数据存储在值文件中或引用存储在值文件中的云机密管理器中的机密不同 helm-secrets,外部机密操作员不需要将其作为 Helm 模板的一部分 secrets.yaml。它使用另一个自定义资源 ExternalSecret,其中包含对云机密管理器的引用。
自定义资源有什么作用?让我们更深入地了解外部机密操作员的幕后黑手。
外部秘密运营商如何工作
以下是外部 Secrets Operator 工作原理的概述:
1、SecretStore 配置:首先,我们定义一个 SecretStore 资源,该资源指定我们要集成的外部机密管理系统的连接详细信息和身份验证凭据。
2、ExternalSecret 配置:接下来,我们创建一个 ExternalSecret 资源,用于定义外部 Secret 和 Kubernetes Secret 之间的映射。
3、同步机密:External Secrets Operator 持续监控 ExternalSecret 资源。当检测到新的或更新的 ExternalSecret 时,操作员使用配置的 SecretStore 从外部机密管理系统检索指定的机密。
4、自动同步:外部 Secrets Operator 根据定义的刷新间隔定期同步机密。
外部秘密 Helm 图表示例
让我们看一个使用外部机密来管理 Helm 机密的示例。
这个想法很简单:我们不将 K8s Secrets 作为 Helm 图表模板的一部分,而是使用 ExternalSecret,它根本不包含敏感信息。
首先,让我们安装外部秘密操作器本身:
helm repo add external-secrets https://charts.external-secrets.io
helm repo update
helm install external-secrets
external-secrets/external-secrets
-n external-secrets
--create-namespace
我们需要确保向外部秘密操作员授予对 AWS Secrets Manager 的访问权限。为了使用 AWS Secrets Manager 进行快速测试,我们可以创建一个包含 AWS 凭证的密钥(不要在生产中执行此操作)并可以访问 Secrets Manager。执行以下命令:
echo -n 'KEYID' > ./access-key
echo -n 'SECRETKEY' > ./secret-access-key
kubectl create secret generic awssm-secret --from-file=./access-key --from-file=./secret-access-key
确保访问密钥有权访问 AWS Secrets Manager。有关更多信息,请查看 AWS IAM 策略。
这种方法(访问密钥作为 K8s Secret)仅适合教程。对于生产环境,建议对服务账户使用 IAM 角色。更多详情请参考 AWS 官方文档和 External Secret Operator 官方文档。
AWS 官方文档
https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html
External Secret Operator 官方文档
https://external-secrets.io/latest/provider/kubernetes/
然后,我们创建一个指向特定账户和区域中的 AWS Secrets Manager 的 SecretStore。创建一个名为 secretstore.yaml 以下内容的文件:
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: secretstore-sample
spec:
provider:
aws:
service: SecretsManager
region: ap-southeast-1
auth:
secretRef:
accessKeyIDSecretRef:
name: awssm-secret
key: access-key
secretAccessKeySecretRef:
name: awssm-secret
key: secret-access-key
通过运行以下命令应用配置:
kubectl apply -f secretstore.yaml
确保将区域更新为存储您的密钥的相应 AWS Secrets Manager 区域。
然后,我们可以创建一个 ExternalSecret 作为 Helm 图表模板的一部分,该模板将来自 AWS Secrets Manager 的密钥同步为 Kubernetes 密钥。创建一个名为 your-chart/templates/externalsecret.yaml 以下内容的文件:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: example
spec:
refreshInterval: 1h
secretStoreRef:
name: secretstore-sample
kind: SecretStore
target:
name: helloworld
creationPolicy: Owner
data:
- secretKey: password
remoteRef:
key: MyTestSecret1
property: password
MyTestSecret1.password 上述 ExternalSecret 将创建一个名为“helloworld”(在“target”部分中指定)的 K8s Secret,其中包含一个键“password”,其值是从 AWS Secrets Manager 中检索的。
无需更改任何其他内容,我们只需运行以下命令即可安装图表:
helm install release-name -f values.yaml your-chart
安装完成后,我们可以验证 Secret 是否已创建:
kubectl describe secret helloworld
在输出中,您应该看到创建的 K8s Secret 的详细信息,该详细信息由外部 Secrets Operator 自动同步,从 AWS Secrets Manager 获取值。
我们现在可以在 Helm 图表的部署中利用 envFrom 和将这些秘密值作为环境变量传递。secretRef
外部 Secrets Operator 与持续部署工具的无缝集成
helm-secrets 与需要安装 Helm 插件和 SOPS 等其他命令行工具不同,External Secrets Operator 提供了一种更简化的方法。它不需要对 Helm 或本地二进制文件进行任何修改。相反,它仅安装在 K8s 集群端,利用需要安装的 Operator 和必须定义的 SecretStore 自定义资源。
由于这种固有的简单性,将外部秘密运营商与 Argo CD 等持续部署工具集成起来毫不费力且无故障。持续部署工具端无需进行任何更改。唯一需要的修改是 Helm 图表本身:Helm 图表模板中不应包含 Secret;相反,应该在模板中使用 ExternalSecret。
Kubernetes Secrets 和 Helm Secrets 的 Vault Secrets Operator
关于管理 Helm 图表的机密,还有另一个主要选择:Vault Secrets Operator。
Vault Secrets Operator 的工作原理或多或少与外部 Secrets Operator 类似,但由于它是由 HashiCorp 制作的,因此它仅适用于 HashiCorp Vault。它的工作原理是监视 Vault 中的更改并将其从 Vault 同步到 K8s Secret。操作员将源机密数据直接写入目标 Kubernetes Secret,确保对源所做的任何更改都会在其生命周期内复制到目标。
值得注意的是,External Secrets Operator 还可以与 HashiCorp Vault 配合使用。不过,如果您已经在使用 HashiCorp Vault,也许 Vault Secrets Operator 可能是更好的选择,因为它是专为 HashiCorp Vault 设计的,并提供针对 Vault 功能量身定制的附加功能,例如动态 Secrets。
Vault Secrets Operator --- https://developer.hashicorp.com/vault/docs/platform/k8s/vso
动态 Secrets --- https://developer.hashicorp.com/vault/tutorials/kubernetes/vault-secrets-operator
如何在更新 Secret 时自动重启 Pod
在本节中,我们将讨论如何在秘密更新时自动重新启动 Pod。这对于大多数团队和公司来说是一个重要的要求。我们将探索不同的方法来实现这一目标。
如果您使用不带 helm-secrets 外部 Secrets Operator 的标准 Helm 图表,则可以使用 hack 来确保在 Secrets.yaml 文件更改时更新 Deployment 的注释部分。这可以通过使用该函数来完成 sha256sum。这是一个例子:
kind: Deployment
spec:
template:
metadata:
annotations:
checksum/config: {{include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
[...]
这是可行的,根据我的经验,很多团队和公司在生产中使用它,但在我看来,这并不理想。对于初学者来说,注释部分看起来有点混乱。
在 的情况下 helm-secrets,如果值被更新,我们必须执行另一个 helm secrets upgrade,因为这些值要么是 Helm 图表的一部分,要么是在运行时注入的。这可能有点多余,因为如果应用程序和图表都没有更新,而只更新了秘密值怎么办?全面的 Helm 升级似乎有点多了。
将 External Secrets Operator 与 Helm 一起使用甚至更加棘手:已经没有了 secrets.yaml,并且 ExternalSecret 仅引用云中的秘密管理器,这意味着 externalsecret.yaml 即使在秘密管理器中更新值也不会改变,所以我们甚至不能使用校验和功能。
为了应对这些挑战,我们建议使用 Reloader(github.com/stakater/Reloader)。Reloader 可以监视机密和 ConfigMap 的更改,并对与 DeploymentConfigs、Deployments、Daemonsets、Statefulsets 和 Rollouts 关联的 Pod 执行滚动升级。
要安装 Reloader,只需运行:
helm repo add stakater https://stakater.github.io/stakater-charts
helm repo update
helm install stakater/reloader # For helm3 add --generate-name flag or set the release name
安装 Reloader 后,您可以将其配置为自动发现使用特定配置映射或机密的部署。为此,请将 reloader.stakater.com/auto 注释添加到 Deployment 的主要元数据中,作为 Helm 图表模板的一部分:
kind: Deployment
metadata:
annotations:
reloader.stakater.com/auto: "true"
spec:
template:
metadata:
[...]
这将自动发现正在使用配置映射或密钥的部署,并且当更新其中之一时,它将在相关 Pod 上执行滚动升级。与外部秘密运算符相结合,一切都可以解决,而无需像校验和注释这样的杂乱黑客!
有关 Reloader 的更详细使用方法,请查看这里的官方文档。https://github.com/stakater/Reloader/blob/master/README.md
概括
helm-secrets 由于它与 SOPS 集成以及它提供的各种加密选项,学习使用可能具有挑战性。此外,helm-secrets 与 CD 工具集成可能会导致运营开销增加。但是,如果您只需要在值文件中安全地存储敏感数据并且不打算使用云机密管理器,那么这 helm-secrets 是一个合适的选择。
Vault Secrets Operator 和外部 Secrets Operator 的功能类似,但 Vault Secrets Operator 专为 HashiCorp Vault 设计,提供动态秘密生成等附加功能。
对于大多数用户来说,External Secrets Operator 可能是更好的选择,因为它与主要公共云提供商的机密管理器兼容,并与 CD 工具和 Reloader 工具无缝集成。与 Vault Secrets Operator(0.3k 星)和 helm-secrets(1k 星)相比,External Secrets Operator(3k 星)的 GitHub 星数更高,支持了这一结论。
当然,根据您的喜好,您自己的体验可能会有所不同。为了让事情变得更容易,我们创建了一个工作流程,帮助您在以下解决方案中进行选择:
文章来源:https://www.toymoban.com/diary/system/538.html
Helm 中的秘密:最好的解决方案是什么? 文章来源地址 https://www.toymoban.com/diary/system/538.html
到此这篇关于如何在 Helm 中处理秘密的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!