Поделиться через


Как зашифровать секреты etcd для кластеров Kubernetes

Применяется для: AKS на Azure Local

A секрет в Kubernetes — это объект, содержащий небольшое количество конфиденциальных данных, таких как пароли и SSH-ключи. На сервере API Kubernetes секреты хранятся в etcd, который является отказоустойчивым хранилищем ключей и значений, используемым в качестве основной базы данных Kubernetes для всех данных кластера.

Служба Azure Kubernetes (AKS) в Azure Local поставляется с шифрованием секретов etcd с помощью подключаемого модуля службы управления ключами (KMS). Все кластеры Kubernetes в Azure Local имеют встроенный плагин KMS, включенный по умолчанию. Данный плагин генерирует Key Encryption Key (KEK) и автоматически обновляет его каждые 30 дней.

Эта статья описывает, как убедиться, что данные зашифрованы. Дополнительные сведения см. в официальной документации Kubernetes для подключаемого модуля KMS.

Примечание.

Плагин KMS в настоящее время использует протокол KMS версии 1.

Перед тем как начать

Прежде чем начать, убедитесь, что у вас есть следующие предварительные условия:

  • Для взаимодействия с кластерами Kubernetes необходимо установить kubectl и kubelogin.
  • Чтобы просматривать или управлять секретами, убедитесь, что у вас есть необходимые права доступа. Для получения дополнительной информации см. Доступ и идентификация.

Доступ к кластеру с поддержкой Microsoft Entra

Получите учетные данные пользователя для доступа к вашему кластеру, используя команду az aksarc get-credentials. Вам нужен ресурс Microsoft.HybridContainerService/provisionedClusterInstances/listUserKubeconfig/action, который включен в разрешения роли пользователя кластера Azure Kubernetes Service Arc.

az aksarc get-credentials --resource-group $resource_group --name $aks_cluster_name

Убедитесь, что плагин KMS включен.

Чтобы убедиться, что подключаемый модуль KMS включен, выполните следующую команду и убедитесь, что состояние работоспособности поставщиков kms-providersОК:

kubectl get --raw='/readyz?verbose'
[+]ping ok
[+]Log ok
[+]etcd ok
[+]kms-providers ok
[+]poststarthook/start-encryption-provider-config-automatic-reload ok

Убедитесь, что данные зашифрованы

Чтобы подтвердить, что секреты и данные зашифрованы с помощью плагина KMS, см. документацию Kubernetes. Вы можете использовать следующие команды, чтобы проверить, что данные зашифрованы:

kubectl exec --stdin --tty <etcd pod name> -n kube-system --etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt get /registry/secrets/default/db-user-pass -w fields
  • kubectl exec: Это команда kubectl, используемая для выполнения команды внутри работающего пода. Это позволяет вам выполнять команды внутри контейнера пода.

  • --stdin: Этот флаг позволяет отправлять ввод (stdin) в команду, которую вы выполняете внутри пода.

  • --tty: Этот флаг выделяет TTY (терминал) для команды, заставляя ее вести себя так, будто вы взаимодействуете с сеансом терминала.

  • <etcd pod name>: чтобы найти имя pod etcd, выполните следующую команду:

    kubectl get pods -n kube-system | findstr etcd-moc
    
  • -n kube-system: Указывает пространство имен, в котором находится pod. kube-system — это пространство имён по умолчанию, используемое Kubernetes для системных компонентов, таких как etcd и другие сервисы управляющей плоскости.

  • --etcdctl: Читает секрет из etcd. Дополнительные поля используются для аутентификации перед получением доступа к etcd.

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

"ClusterID" : <cluster id> 
"MemberID" : <member id> 
"Revision" : <revision number> 
"RaftTerm" : 2 
"Key" : <path to the key>
"CreateRevision" : <revision number at the time the key was created> 
"ModRevision" :  <revision number at the time the key was modified> 
"Version" : <version of the key-value pair in etcd> 
"Value" : "k8s:enc:kms:v1:kms-plugin: <encrypted secret value>"  
"Lease" : <lease associated with the secret> 
"More" : <indicates if there are more results> 
"Count" : <number of key-value pairs returned> 

После выполнения команды изучите поле Value в выводе в окне терминала. Эти выходные данные показывают значение, хранящееся в секретном хранилище etcd для этого ключа, которое является зашифрованным значением секрета. Значение зашифровано с использованием KMS плагина. Префикс k8s:enc:kms:v1: указывает на то, что Kubernetes использует плагин KMS v1 для хранения секрета в зашифрованном формате.

Примечание.

Если вы используете команду kubectl describe secrets для получения секретов, они возвращаются в закодированном формате base64, но без шифрования. Команда kubectl describe извлекает детали Kubernetes ресурса через сервер API, который автоматически управляет шифрованием и дешифрованием. Для конфиденциальных данных, таких как секреты, даже если они монтированы на под, сервер API гарантирует, что они расшифровываются при доступе. В результате выполнение команды kubectl describe не отображает секреты в их зашифрованной форме, а скорее в расшифрованной, если они используются ресурсом.

Устранение неполадок

Если вы столкнулись с какими-либо ошибками при работе подключаемого модуля KMS, следуйте инструкциям на странице Устранение неполадок , чтобы устранить проблему.

Дальнейшие действия