跳到主要内容

Secret 加密配置

K3s 支持启用静态加密。首次启动 server 时,传递标志 --secrets-encryption 将自动执行以下操作:

  • 生成 AES-CBC 密钥
  • 使用密钥生成加密配置文件
  • 将配置作为 encryption-provider-config 传递给 KubeAPI
提示

如果不重新启动现有 server,则无法在其上启用 Secret 加密。
如果使用脚本或配置选项中描述的其他方法进行安装,请使用 curl -sfL https://get.k3s.io | sh -s - server --secrets-encryption

加密配置文件示例:

{
"kind": "EncryptionConfiguration",
"apiVersion": "apiserver.config.k8s.io/v1",
"resources": [
{
"resources": [
"secrets"
],
"providers": [
{
"aescbc": {
"keys": [
{
"name": "aescbckey",
"secret": "xxxxxxxxxxxxxxxxxxx"
}
]
}
},
{
"identity": {}
}
]
}
]
}

Secret 加密工具

版本

v1.21.8+k3s1 起可用

K3s 包含一个实用工具 secrets-encrypt,可以自动控制以下内容:

  • 禁用/启用 Secret 加密
  • 添加新的加密密钥
  • 轮换和删除加密密钥
  • 重新加密 Secret
警告

如果不遵循正确的加密密钥轮换程序,你的集群可能会永久损坏。因此,请谨慎操作。

加密密钥轮换

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

  • 使用标志 --secrets-encryption 启动 K3s Server
备注

目前支持在没有加密的情况下启动 K3s 并在后续启用它。

  1. 准备

    k3s secrets-encrypt prepare
  2. 使用相同的参数终止并重启 K3s Server。如果将 K3s 作为服务运行:

    # 如果使用 systemd
    systemctl restart k3s
    # 如果使用 openrc
    rc-service k3s restart
  3. 轮换

    k3s secrets-encrypt rotate
  4. 使用相同的参数终止并重启 K3s Server。

  5. 重新加密

    信息

    K3s 每秒将重新加密约 5 个 Secret。
    具有大量 Secret 的集群可能需要几分钟才能重新加密。

    k3s secrets-encrypt reencrypt

禁用/启用 Secret 加密

使用 --secrets-encryption 标志启动 server 后,你还可以禁用 Secret 加密。

要在单节点集群上禁用 Secret 加密:

  1. 禁用

    k3s secrets-encrypt disable
  2. 使用相同的参数终止并重启 K3s Server。如果将 K3s 作为服务运行:

    # 如果使用 systemd
    systemctl restart k3s
    # 如果使用 openrc
    rc-service k3s restart
  3. 使用标志重新加密

    k3s secrets-encrypt reencrypt --force --skip

要在单节点集群上重新启用 Secret 加密:

  1. 启用

    k3s secrets-encrypt enable
  2. 使用相同的参数终止并重启 K3s Server。

  3. 使用标志重新加密

    k3s secrets-encrypt reencrypt --force --skip

Secret 加密状态

secrets-encrypt 工具包含一个 status 命令,该命令能显示节点上 Secret 加密的当前状态信息。

单 Server 节点上的命令示例:

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

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

以下是另一个关于 HA 集群的例子,在轮换密钥后,重启 server 之前:

$ k3s 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

各部分详情如下:

  • Encryption Status:显示节点上的 Secret 加密是禁用还是启用的
  • Current Rotation Stage:表示节点上当前的轮换阶段
    Stage 可能是:startpreparerotatereencrypt_requestreencrypt_activereencrypt_finished
  • Server Encryption Hashes:对 HA 集群有用,表明所有 server 是否与本地文件处于同一阶段。这可用于确定在进入下一阶段之前是否需要重启 server。在上面的 HA 例子中,node-1 和 node-2 的哈希值不同,说明它们目前没有相同的加密配置。重启 server 将同步它们的配置。
  • Key Table:汇总在节点上找到的 Secret 加密密钥的信息。
    • Active:“*”表示当前使用了哪些密钥(如果有的话)进行Secret 加密。Kubernetes 使用 active 密钥来加密新的 Secret。
    • Key Type:使用此工具的所有密钥都是 AES-CBC 类型。详情请参见此处
    • Name:加密密钥的名称。