跳到内容

沥青泡沫/密封混凝土

Kubernetes的“秘密封存”

生成状态 下载状态 Go报告卡 下载

问题:“除了Secrets,我可以用git管理我所有的K8s配置。”

解决方案:将您的秘密加密为SealedSecret安全的存储-甚至在公共存储库中。SealedSecret可以是仅由目标集群中运行的控制器解密,并且其他人(甚至是原作者)都无法获得来自SealedSecret的原始秘密。

概述

密封秘密由两部分组成:

  • 集群端控制器/操作员
  • 客户端实用程序:kubeseal公司

这个库贝塞尔的实用程序使用非对称加密来加密只有控制器才能解密的机密。

这些加密的秘密被编码在密封的秘密资源,您可以将其视为创建一个秘密。下面是它的外观:

api版本:bitnami.com/v1alpha1
友善的:密封的秘密
元数据:名称:我的秘密
  命名空间:我的命名空间
规范:加密数据:足球:AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq。。。。。

一旦打开,就会产生一个相当于以下内容的秘密:

api版本:第1版
友善的:秘密
元数据:名称:我的秘密
  命名空间:我的命名空间
数据:足球:YmFy年#<-base64编码的“bar”

这很正常kubernetes秘密将出现在群集中几秒钟后,你可以像使用任何你会直接创建的秘密一样使用它(例如,从豆荚).

跳到安装准备和运行部分。

这个用法本节更详细地探讨了您是如何制作的密封的秘密资源。

SealedSecrets作为机密模板

前面的例子只关注加密的秘密项目本身,但密封的秘密自定义资源和秘密它在许多方面(但并非全部)与熟悉的部署豆荚.

特别是密封的秘密资源与的注释不同秘密从中产生的。

为了体现这一区别密封的秘密对象具有模板对希望控制器放入未密封的秘密.

这个Sprig函数库除了默认的Go Text Template(转到文本模板)功能外,还可以使用。

这个元数据块按原样复制(所有者参考字段将被更新除非禁用).

其他机密字段单独处理。这个类型不可变的字段被复制,并且数据字段可用于模板复杂值秘密。所有其他字段当前被忽略。

api版本:bitnami.com/v1alpha1
友善的:密封的秘密
元数据:名称:我的秘密
  命名空间:我的命名空间
  注释:"kubectl.kubernetes.io/last-applied配置":....
规范:加密数据:.docker配置:AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq。。。。。
  模板:类型:kubernetes.io/dockerconfigjson公司
    不可变的:真的
    #这是将添加到输出机密中的标签和注释的示例
    元数据:标签:"jenkins.io/credentials类型":用户名密码
      注释:"jenkins.io/credentials-description":Kubernetes的证书

控制器会将其打开,如:

api版本:第1版
友善的:秘密
元数据:名称:我的秘密
  命名空间:我的命名空间
  标签:"jenkins.io/基本型":用户名密码
  注释:"jenkins.io/credentials-description":Kubernetes的证书
  所有者参考:-api版本:bitnami.com/v1alpha1
    控制器:真的
    友善的:密封的秘密
    名称:我的秘密
    液体:5caf6a0-c9ac-11e9-881e-42010aac003e
类型:kubernetes.io/dockerconfigjson公司
不可变的:真的
数据:.docker配置:ewogICJjcmVk。。。

正如您所看到的,生成的秘密资源是的“依赖对象”密封的秘密因此每当密封的秘密对象被更新或删除。

公钥/证书

密钥证书(公钥部分)用于密封机密,需要随时随地提供库贝塞尔的将会是已使用。证书不是机密信息,尽管您需要确保您使用的是正确的。

库贝塞尔的将在运行时从控制器获取证书(需要安全访问Kubernetes API服务器),这是便于交互使用,但众所周知,当用户具有特殊配置的集群,例如私有GKE集群控制平面和节点之间的防火墙。

替代工作流是将证书存储在某个地方(例如本地磁盘)kubeseal—获取-中心>菌丝体.pem,并与脱机使用kubesal--证书mycert.pem.证书也会在启动时打印到控制器日志中。

由于v0.9.x证书每30天自动续订一次。你和你的团队定期更新脱机证书。为了帮助您实现这一点,从v0.9.2开始库贝塞尔的也接受URL。您可以设置内部自动化,在您信任的地方发布证书。

kubesal--证书https://your.intranet.company.com/sealed-secrets/your-cluster.cert

它还承认密封_密封_证书env变量(专业提示:另请参阅目录).

注释:我们正在努力提供密钥管理机制,将加密卸载到基于HSM的模块或托管云加密解决方案(如KMS)。

范围

SealedSecrets来自终端用户的POV,即“只写”设备。

其思想是SealedSecret只能由目标集群中运行的控制器解密,并且其他人(甚至是原作者)都无法从SealedSecret中获得原始秘密。

用户可以直接访问目标群集,也可以不直接访问。更具体地说,用户可能有权也可能没有权访问控制器打开的机密。

有很多方法可以在k8s上配置RBAC,但禁止低权限用户是很常见的阅读《秘密》。为用户提供一个或多个具有更高权限的命名空间也很常见,这将允许他们创建和读取机密(和/或创建可以引用这些机密的部署)。

已加密密封的秘密资源的设计是为了在不了解其隐藏的秘密的情况下安全地被查看。这意味着我们不能允许用户读取SealedSecret,该文件用于他们无权访问的命名空间只需将它的副本推送到他们可以从中读取机密的命名空间中。

因此,密件密封犹如每个名称空间都有自己独立的加密密钥,因此一旦为一个命名空间密封一个秘密,它不能在另一个命名空间中移动并在那里解密。

从技术上讲,我们不为每个名称空间使用独立的私钥,而是包括命名空间名称在加密过程中,有效地实现了相同的结果。

此外,名称空间并不是RBAC配置可以决定谁可以看到哪个秘密的唯一级别。事实上,用户可以访问一个名为足球在给定的命名空间中,而不是同一命名空间中的任何其他机密。因此,默认情况下,我们不能让用户自由重命名密封的秘密资源,否则恶意用户将能够解密该命名空间的任何SealedSecret,只需重命名它以覆盖用户有权访问的一个秘密。我们使用用于在加密密钥中包括命名空间的相同机制来包括秘密名称。

也就是说,在很多情况下,您可能不关心这种保护级别。例如,只有管理员有权访问集群,或者他们无法读取任何内容秘密资源。您可能有一个将密封机密移动到其他名称空间的用例(例如,您可能事先不知道名称空间名称),或者您可能不知道机密的名称(例如,它可能包含基于内容散列的唯一后缀等)。

以下是可能的范围:

  • 严格的(默认):机密必须完全相同名称命名空间。这些属性变为加密数据的一部分因此,更改名称和/或命名空间将导致“解密错误”。
  • 命名空间范围:你可以自由重命名给定命名空间中的密封机密。
  • 集群式:秘密可以在任何命名空间,可以给定任何名称。

与以下限制相比名称命名空间,机密项目(即JSON对象键,如spec.encryptedData.my密钥)可以随意重命名,而不会失去解密密封秘密的能力。

使用--范围标志:

kubesal—范围群集范围<分泌型山药>密封密件.json

也可以通过传递给的输入机密中的注释请求范围库贝塞尔的:

  • sealedsecrets.bitnami.com/namespace-wide:“真”->的命名空间宽度
  • sealedsecrets.bitnami.com/cluster-wide:“真”->的集群式

缺少任何此类注释意味着严格的模式。如果两者都设置好了,集群式优先。

注意:下一版本将把它合并为单个sealedsecrets.bitnami.com/scope注释。

安装

请参见https://github.com/bitnami-labs/sealed-secrets/releases了解最新版本和详细的安装说明。

特定于云平台的注释和说明:

控制器

部署清单后,它将创建密封的秘密资源并将控制器安装到库贝体系命名空间,创建服务账户和必要的RBAC角色。

几分钟后,控制器将启动,生成密钥对,并做好操作准备。如果没有,请检查控制器日志。

Kustomize公司

官方的控制器清单安装机制只是一个YAML文件。

在某些情况下,您可能需要应用自己的自定义,例如设置自定义命名空间或设置一些env变量。

库贝特尔具有对此的本机支持,请参阅库斯托姆化.

头盔图表

密封秘密掌舵图现在得到官方支持,并在GitHub回购中托管。

掌舵回购增加密封机密https://bitnami-labs.github.io/sealed-secrets网站

注:掌舵图的版本方案不同于密封机密项目本身的版本方案。

最初,掌舵图由社区维护,第一个版本采用了主要版本1,而密封秘密项目本身仍处于0级。这没关系,因为掌舵图本身的版本并不一定是应用程序本身的版本。然而,这令人困惑,因此我们当前的版本控制规则是:

  1. 这个密封的秘密控制器版本方案:0.X.Y
  2. 舵图版本方案:1.X.Y-rZ

因此,可以对舵图进行多次修改,修改后的舵图只适用于没有舵图的舵图影响静态YAML清单或控制器映像本身。

注意:舵图自述仍包含一个弃用通知,但它不再反映现实,将在下一版本中删除。

注意:默认情况下,舵图会安装名称为的控制器密封混凝土,而库贝塞尔的命令行界面(CLI)尝试使用名称访问控制器密件控制器。您可以显式传递--控制器名称到CLI:

kubeseal--控制器名称密封机密<参数>

或者,您可以设置全名覆盖安装图表以覆盖名称时。另请注意库贝塞尔的假设控制器安装在库贝体系默认情况下为命名空间。所以如果你想使用库贝塞尔的CLI不必传递预期的控制器名称和命名空间,您应该这样安装Helm Chart:

helm install sealed-secrets-n kube-system--set-string fullnameOverride=sealed-secrets-controller sealed-ecrets/sealed-secrets
受限环境下的头盔图表

在某些公司中,您可能只被授予对单个命名空间的访问权限,而不是对完整集群的访问权限。

您可能遇到的最严格的环境之一是:

  • A类命名空间分配给你的服务帐户.
  • 您没有访问集群其余部分的权限,甚至没有访问集群CRD的权限。
  • 您甚至可能无法在名称空间中创建更多的服务帐户或角色。
  • 您需要在所有部署中包括资源限制。

即使有这些限制,您仍然可以安装密封的秘密头盔图表,但只有一个先决条件:

  • 集群必须已经安装了密封机密CRD.

管理员安装完CRD后,如果还没有,可以通过准备YAML配置文件来安装图表,如下所示:

服务帐户:创建:名称:{allocated-service-account}澳大利亚广播公司:创建:群集角色:资源:限制:cpu:150米内存:256Mi

请注意:

  • 不会创建服务帐户,而是使用分配给您的帐户。
    • {已分配服务帐户}是的名称服务帐户您是在集群上分配的。
  • 在命名空间和集群中都没有创建RBAC角色。
  • 必须指定资源限制。
    • 这些限制是应该有效的示例,但您可能希望在特定设置中查看它们。

一旦该文件准备好,如果您将其命名为配置yaml你现在可以安装密封的秘密头盔图表,如下所示:

helm install sealed-secrets-n{allocated-namespace}sealed-ecrets/sealed-secrets--skip-crds-f config.jaml

在哪里?{已分配名称空间}是的名称命名空间您是在集群中分配的。

库贝塞尔

自制软件

这个库贝塞尔的客户端也可在自制软件:

brew安装kubeseal

MacPorts公司

这个库贝塞尔的客户端也可用于MacPorts公司:

端口安装kubeseal

Nixpkgs公司

这个库贝塞尔的客户端也可用于Nixpkgs公司以下为:(免责声明:不由位图维护)

nix环境-iA nixpkgs.kubeseal

Linux操作系统

这个kubeseal公司可以使用以下命令在Linux上安装客户端:

KUBESEAL_版本='' #例如,将其设置为KUBESEAL_VERSION='0.23.0'wget公司"https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_版本:?}/库贝塞尔的-${KUBESEAL_版本:?}-linux-amd64.tar.gz"tar-xvzf-kubesal公司-${KUBESEAL_版本:?}-linux-amd64.tar.gz库贝塞尔sudo安装-m 755 kubesal/usr/local/bin/kubesal

如果你有卷曲jq公司安装在您的机器上,您可以通过这种方式动态获取版本。这对于自动化等环境非常有用。

#使用GitHub API获取最新的密封机密版本KUBESEAL_VERSION=$(卷曲-shttps://api.github.com/repos/bitnami-labs/sealed-secrets/tags网站| jq-r’。[0].name“|剪切-c 2-)#检查是否成功获取版本如果[-z“$KUBESEAL_VERSION”];然后echo“无法获取最新的KUBESEAL_VERSION”出口1fi(菲涅耳)wget“(wget)https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION}/kubesal(库贝塞尔)-${KUBESEAL_VERSION}-新版本amd64.tar.gz"tar-xvzf-kubesal公司-${KUBESEAL_VERSION}-linux-amd64.tar.gz库贝塞尔的sudo安装-m 755 kubesal/usr/local/bin/kubesal

哪里KUBESEAL_版本版本标签你想要使用的kubesial版本。例如:版本0.18.0.

从源安装

如果您只需要最新的客户端工具,可以将其安装到$GOPATH/箱具有:

去安装github.com/bitnami-labs/sealed-secrets/cmd/kubeseal@main公司

您可以指定发布标记或提交SHA,而不是主要的.

这个去安装命令将放置库贝塞尔的二进制位于$GOPATH/箱:

$(去env GOPATH)/bin/kubeseal公司

升级

别忘了检查发行说明有关的指导升级客户端工具时可能会发生破坏性更改和/或控制器。

支持的版本

目前,生产环境仅支持Sealed Secrets的最新版本。

与Kubernetes版本的兼容性

Sealed Secrets控制器依靠稳定的Kubernetes API确保与不同版本的Kubernet兼容。通常,Kubernetes 1.16以上的版本被认为是兼容的。然而,我们正式支持当前推荐的Kubernetes版本此外,1.24以上的版本在每次发布时都会通过CI流程进行彻底验证。

用法

#以某种方式创建一个json/yaml-encoded Secret:
#(注意`--dry-run`的用法-这只是一个本地文件!)
回声-n巴|kubectl创建秘密通用mysecret--dry-run=client--from-file=foo=/dev/stdin-o json>我的秘密.json#这是重要的一点:kubesal-f mysecret.json-w mysealedsecret.json#目前,mysealedsecret.json可以安全地上传到Github,
#在推特上发帖等。

#最终:kubectl创建-f mysealedsecret.json#利润!库贝特尔得到我的秘密

请注意密封的秘密秘密必须有相同的命名空间和名称。此功能用于阻止同一群集上的其他用户不再泄露你的秘密。请参阅范围部分了解更多信息。

库贝塞尔的从输入机密中读取命名空间,接受显式--命名空间参数,并使用这个库贝特尔默认名称空间(按此顺序)。任何标签,原文上的注释等秘密被保存,但没有自动反映在密封的秘密.

根据设计,该方案不验证用户身份.在其他话,任何人可以创建密封的秘密包含任何秘密他们喜欢(提供名称空间/名称匹配)。这取决于你现有配置管理工作流、群集RBAC规则等,以确保只有预期的密封的秘密已上载到群集。这个现有Kubernetes的唯一变化是目录秘密现在在集群外部隐藏。

管理现有机密

如果您希望Sealed Secrets控制器管理现有的秘密,您可以为您的秘密使用sealedsecrets.bitnami.com/managed:“true”注释。现有的秘密将在解封时被覆盖密封的秘密具有相同的名称和命名空间,并且密封的秘密将拥有秘密(因此,当密封的秘密已删除秘密也将被删除)。

修补现有机密

v0.23.0中的新增功能

在某些用例中,您不想替换整个秘密但只需添加或修改现有密钥秘密。为此,您可以为秘密具有sealedsecrets.bitnami.com/patch:“真”。使用此批注将确保秘密中不存在的密封的秘密不会被删除,并且密封的秘密将添加到秘密(同时存在于秘密密封的秘密将由修改密封的秘密).

此注释不会使密封的秘密取得所有权秘密。您可以同时添加补丁管理注释以获取修补行为,同时获得秘密.

密封可以跳过所有者引用集的秘密

如果你愿意密封的秘密秘密独立,这意味着当您删除密封的秘密这个秘密不会随它消失,然后你必须用注释注释这个秘密sealedsecrets.bitnami.com/skip-set-owner-references:“true”在应用使用步骤之前。您还可以添加sealedsecrets.bitnami.com/managed:“true”到您的秘密这样,您的秘密将在密封的秘密已更新。

更新现有机密

如果您想添加或更新现有的密封机密,而不需要其他项目的明文,您只需复制并粘贴新的加密数据项,然后将其合并到现有的密封机密中。

您必须注意使用兼容的名称和命名空间密封更新的项(请参阅上面关于范围的注释)。

您可以使用--合并到如果不想复制和粘贴,请使用命令更新现有的密封机密:

回声-n巴|kubectl从文件=foo=/dev/stdin-o json创建机密通用mysecret——dry-run=客户端\|kubeseal公司>我的秘密.json回声-n巴兹|kubectl创建秘密通用mysecret--dry-run=client--from-file=bar=/dev/stdin-o json\|kubesal——并入mysealedsecret.json

原始模式(实验)

使用创建临时秘密库贝特尔命令,只有在管道传输到库贝塞尔的可以成为一种非常不友好的用户体验。我们正在对CLI体验进行全面检查。与此同时,我们提供了另一种模式,其中kubeseal只关心将值加密到stdout,您有责任将其放入密封的秘密资源(与其他k8s资源没有什么不同)。

它还可以用作编辑器/IDE集成的构建块。

缺点是您必须注意与密封范围、名称空间和名称保持一致。

请参见范围

严格的范围(默认):

$回声-n个foo|kubesal--raw--名称空间栏--名称mysecret
AgBChHUWLMx。。。

命名空间宽度范围:

$回声-n个foo|kubeseal--raw--namespace bar--scope命名空间宽度
AgAbbFNkM54。。。

包括密封的机密.btnami.com/namespace-wide中的注释密封的秘密

元数据:注释:sealedsecrets.bitnami.com/namespace-wide:"真的"

集群式范围:

$回声-n个foo|kubesal--原始--范围集群
AgAjLKpIYV+。。。

包括sealedsecrets.bitnami.com/cluster-wide中的注释密封的秘密

元数据:注释:sealedsecrets.bitnami.com/cluster-wide:"真的"

验证密封的秘密

如果您想验证现有的密封机密,kubeseal公司有国旗--验证来帮助你。

提供名为的文件密封混凝土.yaml包含以下密封秘密:

api版本:bitnami.com/v1alpha1
友善的:密封的秘密
元数据:名称:我的秘密
  命名空间:我的命名空间
规范:加密数据:足球:AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq。。。。。

您可以验证是否正确创建了密封的机密:

$猫密封密件.yaml|kubesal—验证

如果密封的秘密无效,库贝塞尔的将显示:

$猫密封密件.yaml|kubesal—验证
错误:无法解密密封的机密

秘密轮换

你应该经常轮换你的秘密。但由于你的秘密是用另一个秘密加密的,你需要了解这两个层次是如何联系在一起的,才能做出正确的决定。

TL;博士:

如果密封私钥泄露,您需要遵循“提前密钥更新”中的以下说明在旋转任何实际秘密值之前。

Sealed密钥续订和重新加密功能不是替代品用于定期循环您的实际秘密值。

密封钥匙更新

密封键每30天自动更新一次。这意味着将创建一个新的密封键,并将其附加到控制器可以用来打开密封的活动密封键集密封的秘密资源。

最近创建的密封密钥是在您使用时用于密封新秘密的密钥库贝塞尔的它的证书是在您使用时下载的kubesal—获取中心.

30天的续订时间是合理的默认值,但可以根据需要进行调整使用--密钥续订期=<value>的pod模板中命令的标志密封的秘密控制器。这个价值字段可以作为golang持续时间标志(例如:720时30分). 假设您已将Sealed Secrets安装到库贝体系命名空间中,使用以下命令编辑部署控制器,并添加--密钥更新周期参数。一旦您关闭文本编辑器,并且Deployment控制器已被修改,将自动创建一个新的Pod来替换旧的Pod。

kubectl编辑部署/sealed-secrets-controller--namespace=kube-system

值为0将停用自动密钥更新。当然,您可能有一个停用自动密封密钥更新的有效用例,但经验表明,新用户在完全了解密封密钥的工作原理之前,往往会突然得出他们想要控制密钥更新的结论常见误解第节。

不幸的是,您不能将例如“d”作为天的单位,因为Go stdlib不支持这样做。不要用手掌打你的脸,把这当作一个思考程序员相信时间的谬误.

一个常见的误解是,密钥更新通常被认为是一种密钥轮换形式,其中旧密钥不仅过时,而且实际上很糟糕,因此您希望删除它。这个功能在历史上被称为“键旋转”,这无助于增加混乱。

密封的秘密不会自动旋转,旧钥匙也不会删除生成新密钥时。旧的密封的秘密资源仍然可以解密(这是因为旧的密封密钥不会被删除)。

用户秘密轮换

这个密封键更新和密封的秘密轮换不是替代品旋转你的真实秘密。

该工具的核心价值主张是:

将您的秘密加密为SealedSecret存储安全-即使在公共存储库中。

如果将任何内容存储在版本控制存储中,特别是存储在公共存储中,则必须假定你永远不能删除这些信息。

如果一把密封钥匙不知怎么从集群中泄漏出来,你必须考虑密封的秘密资源用泄露的密钥加密。集群中再多的密封密钥旋转,甚至对现有的SealedSecrets文件的重新加密都无法改变这一点。

最佳做法是定期轮换所有实际机密(例如更改密码)新工艺密封的秘密这些新秘密的资源。

但如果密封的秘密控制器未续订密封键这种轮换毫无意义,因为攻击者也可以解密新的秘密。因此,你需要同时做到这两件事:定期更新密封钥匙和旋转你的实际秘密!

提前密钥更新

如果您知道或怀疑密封键您应该在您之前尽快续订密钥开始封存你的新旋转秘密,否则你也会让攻击者获得你的新秘密。

通过将当前时间戳传递给控制器,将其转换为名为--按键切断时间或一个名为密封_护圈_KEY_CUTOFF_TIME。预期格式为RFC1123,可以使用日期-Runix命令。

关于密钥更新的常见误解

密封的秘密密封密钥不是访问控制密钥(例如密码)。它们更像是您可能用来读取发送给您的加密邮件的GPG密钥。让我们继续进行电子邮件类比:

想象一下,您有理由相信您的GPG私钥可能已被泄露。如果你做的第一件事就是删除你的私钥,那么你会损失更多,而不是获得更多。您将无法再访问以前使用该密钥发送的所有电子邮件(除非您有这些电子邮件的解密副本),也无法再访问您的朋友发送的新电子邮件,因为您还没有告诉他们使用新密钥。

当然,这些加密电子邮件的内容并不安全,因为攻击者现在可能能够解密它们,但已经完成了。你突然失去阅读这些邮件的能力,肯定无法挽回损失。如果有什么不同的话,那就更糟了,因为你再也不确定攻击者知道了什么秘密。你真正想做的是确保你的朋友不再使用你的旧密钥,并且从现在起,所有进一步的通信都使用新密钥对加密(即你的朋友必须知道新密钥)。

同样的逻辑也适用于SealedSecrets。最终目标是保护您实际的“用户”机密。“密封”秘密只是一种机制,一个“信封”。如果一个秘密泄露了,就没有回头路了,已经做了什么就做什么。

你首先需要确保新的秘密不会被旧的泄露密钥加密(在上面的电子邮件类比中,这是:创建一个新的密钥对,并将你的新公钥交给你的所有朋友)。

第二个合乎逻辑的步骤是抵消伤害,这取决于秘密的性质。一个简单的例子是数据库密码:如果您意外泄漏了数据库密码,您应该做的就是更改您的数据库密码(在数据库上;然后撤销旧密码!)更新密封的秘密使用新密码(即运行库贝塞尔的再次)。

前几节描述了这两个步骤,但不太详细。既然你已经对基本原理有了更深入的理解,那么再次阅读它们也就不足为奇了。

手动密钥管理(高级)

这个密封的秘密控制器和相关的工作流程旨在保留旧的密封键并定期添加新的。除非您知道自己在做什么,否则不应该删除旧密钥。

也就是说,如果你想,你可以手动管理(创建、移动、删除)密封键。它们只是生活在同一命名空间中的普通k8s机密密封的秘密控制器寿命(通常库贝体系,但它是可配置的)。

有一些高级用例可以通过创造性地管理密封键来解决。例如,您可以在几个集群中共享同一个密封密钥,以便在多个集群中应用完全相同的密封密钥。由于密封密钥只是普通的k8s密钥,因此您甚至可以自己使用密封密钥,并使用GitOps工作流来管理密封密钥(当您希望在不同集群之间共享同一密钥时,这很有用)!

标记密封键除了积极的有效删除来自密封的秘密控制器,但它仍然可以在k8s中用于需要时手动加密/解密。

注释 密封的秘密控制器当前不会自动拾取手动创建、删除或重新标记的密封键。管理员必须重新启动控制器才能应用效果。

重新加密(高级)

在删除一些旧的密封密钥之前,您需要使用最新的私钥重新加密SealedSecrets。

kubesal—重新加密<我的密封机密.json>tmp.json公司\&&mv tmp.json my_sealed_secret.json

上面的调用将生成一个新的密封的秘密文件,该文件使用最新的密钥,而不使机密将集群留给客户端。然后可以保存该文件在版本控制系统中(kubesal—重新加密不会更新集群内对象)。

目前,旧密钥不会自动进行垃圾收集。

定期重新加密SealedSecrets是一个好主意。但如上所述,不要让自己陷入错误的安全感中:您必须假设旧版本的密封的秘密资源(使用您认为已失效的密钥加密的资源)仍然可能存在,攻击者可以访问该资源。也就是说,重新加密不能代替定期轮换您的实际机密。

详细信息(高级)

此控制器添加新的密封的秘密自定义资源。这个有趣的部分密封的秘密是base64编码的非对称加密秘密.

控制器将一组私钥/公钥对维护为kubernetes秘密。钥匙标有sealedsecrets.bitnami.com/sealed-secrets-key公司并在标签中标识为积极的妥协的。启动时,密封的秘密控制员将。。。

  1. 搜索这些密钥,并将它们添加到其本地存储中(如果有)标记为活动。
  2. 创建新密钥
  3. 开始钥匙旋转循环

加密

可以找到有关加密的更多详细信息在这里.

发展

可以找到制定指南在《开发人员指南》中.

常见问题

我可以在一个YAML/JSON文件中同时加密多个机密吗?

是的,你可以!把尽可能多的秘密放在一个文件中。确保通过以下方式将它们分开---用于YAML,并作为JSON中的额外单个对象。

如果您不再有权访问集群,您还能解密吗?

不,私钥只存储在控制器管理的Secret中(除非您有其他k8s对象的备份)。没有后门——没有用于加密给定SealedSecrets的私钥,你就无法解密它。如果你无法使用加密密钥访问Secrets,也无法访问集群中的Secrets解密版本,那么你需要为所有内容重新生成新密码,用新的密封键等再次密封。

如何备份我的SealedSecrets?

如果您确实想备份加密私钥,很容易从具有适当访问权限的帐户进行备份:

kubectl获取机密-n kube-system-l sealedsecrets.bitnami.com/sealed-secrets-key-o yaml>主关键字回声 "---" >>主关键字库贝特尔获得秘密-n库贝系统密封-机密-密钥-o yaml>>主关键字

注意:只有在集群上安装了早于0.9.x版本的sealed-secrets时,才需要第二条语句。

注意:此文件将包含控制器的公钥和私钥,应保持omg-safe!

注意:密封密钥续订后,应重新创建备份。否则,您的备份将无法解密新的密封机密。

要在发生灾难后从备份恢复,只需在启动控制器之前恢复这些机密即可,或者如果控制器已经启动,则替换新创建的机密并重新启动控制器:

  • 对于Helm部署:

    kubectl应用-f main.keykubectl删除pod-n kube-system-l app.kubernetes.io/name=sealed-secrets
  • 用于通过部署控制器.yaml显示

    kubectl应用-f main.keykubectl删除pod-n kube-system-l name=sealed-secrets-controller

我可以用备份密钥离线解密我的秘密吗?

虽然将密封的秘密视为机密的长期存储系统不是推荐的使用案例,但一些人当k8s集群关闭并将备份恢复到新的时,有合法的要求能够恢复机密密封的秘密控制器部署是不实际的。

如果您备份了一个或多个私钥(请参阅上一个问题),可以使用kubeseal--recovery-unsal--recover-private-key file1.key,file2.key,。。。命令解密密封的机密文件。

kubesal有哪些标志?

您可以使用检查可用的标志kubesal--帮助.

如何更新JSON/YAML/TOML/..的部分内容。。用密封机密加密的文件?

库伯内特斯秘密资源包含多个项,基本上是键/值对的平面映射。SealedSecrets在这个级别上运行,并且不在乎你在值中输入了什么。换句话说它无法理解您可能放入机密的任何结构化配置文件,因此无法帮助您更新其中的各个字段。

由于这是一个常见的问题,特别是在处理遗留应用程序时,我们确实提供了一个例子可能的解决方法。

我可以带自己的(预先生成的)证书吗?

是的,您可以为控制器提供自己的证书,它将使用这些证书。请检查在这里解决方法。

如果控制器未在库贝体系命名空间?

如果您将控制器安装在与默认名称空间不同的名称空间中库贝体系,您需要提供此命名空间库贝塞尔的命令行工具。有两个选项:

  1. 您可以通过命令行选项指定名称空间--控制器名称空间<名称空间>:
kubeseal—控制器名称空间密封机密<我的秘密.json>我的秘密.json
  1. 通过环境变量密封的_服务器_控制器_命名空间:
出口SEALED_SECRETS_CONTROLLER_NAMESPACE=密件密封库贝塞尔的<我的秘密.json>我的秘密.json

如何验证图像?

我们的图像正在使用签名联合(cosign)。签名已保存在我们的GitHub容器注册表.

使用Cosign v1对0.20.2及以下版本的图像进行签名。更新的图像使用Cosign v2签名。

验证图像非常简单:

#导出COSIGN_VARIABLE设置GitHub容器注册标志路径
出口COSIGN_REPOSITORY=ghcr.io/bitnami-labs/sealed-secrets-controller/signs#验证GHCR中上传的图像cosign verify--key.github/workflows/cosign.pub ghcr.io/bitnami-labs/sealed-secrets-controller:最新#验证Dockerhub上传的图片cosign verify--key.github/workflows/cosign.pub docker.io/bitnami/sealed-secrets-controller:最新

如何将一个控制器用于命名空间的子集

如果要将一个控制器用于多个命名空间,但不是所有命名空间,则可以使用命令行标志提供其他命名空间--additional-namespaces=<namespace1>、<namespace2>、<…>。请确保在目标命名空间中提供适当的角色和角色绑定,以便控制器可以管理其中的机密。

社区

点击在这里注册Kubernetes Slack组织。

相关项目