Шифрование etcd
Шифрование Etcd
Внимание!
Обязательно создавайте резервные копии ключей шифрования.
Настройка шифрования etcd включает в себя следующие шаги:
1. Подготовка манифеста
2. Правка манифеста kube-apiserver
Подготовка манифеста шифрования
enc.yaml
На АРМ Администратора используйте команду для формирования манифеста. Замените секрет шифрования:
cat << EOF >> enc.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ZG53dWZpeDFDTHlSSGRSOGR4ak8xMkhvOUw4Qlh1Zgo=
- identity: {}
EOF
После создания, манифест необходимо распространить на все мастер-узлы.
Пример
Подготовка директории для манифеста
Создайте директорию и переместите в нее манифест:
# Выполнить на каждом мастере
mkdir -p /etc/kubernetes/enc
mv /home/bootsman/enc.yaml /etc/kubernetes/enc/enc.yaml
Правка манифеста kube-apiserver
Внимание!
Не вносите правки сразу на всех мастер-узлах. После внесения зменений на каждом отдельном узле проверяйте, что kube-apiserver перезапустился и он работает
Откройте в режиме редактирования файл /etc/kubernetes/manifests/kube-apiserver.yaml:
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.0.140.196:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --encryption-provider-config=/etc/kubernetes/enc/enc.yaml # Добавьте эту строку
...
volumeMounts:
...
- name: enc # Добавьте эту строку
mountPath: /etc/kubernetes/enc # Добавьте эту строку
readOnly: true # Добавьте эту строку
...
volumes:
...
- name: enc # Добавьте эту строку
hostPath: # Добавьте эту строку
path: /etc/kubernetes/enc # Добавьте эту строку
type: DirectoryOrCreate # Добавьте эту строку
...
Проверка
Создайте новый secret:
wget https://github.com/etcd-io/etcd/releases/download/v3.6.5/etcd-v3.6.5-linux-amd64.tar.gz
tar -xvf etcd-v3.6.5-linux-amd64.tar.gz
cd etcd-v3.6.5-linux-amd64
ETCDCTL_API=3 ./etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key get /registry/secrets/default/enc-secret | hexdump -C
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 6e 6f 2d 65 6e 63 |s/default/no-enc|
00000020 2d 73 65 63 72 65 74 0a 6b 38 73 00 0a 0c 0a 02 |-secret.k8s.....|
00000030 76 31 12 06 53 65 63 72 65 74 12 cb 01 0a b0 01 |v1..Secret......|
00000040 0a 0d 6e 6f 2d 65 6e 63 2d 73 65 63 72 65 74 12 |..no-enc-secret.|
00000050 00 1a 07 64 65 66 61 75 6c 74 22 00 2a 24 36 31 |...default".*$61|
00000060 36 37 33 32 38 36 2d 35 65 62 32 2d 34 65 39 32 |673286-5eb2-4e92|
00000070 2d 38 64 64 36 2d 37 31 32 34 38 63 35 34 36 61 |-8dd6-71248c546a|
00000080 39 61 32 00 38 00 42 08 08 82 a7 ee c6 06 10 00 |9a2.8.B.........|
00000090 8a 01 5d 0a 0a 6e 6f 64 65 2d 66 65 74 63 68 12 |..]..node-fetch.|
000000a0 06 55 70 64 61 74 65 1a 02 76 31 22 08 08 82 a7 |.Update..v1"....|
000000b0 ee c6 06 10 00 32 08 46 69 65 6c 64 73 56 31 3a |.....2.FieldsV1:|
000000c0 2d 0a 2b 7b 22 66 3a 64 61 74 61 22 3a 7b 22 2e |-.+{"f:data":{".|
000000d0 22 3a 7b 7d 2c 22 66 3a 6b 65 79 31 22 3a 7b 7d |":{},"f:key1":{}|
000000e0 7d 2c 22 66 3a 74 79 70 65 22 3a 7b 7d 7d 42 00 |},"f:type":{}}B.|
000000f0 12 0e 0a 04 6b 65 79 31 12 06 31 32 33 34 35 36 |....key1..123456|
00000100 1a 06 4f 70 61 71 75 65 1a 00 22 00 0a |..Opaque.."..|
0000010d
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 65 6e 63 2d 73 65 |s/default/enc-se|
00000020 63 72 65 74 0a 6b 38 73 3a 65 6e 63 3a 61 65 73 |cret.k8s:enc:aes|
00000030 63 62 63 3a 76 31 3a 6b 65 79 31 3a bf ff 12 22 |cbc:v1:key1:..."|
00000040 27 38 93 f4 bc d6 80 7d 27 66 0e d5 27 30 1f bc |'8.....}'f..'0..|
00000050 3f 44 7d 47 d7 32 22 04 22 2b 42 6c 0c e1 2a 80 |?D}G.2"."+Bl..*.|
00000060 4a eb bb be 55 e7 ee 35 d3 82 c7 26 34 b3 4f aa |J...U..5...&4.O.|
00000070 d0 88 81 46 d8 4e 20 bc 8d f6 f2 c5 f0 f6 65 4c |...F.N .......eL|
00000080 0a 4d 56 e6 d0 d9 9a a6 ee e8 b8 90 9d d4 a2 42 |.MV............B|
00000090 1f 3b 02 d3 e5 5e eb a8 84 26 9c 9c 2d b8 70 8c |.;...^...&..-.p.|
000000a0 16 18 39 1b 0a 13 a0 7b 30 fe 11 e2 63 92 5f 62 |..9....{0...c._b|
000000b0 2c 4c df 2a e4 c0 0b ef 80 80 09 4e bc 3b 3c 11 |,L.*.......N.;<.|
000000c0 54 4d 22 3f a9 3d af 4a d5 2c ca 98 e0 2b df 27 |TM"?.=.J.,...+.'|
000000d0 f5 1e 84 1a 26 32 1d 9c 30 ef 0a 0b 53 49 d9 52 |....&2..0...SI.R|
000000e0 d4 ef 50 5e 9c d8 79 81 52 ad 7f c0 90 a9 55 9a |..P^..y.R.....U.|
000000f0 be db 85 34 17 6e e2 5e d9 f7 38 4c 2b db e2 3f |...4.n.^..8L+..?|
00000100 8f 3c 15 55 b0 87 da 78 ce 63 ad e7 17 fa 1f fc |.<.U...x.c......|
00000110 a4 c6 76 5d 74 5a a7 6c 25 91 1f c8 ce f1 48 95 |..v]tZ.l%.....H.|
00000120 7f ff 1d f4 6e 8f 52 54 64 05 6e 44 ff af 1a b0 |....n.RTd.nD....|
00000130 a8 81 e5 b0 77 b7 8e 92 c2 1b 5f 8f 0a |....w....._..|
0000013d
Шифрование существующих данных
После настройки шифрования все новые secrets будут шифроваться, для шифрования уже существующих необходимо запустить команду:
Дешифрование данных
В случае, если необходимо отключить шифрование, выполните следующие шаги:
Внесите правки в env.yaml:
Поднимите провайдер identity выше остальных провайдеров, тем самым прекратится шифрование новых данных.
Внимание!
Не удаляйте провайдеры шифрования
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- identity: {}
- aescbc:
keys:
- name: key1
secret: ZG53dWZpeDFDTHlSSGRSOGR4ak8xMkhvOUw4Qlh1Zgo=
Далее перезапишите существующие секреты в нешифрованном виде:
Проверьте, отсутствие шифрования с помощью команды:
ETCDCTL_API=3 ./etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key get /registry/secrets/default/enc-secret | hexdump -C
После подтверждения можно удалить настройки шифрования из манифеста kube-apiserver