静态加密 Secret 数据

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 .

    配置并确定是否已启用静态数据加密

    kube-apiserver 的参数 --experimental-encryption-provider-config 控制 API 数据在 etcd 中的加密方式。 下面提供一个配置示例。

    每个 resources 数组项目是一个单独的完整的配置。 resources.resources 字段是要加密的 Kubernetes 资源名称(resourceresource.group)的数组。 providers 数组是可能的加密 provider 的有序列表。每个条目只能指定一个 provider 类型(可以是 identityaescbc,但不能在同一个项目中同时指定)。

    列表中的第一个提供者用于加密进入存储的资源。当从存储器读取资源时,与存储的数据匹配的所有提供者将尝试按顺序解密数据。 如果由于格式或密钥不匹配而导致提供者无法读取存储的数据,则会返回一个错误,以防止客户端访问该资源。

    重要: 如果通过加密配置无法读取资源(因为密钥已更改),唯一的方法是直接从基础 etcd 中删除该密钥。任何尝试读取资源的调用将会失败,直到它被删除或提供有效的解密密钥。

    加密您的数据

    创建一个新的加密配置文件:

    1. apiVersion: apiserver.config.k8s.io/v1
    2. - resources:
    3. - secrets
    4. providers:
    5. - aescbc:
    6. keys:
    7. - name: key1
    8. secret: <BASE 64 ENCODED SECRET>
    9. - identity: {}

    遵循如下步骤来创建一个新的 secret:

    1. 生成一个 32 字节的随机密钥并进行 base64 编码。如果您在 Linux 或 Mac OS X 上,请运行以下命令:

      1. head -c 32 /dev/urandom | base64
    1. 将这个值放入到 secret 字段中。
    2. 设置 kube-apiserver--experimental-encryption-provider-config 参数,将其指定到配置文件所在位置。
    3. 重启您的 API server。

    重要: 您的配置文件包含可以解密 etcd 内容的密钥,因此您必须正确限制主设备的权限,以便只有能运行 kube-apiserver 的用户才能读取它。

    数据在写入 etcd 时会被加密。重新启动你的 kube-apiserver 后,任何新创建或更新的密码在存储时都应该被加密。 如果想要检查,你可以使用 etcdctl 命令行程序来检索你的加密内容。

      1. ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
    1. 这里的 `[...]` 是用来连接 etcd 服务的额外参数。
    1. 验证存储的密钥前缀是否为 k8s:enc:aescbc:v1:,这表明 aescbc provider 已加密结果数据。
    2. 通过 API 检索,验证 secret 是否被正确解密:

    1. 必须匹配 `mykey: mydata`

    确保所有 secret 都被加密

    由于 secret 是在写入时被加密,因此对 secret 执行更新也会加密该内容。

    1. kubectl get secrets --all-namespaces -o json | kubectl replace -f -

    上面的命令读取所有 secret,然后使用服务端加密来进行更新。 如果由于冲突写入而发生错误,请重试该命令。 对于较大的集群,您可能希望通过命名空间或更新脚本来分割 secret。

    在不发生停机的情况下更改 secret 需要多步操作,特别是在有多个 kube-apiserver 进程正在运行的高可用部署的情况下。

    1. 生成一个新密钥并将其添加为所有服务器上当前提供程序的第二个密钥条目
    2. 重新启动所有 kube-apiserver 进程以确保每台服务器都可以使用新密钥进行解密
    3. 将新密钥设置为 keys 数组中的第一个条目,以便在配置中使用其进行加密
    4. 重新启动所有 kube-apiserver 进程以确保每个服务器现在都使用新密钥进行加密
    5. 运行 kubectl get secrets --all-namespaces -o json | kubectl replace -f - 以用新密钥加密所有现有的秘密
    6. 在使用新密钥备份 etcd 后,从配置中删除旧的解密密钥并更新所有密钥

    如果只有一个 kube-apiserver,第 2 步可能可以忽略。

    解密所有数据

    要禁用 rest 加密,请将 identity provider 作为配置中的第一个条目: