秘密加密

秘密加密配置

RKE2 支持 静态密文加密,并将自动执行以下操作:

  • 生成 AES-CBC 密钥。

  • 使用生成的密钥生成加密配置文件。

  • 将配置传递给 Kubernetes APIServer 作为 encryption-provider-config。

选择加密提供程序

版本门控

自 2025 年 4 月发布以来可用:v1.30.12+rke2r1,v1.31.8+rke2r1,v1.32.4+rke2r1,v1.33.0+rke2r1。

FIPS 合规性

FIPS 140-3 合规性仅适用于 aescbc 提供程序。

使用 --secrets-encryption-provider 标志,您可以选择使用哪个加密提供程序。默认值为 aescbc

RKE2 支持以下 加密提供程序

  • aescbc:带有 PKCS#7 填充的 AES-CBC

  • secretbox:XSalsa20 和 Poly1305

迁移提供程序

您可以通过以下步骤从 aescbc 提供程序迁移到 secretbox 提供程序:

  1. 确保 secretbox 提供程序受到您的 RKE2 版本的支持。

  2. 在您的 RKE2 配置文件中更新/添加 secrets-encryption-provider 标志为 secretbox

  3. 按照下面的 [Encryption Key Rotation] 部分轮换密文加密密钥。

生成的加密配置文件

以下是 RKE2 使用默认 aescbc 提供程序生成的加密配置文件示例:

#/var/lib/rancher/rke2/server/cred/encryption-config.json
{
  "kind": "EncryptionConfiguration",
  "apiVersion": "apiserver.config.k8s.io/v1",
  "resources": [
    {
      "resources": [
        "secrets"
      ],
      "providers": [
        {
          "aescbc": {
            "keys": [
              {
                "name": "aescbckey",
                "secret": "xxxxxxxxxxxxxxxxxxx"
              }
            ]
          }
        },
        {
          "identity": {}
        }
      ]
    }
  ]
}

密文加密工具

RKE2 包含一个子命令 secrets-encrypt,允许管理员执行以下任务:

  • 添加新的加密密钥

  • 轮换和删除加密密钥

  • 重新加密密文

在轮换密文加密密钥时未遵循正确程序可能导致永久数据丢失。在轮换之前建议 创建快照。请谨慎操作。

加密密钥轮换

  • 单服务器

  • 高可用性

要在单服务器集群上轮换密文加密密钥:

  1. 轮换密文加密密钥。

    rke2 secrets-encrypt rotate-keys
  2. 等待重新加密完成。查看服务器日志,或等待:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished

在HA设置中轮换密文加密密钥:

在此示例中,使用了3台服务器作为HA集群,称为S1、S2、S3。建议您选择一个服务器节点来运行`secrets-encrypt`命令。

  1. 在S1上轮换密文加密密钥。

    rke2 secrets-encrypt rotate-keys
  2. 等待重新加密完成。查看服务器日志,或等待:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished
  3. 依次重启S1、S2、S3上的RKE2。

    systemctl restart rke2-server.service

    在重启下一个服务器之前,请等待systemctl命令返回。

经典加密密钥轮换

新程序

如果使用RKE2版本高于v1.30.1+rke2r1,建议使用[Encryption Key Rotation]

  • 单服务器

  • 高可用性

要在单节点集群上轮换密文加密密钥:

  1. 准备:

    rke2 secrets-encrypt prepare
  2. 重启`kube-apiserver` pod:

    # Get the kube-apiserver container ID export CONTAINER_RUNTIME_ENDPOINT="unix:///var/run/k3s/containerd/containerd.sock" crictl ps --name kube-apiserver # Stop the pod crictl stop <CONTAINER_ID>
  3. 轮换:

    rke2 secrets-encrypt rotate
  4. 再次重启`kube-apiserver` pod。

  5. 重新加密:

    rke2 secrets-encrypt reencrypt

在HA设置中轮换密文加密密钥:

在此示例中,使用了3台服务器作为HA集群,称为S1、S2、S3。虽然不是必需的,但建议您选择一个服务器节点来运行`secrets-encrypt`命令。

  1. 在S1上准备。

    rke2 secrets-encrypt prepare
  2. 依次重启S1、S2、S3。

    systemctl restart rke2-server.service

    在重启下一个服务器之前,请等待systemctl命令返回。

  3. 在S1上轮换。

    rke2 secrets-encrypt rotate
  4. 依次重启S1、S2、S3。

  5. 在S1上重新加密。

    rke2 secrets-encrypt reencrypt

    请等待重新加密完成,可以通过服务器日志 journalctl -u rke2-serverrke2 secrets-encrypt status 查看。完成后状态将返回 reencrypt_finished

  6. 依次重启S1、S2、S3。

密文加密状态

secrets-encrypt status 子命令显示节点上密文加密的当前状态。

单服务器节点上的命令示例:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: start
Server Encryption Hashes: All hashes match

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey

高可用性集群中的另一个示例,在旋转密钥后,但在重启服务器之前:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: rotate
Server Encryption Hashes: hash does not match between node-1 and node-2

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey-2021-12-10T22:54:38Z
        AES-CBC   aescbckey

每个部分的详细信息如下:

  • 加密状态:显示节点上是否禁用或启用 Secrets 加密

  • 当前旋转阶段:指示节点上的当前旋转阶段。阶段为:startpreparerotatereencrypt_requestreencrypt_activereencrypt_finished

  • 服务器加密哈希:对于高可用性集群,这指示所有服务器的本地文件是否处于相同阶段。这可以用来确定在进入下一个阶段之前是否需要重启服务器。在上面的高可用性示例中,节点 1 和节点 2 的哈希不同,表明它们当前没有相同的加密配置。重启服务器将同步它们的配置。

密钥表 说明

活动

* 表示当前用于密文加密的密钥(如果有的话)。Kubernetes 使用活动密钥对所有新创建的 secret 进行加密。

密钥类型

RKE2 仅支持 AES-CBC 密钥类型。查看更多信息 这里。

名称

加密密钥的名称。默认值为 aescbckey-<DATE_AND_TIME>