diff --git a/content/zh-cn/docs/tasks/administer-cluster/encrypt-data.md b/content/zh-cn/docs/tasks/administer-cluster/encrypt-data.md index ec7b173086..a85b9af428 100644 --- a/content/zh-cn/docs/tasks/administer-cluster/encrypt-data.md +++ b/content/zh-cn/docs/tasks/administer-cluster/encrypt-data.md @@ -39,6 +39,7 @@ encrypt Secret objects, including the key-value data they contain. 此任务涵盖使用 {{< glossary_tooltip text="Kubernetes API" term_id="kubernetes-api" >}} 存储的资源数据的加密。 例如,你可以加密 Secret 对象,包括它们包含的键值数据。 + + Kubernetes 静态数据加密的 Provider @@ -306,8 +309,10 @@ Kubernetes 静态数据加密的 Provider - + 不加密写入的资源。当设置为第一个 provider 时,已加密的资源将在新值写入时被解密。 @@ -316,7 +321,9 @@ Kubernetes 静态数据加密的 Provider aescbc - + 带有 PKCS#7 填充的 AES-CBC 弱 @@ -325,18 +332,24 @@ Kubernetes 静态数据加密的 Provider - + 由于 CBC 容易受到密文填塞攻击(Padding Oracle Attack),不推荐使用。密钥材料可从控制面主机访问。 aesgcm - + 带有随机数的 AES-GCM - + 每写入 200k 次后必须轮换 最快 @@ -344,14 +357,18 @@ Kubernetes 静态数据加密的 Provider - + 不建议使用,除非实施了自动密钥轮换方案。密钥材料可从控制面主机访问。 kms v1 (自 Kubernetes 1.28 起弃用) - + 针对每个资源使用不同的 DEK 来完成信封加密。 最强 @@ -380,7 +397,9 @@ Kubernetes 静态数据加密的 Provider kms v2 (beta) - + 针对每个 API 服务器使用不同的 DEK 来完成信封加密。 最强 @@ -440,7 +459,7 @@ Kubernetes 静态数据加密的 Provider Each provider supports multiple keys - the keys are tried in order for decryption, and if the provider is the first provider, the first key is used for encryption. --> -每个 provider 都支持多个密钥 - 在解密时会按顺序使用密钥,如果是第一个 provider,则第一个密钥用于加密。 +每个 Provider 都支持多个密钥 - 在解密时会按顺序使用密钥,如果是第一个 Provider,则第一个密钥用于加密。 {{< caution >}} +### 重新配置其他控制平面主机 {#api-server-config-update-more} + +如果你的集群中有多个 API 服务器,应轮流将更改部署到每个 API 服务器。 + +确保在每个控制平面主机上使用**相同的**加密配置。 + + -## 验证数据已被加密 {#verifying-that-data-is-encryped} +### 验证数据已被加密 {#verifying-that-data-is-encryped} 数据在写入 etcd 时会被加密。重新启动你的 `kube-apiserver` 后,任何新创建或更新的 Secret -或在 `EncryptionConfiguration` 中配置的其他资源类型都应在存储时被加密。 +或在 `EncryptionConfiguration` 中配置的其他资源类别都应在存储时被加密。 + 如果想要检查,你可以使用 `etcdctl` 命令行程序来检索你的 Secret 数据内容。 -1. 创建一个新的 secret,名称为 `secret1`,命名空间为 `default`: +以下示例演示了如何对加密 Secret API 进行检查。 + + +1. 创建一个新的 Secret,名称为 `secret1`,命名空间为 `default`: ```shell kubectl create secret generic secret1 -n default --from-literal=mykey=mydata ``` -2. 使用 `etcdctl` 命令行,从 etcd 中读取 Secret: +2. 使用 `etcdctl` 命令行工具,从 etcd 中读取 Secret: ``` ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C @@ -686,38 +728,61 @@ program to retrieve the contents of your secret data. ``` - 其输出应该包含 `mykey: bXlkYXRh`,`mydata` 的内容是被加密过的, + 其输出应该包含 `mykey: bXlkYXRh`,其中 `mydata` 的内容使用 base64 进行加密, 请参阅[解密 Secret](/zh-cn/docs/tasks/configmap-secret/managing-secret-using-kubectl/#decoding-secret) 了解如何完全解码 Secret 内容。 -## 确保所有 Secret 都被加密 {#ensure-all-secrets-are-encrypted} +### 确保所有相关数据都被加密 {#ensure-all-secrets-are-encrypted} -由于 Secret 是在写入时被加密,因此对 Secret 执行更新也会加密该内容。 +仅仅确保新对象被加密通常是不够的:你还希望对已经存储的对象进行加密。 +例如,你已经配置了集群,使得 Secret 在写入时进行加密。 +为每个 Secret 执行替换操作将加密那些对象保持不变的静态内容。 + +你可以在集群中的所有 Secret 上进行此项变更: + + ```shell +# 以能够读写所有 Secret 的管理员身份运行此命令 kubectl get secrets --all-namespaces -o json | kubectl replace -f - ``` -上面的命令读取所有 Secret,然后使用服务端加密来更新其内容。 +上面的命令读取所有 Secret,然后使用相同的数据更新这些 Secret,以便应用服务端加密。 {{< note >}} 如果由于冲突写入而发生错误,请重试该命令。 +多次运行此命令是安全的。 + 对于较大的集群,你可能希望通过命名空间或更新脚本来对 Secret 进行划分。 {{< /note >}}