为什么在 Kubernetes 中每写入 200k 次就轮换一次带有随机数的 AES-GCM?

Why AES-GCM with random nonce should be rotated every 200k writes in Kubernetes?

我们正在通过本教程 (https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) 在 Kubernetes 中实现静态加密,我们完全不确定为什么 AES-GCM 加密提供程序需要每 200K 次写入就轮换一次密钥,因为缺乏相关知识加密是如何工作的。另外,究竟是什么意思:“200K 写入”,我们如何定义我们应该轮换密钥?谢谢

根据 OpenShift 文档: https://docs.openshift.com/container-platform/3.11/admin_guide/encrypting_data.html

Kubernetes has no proper nonce generator and uses a random IV as nonce for AES-GCM. Since AES-GCM requires a proper nonce to be secure, AES-GCM is not recommended. The 200,000 write limit just limits the possibility of a fatal nonce misuse to a reasonable low margin.

这只是我所看到的任意数字。

we are absolutely not sure why AES-GCM encryption provider requires to rotate

GCM 模式基本上是一个 CTR streaming mode,具有内置的完整性验证(消息验证码)。对于此模式,防止重复使用相同的 IV/key 对非常重要。建议限制使用相同密钥加密的内容数量限制随机数冲突的概率和密钥分析选项(这些是背后的一些数学,已经在评论中提到)。

是的,200k 是一个任意数字,但必须有人给出一个合理的数字,其中 nonce 冲突概率仍然可以忽略不计并且密钥可以在很长一段时间内使用。

what exactly means: "200K writes",

这通常很难估计,具体取决于“写入”的内容。如果您使用密钥加密其他随机密钥(作为包装密​​钥)或者密钥用于加密大量连续内容(例如存储),则可能会有所不同。

how can we define that we should rotate the key?

让我们实际一点,例如AWS KMS 每年提供自动密钥轮换。基于这个问题,假设密钥用于加密 etcd 存储(配置),每年轮换可能是一个安全的选择。 (我预计你在 k8s 集群中没有 200k secrets 和 config maps)。

密钥轮换过程通常会创建一个新密钥(密钥版本),并使用新密钥对新内容进行加密。现有内容仍然可以使用旧密钥解密。

在这方面,我有点担心文档中如何描述 key rotation。基本上步骤 1-4 看起来没问题,一个新的加密密钥被定义并生效。第 5 步和第 6 步是使用新密钥重新加密所有 etcd 内容,基本上限制(如果不违反)密钥轮换的整个目的。如果您有时间和耐心深入研究,也许您可​​以通过支持来获取它。