blog/kubernetes/secrets/encryption.md

6.8 KiB
Raw Permalink Blame History

Secret 的静态加密

kubernetes 集群中secret默认是明文存储(base64编码)。可以通过开启静态加密来对secret进行加密。

开启静态加密

通过配置apiserver来开启静态加密功能。

创建静态加密配置

开启静态加密需要一个配置文件。以下是配置示例:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - identity: {}
    - aesgcm:
        keys:
        - name: key1
          secret: c2VjcmV0IGlzIHNlY3VyZQ==
        - name: key2
          secret: dGhpcyBpcyBwYXNzd29yZA==
    - aescbc:
        keys:
        - name: key1
          secret: c2VjcmV0IGlzIHNlY3VyZQ==
        - name: key2
          secret: dGhpcyBpcyBwYXNzd29yZA==
    - secretbox:
        keys:
        - name: key1
          secret: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=

这个配置示例是从官方文档复制来的。这是一个包含许多类型的配置,直接使用是无法加密的(可能是因为- identity: {}是列表第一项),使用时请参考后面的配置

kubernetes 支持 identityaescbcsecretboxaesgcmkms 这几种加密方式,其中aescbc为官方推荐加密类型,aesgcm为不推荐加密类型,kms需要第三方工具管理。

加密密钥获取方式

head -c 32 /dev/urandom | base64

此命令会获得一个随机的32位密钥

只提供需要的加密类型的配置

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - aescbc:
        keys:
        - name: key1
          secret: eGy+iOygy5lN1jWWYRVtVXywe5HDc1Op9lUgR5MRaPo=
    - identity: {}

配置apiserver

编辑文件kube-apiserver.yaml

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  - command:
    - kube-apiserver
    ...
    - --experimental-encryption-provider-config=/etc/kubernetes/pki/encryption.yaml

如果是kubeadm安装的集群配置文件位于/etc/kubernetes/manifests/kube-apiserver.yaml

注意:这里的加密配置文件放在/etc/kubernetes/pki/encryption.yaml因为这个目录是默认挂载到apiserver的pod里的也可以放在其他目录并修改挂载选项挂载进去

注意必须先写好配置文件在修改apiserver的配置否则apiserver可能需要多次重启

配置文件修改完成后apiserver的pod会自动重启。

现在新创建的secret会自动加密了。

验证

创建一个secret

kubectl create secret generic secret1 -n default --from-literal=mykey=mydata

使用 etcdctl 命令行,从 etcd 中读取 secret

ETCD_POD=$(kubectl -n kube-system get pod -l component=etcd  -o name)
kubectl -n kube-system exec -it ${ETCD_POD} -- etcdctl get /registry/secrets/default/secret1 --endpoints=localhost:2379 --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --cacert=/etc/kubernetes/pki/etcd/ca.crt |hexdump -C

这个是从官方文档改成kubectl的命令原命令ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [你的参数] | hexdump -C

可以在结果中找到1..k8s:enc:aescb表示加密成功,这是文件的其他内容都是乱码

00000000  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 0d 0a 6b 38 73 3a 65  6e 63 3a 61 65 73 63 62  |1..k8s:enc:aescb|
                       00000030  63 3a 76 31 3a 6b 65 79  31 3a c6 76 5c ca d4 9a  |c:v1:key1:.v\...|
                                                                                                     00000040  ee 49 87 86 98 7e d9 22  30 42 16 c7 9a 7e e1 08  |.I...~."0B...~..|
                                                                                                                                                                                   00000050  71 e1 8b 1d bc 57 44 ae  04 77 5f 8f 5c f6 29 ee  |q....WD..w_.\.).|
                                              00000060  8f 3c ed 2b cc 8a cb d2  25 fd b2 ba 3a c3 c5 5e  |.<.+....%...:..^|
                                                                                                                            00000070  70 99 03 6e 0d 0a e9 c4  90 a4 cb e3 09 92 ec de  |p..n............|
                                                                                                                                                                                                          00000080  2f 20 eb 35 b7 be 93 f0  09 a1 84 48 8c 3a ed 43  |/ .5.......H.:.C|
                                                                     00000090  47 b6 cf 96 cc 25 7e 54  f3 c2 93 34 cc 0c 25 6d  |G....%~T...4..%m|
                                                                                                                                                   000000a0  d9 df ca f3 ed a1 d8 8e  55 1b 26 58 d9 3f f2 fc  |........U.&X.?..|
              000000b0  58 ed a1 0f 4d 4b e9 11  bf ba e0 52 4f 74 8e 5b  |X...MK.....ROt.[|
                                                                                            000000c0  47 c3 68 db f9 6c e9 b5  f5 3c 1c 64 a4 49 9b 68  |G.h..l...<.d.I.h|
                                                                                                                                                                          000000d0  18 30 de d9 1c 36 fb 43  e2 d7 0f 18 84 09 2d 46  |.0...6.C......-F|
                                     000000e0  b1 97 31 87 0f eb 68 83  2c 4f 0b 42 1c 01 d0 ca  |..1...h.,O.B....|
                                                                                                                   000000f0  e2 88 b9 0c 97 cf 77 8d  d1 73 83 ed 1d c2 19 57  |......w..s.....W|
                                                                                                                                                                                                 00000100  2f f0 cd 5e 39 19 d6 67  fd 73 88 ab 09 bf 90 09  |/..^9..g.s......|
                                                            00000110  78 69 1e 60 22 60 97 b9  83 c4 38 0c ea e2 02 9a  |xi.`"`....8.....|
                                                                                                                                          00000120  16 ac 6e ca 3e c1 28 77  21 32 4a 7a 5a a0 11 4f  |..n.>.(w!2JzZ..O|
     00000130  d4 1f 2b a8 6b 85 43 47  fb 43 ea 0d 0a           |..+.k.CG.C...|
0000013d

通过api查看

kubectl describe secret secret1 -n default