• 售前

  • 售后

热门帖子
入门百科

在K8S中,如何安全管理Secrets?

[复制链接]
身无分文的少年 显示全部楼层 发表于 2022-1-12 17:02:48 |阅读模式 打印 上一主题 下一主题
微信公众号:运维开发故事,作者:乔克
  为何要加密?

在Kubernetes中,Secret是用来帮我们存储敏感信息的,比如密码、证书等,但是在默认的情况下,Secret只是做了简单的base64编码,任何人都可以非常容易的对其进行解密获取到原始数据。
比如通过以下方法生成一个secret对象:
  1. <code>$ echo -n "coolops" | kubectl create secret generic mysecret --dry-run --from-file=secret=/dev/stdin -o yaml > secret.yaml
  2. $ cat secret.yaml
  3. apiVersion: v1
  4. data:
  5.   secret: Y29vbG9wcw==
  6. kind: Secret
  7. metadata:
  8.   creationTimestamp: null
  9.   name: mysecret
复制代码
其他人只要拿到secret的值,就可以对其进行解密获取到真实数据,如下:
  1. <code>$ echo "Y29vbG9wcw==" | base64 -d
  2. coolops
复制代码
这样就非常的不安全,有点"掩耳盗铃"的意思。
在Kubernetes集群中,Etcd是集群数据库,存储着集群所以的资源数据,其中也包括Secrets,所以拿下了这个数据库就等于拿下了整个集群,所以在生产环境中对其进行加密是非常有必要的。
如何进行加密?

静态加密

kubernetes 1.13版本之后,提供静态加密方式,其主要是通过kube-apiserver来控制Secrets的加解密,而在Etcd中存储的是加密后的信息,所以攻击者拿下了etcd,也无法轻易的拿到Secrets保存的敏感数据。
   !! 当前集群是使用kubeadm安装,版本1.18.9
  (1)创建加密配置文件,保存到master节点/etc/kubernetes/pki/static-secret-encryption.yaml中
  1. <code>apiVersion: apiserver.config.k8s.io/v1
  2. kind: EncryptionConfiguration
  3. resources:
  4.   - resources:
  5.     - secrets
  6.     providers:
  7.     - aescbc:
  8.         keys:
  9.         - name: mysecret
  10.           secret: DJqYaMMpY2DNlHz+HYrFYOUSh5SXKWiVOwLf6nQX9ss=
  11.     - identity: {}
复制代码
其中secret是加密密钥,使用如下命令生成:
  1. <code>$ head -c 32 /dev/urandom | base64
复制代码
(2)修改kube-apiserver启动参数,位置/etc/kubernetes/manifests/kube-apiserver.yaml
  1. <code>......
  2. spec:
  3.   containers:
  4.   - command:
  5.     - kube-apiserver
  6.     - --encryption-provider-config=/etc/kubernetes/pki/static-secret-encryption.yaml
  7. ......   
复制代码
  !! 注意:kube-apiserver的加密参数,在1.14之后是–encryption-provider-config
  (3)重启kube-apiserver
(4)验证加密
首先创建一个secret资源,如下:
  1. <code>$ kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
复制代码
然后查看etcd中的数据
[code]$ ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key get /registry/secrets/default/secret1  | hexdump -C00000000  2f 72 65 67 69 73 74 72  79 2f 73 65 63 72 65 74  |/registry/secret|00000010  73 2f 64 65 66 61 75 6c  74 2f 73 65 63 72 65 74  |s/default/secret|00000020  31 0a 6b 38 73 3a 65 6e  63 3a 61 65 73 63 62 63  |1.k8s:enc:aescbc|00000030  3a 76 31 3a 6d 79 73 65  63 72 65 74 3a b6 90 7d  |:v1:mysecret:..}|00000040  b3 40 9b 4d 63 eb 71 cf  ca 16 52 a0 91 82 c3 69  |.@.Mc.q...R....i|00000050  2b 6f e5 1c ae 88 58 0d  4f 08 c9 29 57 69 f5 e6  |+o....X.O..)Wi..|00000060  e2 7c 42 79 bb 84 22 3a  90 54 5e d4 ac f6 a6 a6  |.|By..":.T^.....|00000070  47 e2 b2 67 29 d8 c4 c6  61 9e 84 62 9d 3c 7c b0  |G..g)...a..b.

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作