Тема
Шифрование Etcd
Внимание!
Обязательно создавайте резервные копии ключей шифрования.
Настройка шифрования etcd включает в себя следующие шаги:
- Подготовка манифеста
- Правка манифеста 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)На АРМ Администратора используйте команду для формирования манифеста. Замените секрет шифрования:
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