Kubernetes EncryptionConfiguration 中的“身份”提供者提供什么样的安全性?

What kind of security does `identity` provider in Kubernetes EncryptionConfiguration provide?

参考:https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#providers

根据文档

Resources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.

When set as the first provider, the resource will be decrypted as new values are written. 听起来很混乱。如果资源按原样写入 etcd,为什么 decrypted as new values are written 意味着?

然后是

By default, the identity provider is used to protect secrets in etcd, which provides no encryption.

如果不进行加密,identity 提供商提供什么样的安全性?如果进行加密,它是哪种加密?

关于 security

etcd 中所述

Does etcd encrypt data stored on disk drives?

没有。 etcd 不加密存储在磁盘驱动器上的 key/value 数据。如果用户需要加密存储在 etcd 上的数据,有一些选项:

  • 让客户端应用程序加密和解密数据
  • 使用底层存储系统的功能来加密存储的数据,如 dm-crypt

问题的第一部分:

By default, the identity provider is used to protect secrets in etcd, which provides no encryption. It means that by default k8s api is using identity provider while storing secrets in etcd and it doesn't provide any encryption.

EncryptionConfiguration 与唯一的一个提供者一起使用:identity 给你的结果与根本不使用 EncryptionConfiguration 相同(假设你之前根本没有任何加密的秘密). 所有机密数据将以纯文本形式存储在 etcd.

示例:

    providers:
    - identity: {}

你问题的第二部分:

Resources written as-is without encryption. This is described and explained in the first part of the question

设置为第一个提供者时,将在写入新值时解密资源。

看看这个例子:

    providers:
    - aescbc:
        keys:
        - name: key1
          secret: <BASE 64 ENCODED SECRET>
    - identity: {}

此配置对您的意义:

  • 引入您的新供应商 EncryptionConfiguration 不会影响现有数据。
  • etcd 中的所有现有 secrets(在应用此配置之前)仍然是纯文本。
  • 从此配置开始,所有新 secrets 都将使用 aescbc 加密保存。 etcd 中的所有新 secrets 都会有前缀 k8s:enc:aescbc:v1:key1.
  • 在这种情况下,您将在 etcd 中混合使用加密和未加密数据。

所以问题是我们为什么要使用这两个提供商?

  • provider: aescbc 用于在写入操作期间写入新的 secrets 作为加密数据,并在读取操作期间解密现有的 secrets
  • 提供商:identity 仍然需要阅读所有未加密的秘密。

现在我们正在 EncryptionConfiguration 更换供应商:

    providers:
    - identity: {}
    - aescbc:
        keys:
        - name: key1
          secret: <BASE 64 ENCODED SECRET>
  • 在这种情况下,您将在 etcd 中混合使用加密和未加密数据。
  • 从此配置开始,所有新 secrets 都将以纯文本形式保存
  • 对于 etcd 中前缀为 k8s:enc:aescbc:v1:key1 的所有现有机密提供程序:aescbc 配置将用于解密存储在 etcd 中的现有机密。

When set as the first provider, the resource will be decrypted as new values are written

为了从mixture of encrypted and not encrypted data切换到我们只有“未加密”数据的场景,您应该对所有秘密执行read/write操作:

$ kubectl get secrets --all-namespaces -o json | kubectl replace -f -

why's it there if it offers no encryption but the docs seem to talk about decryption and how it protects.

如果您混合使用加密数据和未加密数据,则必须使用 identity 提供程序类型 或者如果你想解密所有现有的 secrets(存储在 etcd 中)由另一个提供商加密。

以下命令读取所有机密,然后更新它们以应用服务器端加密。可以在 this paragraph

中找到更多详细信息

$ kubectl get secrets --all-namespaces -o json | kubectl replace -f -

根据您的 EncryptionConfiguration,所有 secrets 将保存为未加密 - 如果第一个提供者是:identity 或者如果第一个提供者是不同类型则加密。

另外

EncryptionConfig 默认设置为禁用。要使用它,您必须在 kube-apiserver 配置中添加 --encryption-provider-configIdentity 没有加密任何数据,根据 Encrypted Providers documentation 它有 3x N/A.