Использование провайдера Azure Key Vault для драйвера CSI хранилища секретов в кластере Azure Kubernetes Service (AKS)

Поставщик Azure Key Vault для драйвера контейнерного интерфейса хранения секретов (CSI) позволяет интегрировать Azure Key Vault как хранилище секретов с кластером Azure Kubernetes Service (AKS) через том CSI.

Функции

  • Подключает секреты, ключи и сертификаты к pod с помощью тома CSI.
  • Поддерживает встроенные тома CSI.
  • Поддерживает монтирование нескольких объектов хранилища секретов в виде одного тома.
  • Поддерживает переносимость pod с помощью пользовательского SecretProviderClass определения ресурсов (CRD).
  • Поддерживает контейнеры Windows.
  • Синхронизируется с секретами Kubernetes.
  • Поддерживает авторотацию подключенного содержимого и синхронизированных секретов Kubernetes.

Ограничения

  • Контейнер, использующий ConfigMap или Secret в качестве точки монтирования томаsubPath, не получает автоматических обновлений при ротации секрета, что связано с ограничением Kubernetes. Чтобы изменения вступили в силу, приложение должно перезагрузить измененный файл, наблюдая за изменениями в файловой системе или перезапуском модуля pod. Дополнительные сведения см. в разделе "Известные ограничения для хранилища секретов CSI Driver".
  • Надстройка создает управляемое удостоверение с именем azurekeyvaultsecretsprovider-xxxxx в группе ресурсов узла (MC_) и назначает его масштабируемой группе виртуальных машин автоматически. Это управляемое удостоверение или собственное управляемое удостоверение можно использовать для доступа к хранилищу ключей. Предотвращение создания удостоверения не поддерживается.

Предварительные условия

  • Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

  • Terraform, версия 1.6 или более поздняя.

  • Azure CLI установлен и выполнен вход. Установите последнюю версию.

  • Разрешения на создание ресурсов AKS и Key Vault.

  • Задайте подписку Azure в Azure CLI с помощью следующей команды. Замените <subscriptionId> идентификатором своей подписки.

    az account set --subscription <subscriptionId>
    

Сеть

  • Если вы используете изолированные сети кластеры, рекомендуется настроить частную конечную точку для доступа к Azure Key Vault.
  • Если кластер имеет тип исходящего трафика userDefinedRouting и использует брандмауэрное устройство, которое может управлять исходящим трафиком на основе доменных имен, таких как Брандмауэр Azure, убедитесь, что разрешены необходимые правила для исходящего трафика и Полные доменные имена (FQDNs).
  • Если вы ограничиваете входящий трафик в кластер, убедитесь, что открыты порты 9808 и 8095 .

Роли

Создание кластера AKS

Создайте кластер AKS с поставщиком Azure Key Vault для поддержки драйвера CSI для хранилища секретов.

  1. Создайте переменные, которые используются в командах для создания кластера AKS и Key Vault.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    

    Имена Azure Key Vault должны быть глобально уникальными, буквенно-цифровыми, включая дефисы и 3–24 символов. Имя хранилища ключей объединяет KEYVAULT_NAME значение переменной с myKeyVault 10 символьной строкой переменнойRANDOM_STRING.

  2. Создайте группу ресурсов Azure с помощью az group create команды.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Создайте кластер AKS с модулем Azure Key Vault для использования драйвера CSI для хранилища секретов с помощью команды az aks create с параметром --enable-addons azure-keyvault-secrets-provider.

    Этот параметр --enable-addons создает назначаемую пользователем управляемую идентичность с именем azurekeyvaultsecretsprovider-xxxx, которую можно использовать для аутентификации в вашем хранилище ключей. Управляемое удостоверение хранится в группе ресурсов узла (MC_) и автоматически назначается масштабируемому набору виртуальных машин. Это управляемое удостоверение или собственное управляемое удостоверение можно использовать для доступа к хранилищу ключей. Предотвращение создания удостоверения не поддерживается.

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-addons azure-keyvault-secrets-provider \
      --generate-ssh-keys
    

    Подсказка

    Если вы хотите использовать идентификатор рабочей нагрузки Microsoft Entra, az aks create команда должна включать --enable-oidc-issuer и --enable-workload-identity параметры.

Создание кластера AKS

Создайте файл main.tf со следующей конфигурацией, чтобы создать кластер AKS с провайдером Azure Key Vault для поддержки CSI драйвера для хранилища секретов.

  1. Создайте конфигурацию Terraform.

    terraform {
     required_version = ">= 1.6.0"
     required_providers {
       azurerm = {
         source  = "hashicorp/azurerm"
         version = "~> 4.0"
       }
     }
    }
    provider "azurerm" {
     features {}
    }
    data "azurerm_client_config" "current" {}
    resource "azurerm_resource_group" "rg" {
     name     = "aks-rg"
     location = "East US"
    }
    
  2. Создайте кластер AKS.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "aks-cluster"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     dns_prefix          = "akscsi"
     default_node_pool {
       name       = "system"
       node_count = 1
       vm_size    = "Standard_DS2_v2"
     }
     identity {
       type = "SystemAssigned"
     }
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  3. Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть ресурсы:

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Обновление существующего кластера AKS

Обновите существующий кластер AKS с помощью поставщика Azure Key Vault для поддержки Secrets Store CSI Driver.

  1. Создайте переменные, используемые в командах. Замените значения по мере необходимости для обновления существующего кластера AKS или Key Vault.

    Например, если вы используете существующее хранилище ключей, замените KEYVAULT_NAME значение переменной без использования переменной RANDOM_STRING .

    Если у вас нет хранилища ключей, имена Azure Key Vault должны быть глобально уникальными, буквенно-цифровыми, включая дефисы и 3–24 символов. Имя хранилища ключей объединяет KEYVAULT_NAME значение переменной с myKeyVault 10 символьной строкой переменнойRANDOM_STRING. Далее в этой статье можно создать хранилище ключей.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    
  2. Обновите существующий кластер AKS с помощью провайдера Azure Key Vault для обеспечения возможности использования драйвера CSI Хранилища секретов с помощью команды az aks enable-addons и включите дополнение azure-keyvault-secrets-provider. Надстройка создает управляемое удостоверение, назначаемое пользователем, которое можно использовать для аутентификации в вашем хранилище ключей.

    az aks enable-addons \
      --addons azure-keyvault-secrets-provider \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    

    После включения поставщика секретов Azure Key Vault AKS создает управляемое удостоверение с именем azurekeyvaultsecretsprovider-xxxx , которое можно использовать для проверки подлинности в хранилище ключей. Управляемое удостоверение хранится в группе ресурсов узла (MC_) и автоматически назначается масштабируемому набору виртуальных машин. Это управляемое удостоверение или собственное управляемое удостоверение можно использовать для доступа к хранилищу ключей. Предотвращение создания удостоверения не поддерживается.

Обновление существующего кластера AKS

Создайте файл main.tf со следующей конфигурацией, чтобы обновить кластер AKS с поставщиком Azure Key Vault для поддержки драйвера CSI для хранилища секретов.

  1. Обновление существующего кластера AKS.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "<existing-cluster>"
     resource_group_name = "<resource-group>"
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  2. Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть конфигурацию:

    Run the following commands to apply the updates:
    
    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Проверьте установку управляемой идентификации и поставщика хранилища ключей

Если вы использовали Terraform для создания нового кластера или обновления существующего кластера, необходимо заменить переменные, как $CLUSTER_NAME в следующих командах, значениями, используемыми в конфигурации Terraform.

Проверьте управляемое удостоверение

Чтобы удостовериться, что управляемое удостоверение создано и назначено масштабируемому набору виртуальных машин кластера, выполните следующие шаги.

  1. Убедитесь, что управляемое удостоверение было создано и назначено кластеру с помощью команды az aks show.

    az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query addonProfiles
    
    {
      "azureKeyvaultSecretsProvider": {
        "config": {
          "enableSecretRotation": "false",
          "rotationPollInterval": "2m"
        },
        "enabled": true,
        "identity": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
          "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster"
        }
      }
    }
    

    Свойство resourceId показывает группу ресурсов и имя удостоверения azurekeyvaultsecretsprovider-myakscluster.

  2. Убедитесь, что управляемое удостоверение личности назначено для масштабируемого набора виртуальных машин в группе ресурсов узла.

    NODE_RG=$(az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query nodeResourceGroup --output tsv)
    
    VMSS_NAME=$(az vmss list \
      --resource-group $NODE_RG \
      --query [].name --output tsv)
    
    az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'
    

    В выходных данных показаны идентификатор ресурса наборов масштабирования виртуальных машин Microsoft.Compute/virtualMachineScaleSets и свойство userAssignedIdentities с идентификатором ресурса для azurekeyvaultsecretsprovider-myakscluster, который подтверждает назначение удостоверения набору масштабирования виртуальных машин.

Проверьте драйвер CSI для хранилища секретов поставщика Azure Key Vault

  1. Получите учетные данные кластера AKS с помощью az aks get-credentials команды.

    az aks get-credentials \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    
  2. Убедитесь, что установка завершена с помощью команды kubectl get pods, которая перечисляет все pod с метками secrets-store-csi-driver в пространстве имен secrets-store-provider-azure.

    kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wide
    

    Флаг -o wide включает в выходные данные узел, на котором выполняется каждый под.

    Выходные данные должны выглядеть примерно так:

    NAME                                     READY   STATUS    RESTARTS   AGE    NODE
    aks-secrets-store-csi-driver-4vpkj       3/3     Running   2          4m25s  aks-nodepool1-12345678-vmss000002
    aks-secrets-store-csi-driver-ctjq6       3/3     Running   2          4m21s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-csi-driver-tlvlq       3/3     Running   2          4m24s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-5p4nb   1/1     Running   0          4m21s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-6pqmv   1/1     Running   0          4m24s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-provider-azure-f5qlm   1/1     Running   0          4m25s  aks-nodepool1-12345678-vmss000002
    

Создайте новое хранилище ключей

Выполните команду az keyvault create, чтобы создать новое хранилище ключей с включенным Azure RBAC.

az keyvault create \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-rbac-authorization

Azure RBAC включен по умолчанию при создании нового хранилища ключей, даже если параметр не включен --enable-rbac-authorization .

Для получения дополнительной информации о моделях разрешений Key Vault и Azure RBAC см. в разделе Предоставление доступа к ключам Key Vault, сертификатам и секретам с использованием управления доступом на основе ролей Azure.

Обновление существующего хранилища ключей

Выполните команду az keyvault update, чтобы обновить существующее хранилище ключей с помощью Azure управления доступом на основе ролей (Azure RBAC). Параметр --enable-rbac-authorization необходим для включения Azure RBAC при обновлении существующего хранилища ключей, в котором отключен Azure RBAC.

az keyvault update \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --enable-rbac-authorization

Дополнительные сведения о моделях разрешений хранилища ключей и Azure RBAC см. в статье Предоставление доступа к ключам Key Vault, сертификатам и секретам с помощью управления доступом на основе ролей Azure

Добавление назначения роли и секрета в хранилище ключей

  1. az keyvault show Выполните команду, чтобы проверить, включен ли хранилище ключей Azure RBAC.

    az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.enableRbacAuthorization
    

    Выходные данные должны быть true.

  2. Добавьте назначение ролей для учетной записи пользователя в область хранилища ключей с помощью az role assignment create команды, чтобы добавить секрет хранилища ключей на следующем шаге.

    Роль офицера по секретам Key Vault с уникальным идентификатором b86a8fe4-44ce-4948-aee5-eccb2c155cd7 добавлена, и вы можете использовать как имя, так и уникальный идентификатор. Использование уникального идентификатора роли является рекомендованной практикой для предотвращения проблем, если имя роли изменится.

    KEYVAULT_ID=$(az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id -o tsv)
    
    MYID=$(az ad signed-in-user show --query id --output tsv)
    
    az role assignment create \
      --assignee-object-id $MYID \
      --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \
      --scope $KEYVAULT_ID \
      --assignee-principal-type User
    

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

    az role assignment list \
      --assignee-object-id $MYID \
      --scope $KEYVAULT_ID \
      --query '[].{Role:roleDefinitionName, Scope:scope}' \
      --output table
    
  3. Создайте секрет обычного текста с именем ExampleSecret в хранилище ключей az keyvault secret set с помощью команды.

    Хранилище ключей может хранить ключи, секреты и сертификаты. Параметр value использует RANDOM_STRING переменную для создания уникального значения секрета.

    az keyvault secret set \
      --vault-name $KEYVAULT_NAME \
      --name ExampleSecret \
      --value MyAKSExampleSecret${RANDOM_STRING}
    
  4. Убедитесь, что секрет был добавлен в хранилище ключей с помощью команды [az keyvault secret show][az-keyvault-secret-show].

    az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
    

Создайте новое хранилище ключей

Обновите файл main.tf, чтобы создать новое хранилище ключей с включенным Azure управлением доступом на основе ролей (Azure RBAC).

  1. Создайте новое хранилище ключей с включенным Azure RBAC.

    data "azurerm_client_config" "current" {}
    resource "random_string" "suffix" {
     length  = 5
     special = false
     upper   = false
    }
    resource "azurerm_key_vault" "kv" {
     name                = "akskv${random_string.suffix.result}"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     tenant_id           = data.azurerm_client_config.current.tenant_id
     sku_name            = "standard"
     enable_rbac_authorization = true
    }
    
  2. Назначьте роль сотрудника по управлению секретами в Key Vault.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    
  3. Создайте ExampleSecret в хранилище ключей.

    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  4. Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть обновленную конфигурацию:

    terraform plan
    terraform apply
    
  5. Убедитесь, что ExampleSecret был добавлен в хранилище ключей с помощью команды [az keyvault secret show][az-keyvault-secret-show]. Замените <keyvault-name> именем хранилища ключей, созданного в конфигурации Terraform.

    az keyvault secret show \
     --vault-name <keyvault-name> \
     --name ExampleSecret
    

Обновление существующего хранилища ключей

Обновите файл main.tf, чтобы обновить существующее хранилище ключей с включенным Azure управлением доступом на основе ролей (Azure RBAC).

  1. Обновите существующее хранилище ключей, чтобы включить Azure RBAC.

    resource "azurerm_key_vault" "kv" {
     name                = "<existing-kv>"
     resource_group_name = "<resource-group>"
     enable_rbac_authorization = true
    }
    
  2. Назначьте роль и добавьте секрет.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  3. Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть обновленную конфигурацию:

    terraform plan
    terraform apply
    

Очистите ресурсы

Если вы перейдете к следующей статье и нуждаетесь в этих ресурсах, пропустите следующие действия. В противном случае, если вы закончите работу и не планируете продолжить работу со следующей статьей, удалите ресурсы, созданные в этой статье, чтобы избежать ненужных затрат.

  1. Удалите учетные данные кластера из локального kube/config-файла .

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Удалите группу ресурсов и все ресурсы в ней, включая ресурсы в группе ресурсов узла (MC_) с помощью az group delete команды.

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

Команда terraform destroy удаляет все ресурсы, определенные в текущей конфигурации Terraform и файле состояния. Выполните эту команду только из рабочего каталога, используемого для этой статьи.

Предупреждение

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

terraform plan -destroy

Избегайте выполнения terraform destroy на общей или импортированной инфраструктуре, если вы не уверены в её безопасности для удаления. Дополнительные сведения см. в документации Terraform для команды terraform destroy .

  1. Удалите учетные данные кластера из локального kube/config-файла .

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Выполните следующую команду, чтобы удалить ресурсы, созданные в этой статье:

    terraform destroy
    

Следующие шаги

Из этой статьи вы узнали, как использовать поставщика Azure Key Vault для CSI-драйвера для хранилища секретов в кластере AKS. Теперь необходимо предоставить удостоверение для доступа к Azure Key Vault. Чтобы узнать, как, перейдите к следующей статье.