Перейти к содержимому

Шифрование Etcd ​

Внимание!

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

Настройка шифрования etcd включает в себя следующие шаги:

  1. Подготовка манифеста
  2. Правка манифеста kube-apiserver

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

enc.yaml

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 провайдер обеспечивает чтение не шифрованных данных

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

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

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

Пример

bash
# Скопируйте манифест с помощью 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/


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


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

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

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:

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

Установите etcdctl на один из мастер узлов:

bash
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

Сделайте запрос:

bash
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

Шифрование существующих данных ​

После настройки шифрования все новые secrets будут шифроваться, для шифрования уже существующих необходимо запустить команду:

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

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

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

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

Внимание!

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

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

Перезапустите kube-apiserver.

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

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

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

bash
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

Команда Боцман