LabHub
学习 学习路径 课程

Kubernetes 运维实务

亲自确认 etcd 里的明文,再把它堵上

在 LabHub 中继续学习

目标

直接打开etcd确认Secret实际上是如何存储的,存储时分别用manifest写下加密、信封加密、访问控制、外部存储库这四层对应。

为什么重要

传播最广泛的误解是“Secret是base64,所以很安全”。base64是一种没有密钥的表达方式,所以只要一个命令就能还原,更重要的是,在默认设置中,apiserver将Secret直接写成等d。因此,在前一个模块中学习的etcd快照也是集群中最敏感的文件。在这个练习中,不是通过别人的话,而是亲自确认这个事实。对应不仅仅是一层。EncryptionConfiguration阻止获得磁盘的人,KMS信封加密甚至将该密钥从群集之外移除。但是即使加密存储也对通过API读取的人没有用,所以需要RBAC,resourceNames可以进一步缩小到以罗为单位,但那个list/watch也应该知道不能通用的局限性。最后,包括把值完全放在集群以外的外部秘密方式,区分四层分别阻止什么和什么,这是这个实训的核心。

阶段

  1. 名称空间secret-lab制作并放入其中Secretdb-password请制作。类型是Opaque和身高password的值是labhub-Pr0d-2026是。作为后面比较权限的对照群,Secretother-secret请做一个。
  2. db-passworddata.password价格保持原样/root/ops/secrets/out/encoded.txt啊,解码了那个的平文/root/ops/secrets/out/decoded.txt请保存到(解码结果为labhub-Pr0d-2026必须相连,两个文件必须相互对应)。还有/root/ops/secrets/out/base64-note.txt请用一行文字写下结论,即base64只是编码,不是加密。
  3. /root/ops/secrets/encryption-config.yaml请使用。apiVersionapiserver.config.k8s.io/v1kindEncryptionConfiguration并且resources[0].resourcessecrets必须进去。providers第一个是实际加密提供商(aescbcsecretboxaesgcm其中之一)并且keys[0].name必须有这个,最后identity必须是。
  4. /root/ops/secrets/kms-config.yaml请使用。kindEncryptionConfiguration并且providers[0]kms必须是。kms.apiVersionv2kms.endpointunix://以开始的套接字路径,kms.name也应该有。还有/root/ops/secrets/out/envelope-note.txt请说明信封加密的两层结构(数据密钥和主密钥)。
  5. /root/ops/secrets/external-secret.yaml请用两个文件。一个是kind: SecretStore,另一个是kind: ExternalSecret是。ExternalSecret里面有spec.refreshIntervalspec.secretStoreRef.namespec.target.namespec.target.creationPolicyspec.data[0].remoteRef.key必须有全部。在这个文件中实际密码labhub-Pr0d-2026如果进入这里,就不能了
  6. secret-labE ServiceAccountdb-client制作,Roledb-secret-reader请制作。规则是secrets关于资源resourceNamesdb-password一个,verbsget必须只有一个。这个角色db-client用RoleBinding进行。结果db-clientdb-password读,other-secret不能阅读,查看秘密列表(list)也不能做。还有/root/ops/secrets/out/resourcenames-note.txtresourceNameslist/watch请写上不通的情况。
  7. secret-labE Secretpinned-config请制作。immutable: true和身高build的值是2026-08-20是。然后尝试更改这个值,并发送拒绝消息。/root/ops/secrets/out/immutable-error.txt请保存。保存后也build价格仍然是2026-08-20应该接着。
  8. 在etcd中/registry/secrets/secret-lab/db-password查询了身高后打印出来的输出/root/ops/secrets/out/etcd-secret.txt请保存到。在这个文件里平文labhub-Pr0d-2026必须看到这个。还有/root/ops/secrets/out/secrets-audit.json请制作。total_secretssecret-lab必须与实际Secret数量一致,encrypted_at_restfalseplaintext_visible_in_etcdtrue是。mitigations在配置中写入3个以上的对应方案,存储时加密(EncryptionConfiguration或“加密”)和访问权限控制(RBAC或者必须包含“权限”)。

参考

制作两个练习用的Secret

名称空间secret-lab制作并放入其中Secretdb-password请制作。类型是Opaque和身高password的值是labhub-Pr0d-2026是。作为后面比较权限的对照群,Secretother-secret请做一个。

请确认基本类型是什么。因为后面需要比较权限范围的对照组,所以要制作两个。

直接查看base64

db-passworddata.password价格保持原样/root/ops/secrets/out/encoded.txt啊,解码了那个的平文/root/ops/secrets/out/decoded.txt请保存到(解码结果为labhub-Pr0d-2026必须相连,两个文件必须相互对应)。还有/root/ops/secrets/out/base64-note.txt请用一行文字写下结论,即base64只是编码,不是加密。

这是用手确认编码和加密差异的步骤。请确认反向值和编码值是否相互对应。

保存时写入加密设置

/root/ops/secrets/encryption-config.yaml请使用。apiVersionapiserver.config.k8s.io/v1kindEncryptionConfiguration并且resources[0].resourcessecrets必须进去。providers第一个是实际加密提供商(aescbcsecretboxaesgcm其中之一)并且keys[0].name必须有这个,最后identity必须是。

用来写作的是列表的第一项。要继续阅读现有平文,请思考最后应该留下什么。键需要一个名称。

KMS v2 信封加密设置写入

/root/ops/secrets/kms-config.yaml请使用。kindEncryptionConfiguration并且providers[0]kms必须是。kms.apiVersionv2kms.endpointunix://以开始的套接字路径,kms.name也应该有。还有/root/ops/secrets/out/envelope-note.txt请说明信封加密的两层结构(数据密钥和主密钥)。

插件不是连接到网络,而是连接到插座。请把两层结构是什么留下来作为备忘录。

写外部秘密存储库关联文件夹

/root/ops/secrets/external-secret.yaml请用两个文件。一个是kind: SecretStore,另一个是kind: ExternalSecret是。ExternalSecret里面有spec.refreshIntervalspec.secretStoreRef.namespec.target.namespec.target.creationPolicyspec.data[0].remoteRef.key必须有全部。在这个文件中实际密码labhub-Pr0d-2026如果进入这里,就不能了

需要两个文件。一个定义从哪里拿来,另一个定义用什么名字做什么。如果manifest中包含实际密码,使用理由就会消失。

制作一个只打开一个秘密的角色

secret-labE ServiceAccountdb-client制作,Roledb-secret-reader请制作。规则是secrets关于资源resourceNamesdb-password一个,verbsget必须只有一个。这个角色db-client用RoleBinding进行。结果db-clientdb-password读,other-secret不能阅读,查看秘密列表(list)也不能做。还有/root/ops/secrets/out/resourcenames-note.txtresourceNameslist/watch请写上不通的情况。

有通过名字缩小范围的字段。但是请一起整理一下,这个字段不适用的一些动词。

制作不变Secret并确认拒绝修改

secret-labE Secretpinned-config请制作。immutable: true和身高build的值是2026-08-20是。然后尝试更改这个值,并发送拒绝消息。/root/ops/secrets/out/immutable-error.txt请保存。保存后也build价格仍然是2026-08-20应该接着。

关闭后尝试实际更改,并留下拒绝信息。错误会显示为标准错误。

从etcd中拿出平文作为证据留存

在etcd中/registry/secrets/secret-lab/db-password查询了身高后打印出来的输出/root/ops/secrets/out/etcd-secret.txt请保存到。在这个文件里平文labhub-Pr0d-2026必须看到这个。还有/root/ops/secrets/out/secrets-audit.json请制作。total_secretssecret-lab必须与实际Secret数量一致,encrypted_at_restfalseplaintext_visible_in_etcdtrue是。mitigations在配置中写入3个以上的对应方案,存储时加密(EncryptionConfiguration或“加密”)和访问权限控制(RBAC或者必须包含“权限”)。

请回想一下容器对象的键路径规则。虽然值看起来像protobuf,但字符串会保持原样。