Kubernetes Secret 安全么

如果要在 kubernetes 保存密码,你一定会想到要使用 secret

  docker-registry Create a secret for use with a Docker registry
  generic         Create a secret from a local file, directory or literal value
  tls             Create a TLS secret

secret分为以上3种,我们来创建一个 generic 类型的 secret 来保存一个密码

kubectl create secret generic secretname --from-literal="mykey=myvalue"

通过以下命令,可以简单查看这个 secret

kubectl get secret secretname -o jsonpath='{.data}'

secret保存base64编码的数据,并在解码后将其作为环境变量或挂载卷提供给pod使用

所以经常有人误认为secret是安全的,然而base64编码不是加密方法,从安全角度上看,它和纯文本没有区别。

echo 'bXl2YWx1ZQ==' | base64 --decode

实际上,secret的安全性在于

  • 只有运行了需要访问secret的pod的节点,才会拥有 secret
  • 在节点上,secret存储在tmpfs内存中,永远不会写入物理内存,而且会随着 pod 一起删除

tmpfs有以下优势:

1。动态文件系统的大小,/dev /shm/需要注意的一个是容量问题,在linux下,它默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有 100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的
2。tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
3。tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

这里我创建一个 nginx 部署,挂载刚刚创建的secret

这个pod被分配在节点2上

Secret 的大小不能超过1MB,不能用于存储太大的数据,也不适合作为非配置类型的数据。

因为Base64编码,存储的数据大约只能有700kb

Send a Message