Перейти к содержанию

Шифрование etcd

Шифрование Etcd

Внимание!

Обязательно создавайте резервные копии ключей шифрования.

Настройка шифрования etcd включает в себя следующие шаги:
1. Подготовка манифеста 2. Правка манифеста kube-apiserver

Подготовка манифеста шифрования

enc.yaml

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources: (1)
    - secrets
    providers: (2)
      - aescbc:
          keys:
            - name: key1
            secret: <BASE 64 ENCODED SECRET> (3)
      - identity: {} (4)

  1. Список типов объектов, которые будут подвержены шифрованию
  2. Типы провайдеров. Подробнее
  3. Ключ шифрования закодированный в base64.

    Обратите внимание на ограничение длины ключа шифрования. Подробнее

  4. identity провайдер обеспечивает чтение не шифрованных данных

На АРМ Администратора используйте команду для формирования манифеста. Замените секрет шифрования:

cat << EOF >> enc.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: ZG53dWZpeDFDTHlSSGRSOGR4ak8xMkhvOUw4Qlh1Zgo=
      - identity: {}
EOF

После создания, манифест необходимо распространить на все мастер-узлы.

Пример

# Скопируйте манифест с помощью scp. Файл Должен быть на каждом мастер-узле
# Выполнять на АРМ Администратора
scp enc.yaml bootsman@MASTER_IP_1:/home/bootsman/
scp enc.yaml bootsman@MASTER_IP_2:/home/bootsman/
scp enc.yaml bootsman@MASTER_IP_3:/home/bootsman/


Подготовка директории для манифеста


Создайте директорию и переместите в нее манифест:

# Выполнить на каждом мастере
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:

kubectl create secret generic enc-secret -n default --from-literal=mykey=mydata
Установите etcdctl на один из мастер узлов:
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 будут шифроваться, для шифрования уже существующих необходимо запустить команду:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Дешифрование данных

В случае, если необходимо отключить шифрование, выполните следующие шаги:

Внесите правки в env.yaml:
Поднимите провайдер identity выше остальных провайдеров, тем самым прекратится шифрование новых данных.

Внимание!

Не удаляйте провайдеры шифрования

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - identity: {}
      - aescbc:
          keys:
            - name: key1
              secret: ZG53dWZpeDFDTHlSSGRSOGR4ak8xMkhvOUw4Qlh1Zgo=
Перезапустите kube-apiserver.

Далее перезапишите существующие секреты в нешифрованном виде:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Проверьте, отсутствие шифрования с помощью команды:

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