当前位置: 首页 > Linux

K8S实战(十三)-Secretobject

时间:2023-04-06 01:33:32 Linux

PrefaceSecret可用于存储密码、密钥等敏感信息,避免密钥直接在Pod的YAML定义文件或容器镜像中泄露。密钥使用Base64编码存储在Secret对象中,挂载Pod后自动解码为明文。更新历史20200702-初稿-左成礼原文地址-https://blog.zuolinux.com/2020/07/02/about-secret.html通过kubectl创建Secret创建用户名/密码文件echo-n'username'>./username.txttechho-n'password'>./password.txt写入Secret对象#kubectlcreatesecretgenericdb-info--from-file=./username.txt--from-file=./密码。txtsecret/db-infocreatedCheckSecret#kubectlgetsecretNAMETYPEDATAAGEdb-infoOpaque2106s查看刚刚写入的db-info的详细信息#kubectldescribesecretdb-infoName:db-infoNamespace:defaultLabels:Annotations:Type:OpaqueData====username.txt:8bytespassword.txt:8bytes查看key的值#kubectlgetsecretdb-info-oyaml通过YAML创建一个Secret,并将值进行Base64编码保存#echo-n'用户名'|base64dXNlcm5hbWU=#echo-n'密码'|base64cGFzc3dvcmQ=catsecret.yamlapiVersion:v1kind:Secretmetadata:name:mysecrettype:Opaquedata:用户名:base64编码密码:base64编码创建secret#kubectlapply-fsecret.yamlsecret/mysecretcreatedview#kubectlgetsecretNAMETYPEDATAAGEmysecretOpaque22m5s查看key的值#kubectlgetsecretmysecret-oyamleditsecretkubectleditsecretsinmyse使用Pod中的Secret将Secret以卷的形式挂载到Pod中。卷中的每个文件名对应于Secret中的一个密钥名称。Secret的值经过base64解码后以明文形式存储在volume文件中。实时动态更新apiVersion:v1kind:Podmetadata:name:mypodspec:containers:-name:mypodimage:redisvolumeMounts:-name:foomountPath:"/etc/foo"readOnly:truevolumes:-name:foosecret:secretName:mysecretmysecret的secret对象映射到一个volume,volume名称为foo,名为foo的volume挂载在Pod中的路径/etc/foo下。mysecret中的两个keyusername/password分别映射到文件中。多个Pod可以共享一个roll。可以进入Pod查看这两个文件的内容#kubectlexec-itmypod--ls/etc/foo/passwordusername#kubectlexec-itmypod--cat/etc/foo/usernameadmin#kubectlexec-itmypod--cat/etc/foo/passwordpassword结论Secret对象将非常重要的密钥与Pod分离。它有以下特点:Secret对象需要在引用它的Pod之前创建。Secret对象和引用它的Pod必须在同一个命名空间中。单个Secret对象的大小限制为1M。Secret对象中的数据以明文形式存储在etcd中。除了作为卷挂载之外,它还可以作为环境变量在Pod中使用。使用环境变量形式的问题是秘密不能实时动态更新。官方安全建议:管理员应为集群数据启用静态加密(v1.13及更高版本)。管理员应将对etcd的访问权限限制为仅管理员用户。APIserver中的秘密数据驻留在etcd使用的磁盘上;etcd使用的磁盘在不再使用时应擦除/切碎。如果etcd在集群中运行,管理员应确保etcd之间的通信使用SSL/TLS加密。secret的YAML中包含的base64编码是一种可逆编码,请勿将其添加到代码库或公开。防止应用程序读取secret中的数据后写入日志造成泄露。所有可以运行pod的用户都可以读取挂载卷中的秘密值。任何节点的root用户都可以通过模拟kubelet读取APIserver中的任何Secret。只向真正需要Secret的节点发送Secret数据,可以限制节点root账户漏洞的影响,该功能还在计划中。联系我微信公众号:zuolinux_com