Подключайте сертификаты ЦС для надстройки сетки службы на основе Istio на Служба Azure Kubernetes

В надстройке сетки службы на основе Istio для Служба Azure Kubernetes по умолчанию центр сертификации Istio создает самозаверяющий корневой сертификат и ключ и использует их для подписывания сертификатов рабочей нагрузки. Чтобы защитить ключ корневого ЦС, следует использовать корневой ЦС, который выполняется на защищенном компьютере в автономном режиме. Корневой ЦС можно использовать для выдачи промежуточных сертификатов центра сертификации Istio, которые выполняются в каждом кластере. ЦС Istio может подписывать сертификаты рабочей нагрузки с помощью указанного администратором сертификата и ключа, а также распространять корневой сертификат, указанный администратором, в рабочие нагрузки в качестве корневого каталога доверия. В этой статье описывается, как перенести собственные сертификаты и ключи для ЦС Istio в надстройке сетки службы на основе Istio для Служба Azure Kubernetes.

Схема, показывющая корневой и промежуточный ЦС с помощью Istio.

В этой статье описывается, как настроить центр сертификации Istio с корневым сертификатом, сертификатом подписывания и ключом, предоставленным в качестве входных данных с помощью Azure Key Vault, в надстройке сетки службы на основе Istio.

Подготовка к работе

Проверка версии Azure CLI

Для надстройки требуется установка Azure CLI версии 2.57.0 или более поздней. Чтобы проверить версию, можно запустить az --version . Сведения об установке или обновлении см. в статье [Установка Azure CLI][azure-cli-install].

Настройка Azure Key Vault

  1. Для предоставления входных данных сертификата и ключа надстройке Istio требуется ресурс Azure Key Vault.

  2. Необходимо создать корневой сертификат, промежуточные сертификаты, промежуточный ключ и цепочку сертификатов в автономном режиме. В шагах 1–3 ниже приведен пример создания этих файлов.

  3. Создайте секреты в Azure Key Vault с помощью сертификатов и ключей:

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    
  4. Включите поставщик Azure Key Vault для драйвера CSI хранилища секретов для кластера:

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

    Примечание.

    При смене сертификатов для управления синхронизацией секретов с кластером можно использовать --rotation-poll-interval параметр надстройки поставщика секретов Azure Key Vault. Например: az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s

  5. Авторизуйте управляемое удостоверение, назначаемое пользователем надстройки, чтобы получить доступ к ресурсу Azure Key Vault:

    OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId' -o tsv)
    
    az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list
    

    Примечание.

    Если вы создали Key Vault с авторизацией Azure RBAC для модели разрешений вместо политики доступа к хранилищу, следуйте инструкциям, приведенным здесь , чтобы создать разрешения для управляемого удостоверения. Добавьте назначение ролей Azure для Key Vault Reader управляемого удостоверения, назначаемого пользователем надстройки.

Настройка надстройки сетки службы на основе Istio с помощью сертификатов ЦС подключаемого модуля

  1. Включите надстройку сетки службы Istio для существующего кластера AKS, ссылаясь на секреты Azure Key Vault, созданные ранее:

    az aks mesh enable --resource-group $RESOURCE_GROUP --name $CLUSTER \
    --root-cert-object-name root-cert \
    --ca-cert-object-name ca-cert \
    --ca-key-object-name ca-key \
    --cert-chain-object-name cert-chain \
    --key-vault-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$AKV_NAME
    

    Примечание.

    Для существующих кластеров с надстройкой Istio с помощью самозаверяющего корневого сертификата, созданного Istio CA, переключение на подключаемый ЦС не поддерживается. Сначала необходимо отключить сетку в этих кластерах, а затем снова включить ее с помощью приведенной выше команды для передачи входных данных подключаемого ЦС.

  2. Убедитесь, что cacerts он создается в кластере:

    kubectl get secret -n aks-istio-system
    

    Ожидаемые выходные данные:

    NAME                                                         TYPE                 DATA   AGE
    cacerts                                                      opaque               4      13h
    sh.helm.release.v1.azure-service-mesh-istio-discovery.v380   helm.sh/release.v1   1      2m15s
    sh.helm.release.v1.azure-service-mesh-istio-discovery.v381   helm.sh/release.v1   1      8s    
    
  3. Убедитесь, что плоскость управления Istio взяла пользовательский центр сертификации:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController | grep x509
    

    Ожидаемые выходные данные должны иметь следующий формат:

    2023-11-06T15:49:15.493732Z     info    x509 cert - Issuer: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", Subject: "", SN: e191d220af347c7e164ec418d75ed19e, NotBefore: "2023-11-06T15:47:15Z", NotAfter: "2033-11-03T15:49:15Z"
    2023-11-06T15:49:15.493764Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", SN: 885034cba2894f61036f2956fd9d0ed337dc636, NotBefore: "2023-11-04T01:40:02Z", NotAfter: "2033-11-01T01:40:02Z"
    2023-11-06T15:49:15.493795Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
    

Смена центра сертификации

Возможно, вам потребуется периодически повернуть центры сертификации по соображениям безопасности или политики. В этом разделе описано, как обрабатывать сценарии смены промежуточного ЦС и корневого ЦС.

Смена промежуточного центра сертификации

  1. Промежуточный ЦС можно повернуть, сохраняя корневой ЦС одинаково. Обновите секреты в ресурсе Azure Key Vault с новыми файлами сертификатов и ключей:

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    
  2. Подождите время --rotation-poll-interval. cacerts Проверьте, обновлен ли секрет в кластере на основе нового промежуточного ЦС, обновленного в ресурсе Azure Key Vault:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
    

    Ожидаемые выходные данные должны иметь следующий формат:

    2023-11-07T06:16:21.091844Z     info    Update Istiod cacerts
    2023-11-07T06:16:21.091901Z     info    Using istiod file format for signing ca files
    2023-11-07T06:16:21.354423Z     info    Istiod has detected the newly added intermediate CA and updated its key and certs accordingly
    2023-11-07T06:16:21.354910Z     info    x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: b2753c6a23b54d8364e780bf664672ce, NotBefore: "2023-11-07T06:14:21Z", NotAfter: "2033-11-04T06:16:21Z"
    2023-11-07T06:16:21.354967Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z"
    2023-11-07T06:16:21.355007Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
    2023-11-07T06:16:21.355012Z     info    Istiod certificates are reloaded
    
  3. Рабочие нагрузки получают сертификаты из плоскости управления Istio, допустимые в течение 24 часов по умолчанию. Если вы не перезапустите модули pod, все рабочие нагрузки получают новые конечные сертификаты на основе нового промежуточного ЦС в 24 часа. Если вы хотите принудительно принудить все эти рабочие нагрузки получить новые конечные сертификаты сразу от нового промежуточного ЦС, необходимо перезапустить рабочие нагрузки.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    

Смена корневого центра сертификации

  1. Необходимо обновить секреты Azure Key Vault с корневым файлом сертификата с объединением старых и новых корневых сертификатов:

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    

    Содержимое следующего root-cert.pem формата:

    -----BEGIN CERTIFICATE-----
    <contents of old root certificate>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <contents of new root certificate>
    -----END CERTIFICATE-----
    

    Надстройка включает CronJob выполнение каждые десять минут в кластере, чтобы проверка обновления корневого сертификата. Если он обнаруживает обновление, он перезапускает плоскость управления Istio (istiod развертывание) для получения обновлений. Вы можете проверка журналы, чтобы убедиться, что было обнаружено обновление корневого сертификата, и что плоскость управления Istio была перезапущена:

    kubectl logs -n aks-istio-system $(kubectl get pods -n aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    Ожидаемые выходные данные:

    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

    После istiod перезапуска следует указать, что два сертификата были добавлены в домен доверия:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system 
    

    Ожидаемые выходные данные:

    2023-11-07T06:42:00.287916Z     info    Using istiod file format for signing ca files
    2023-11-07T06:42:00.287928Z     info    Use plugged-in cert at etc/cacerts/ca-key.pem
    2023-11-07T06:42:00.288254Z     info    x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: 286451ca8ff7bf9e6696f56bef829d42, NotBefore: "2023-11-07T06:40:00Z", NotAfter: "2033-11-04T06:42:00Z"
    2023-11-07T06:42:00.288279Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z"
    2023-11-07T06:42:00.288298Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
    2023-11-07T06:42:00.288303Z     info    Istiod certificates are reloaded
    2023-11-07T06:42:00.288365Z     info    spiffe  Added 2 certs to trust domain cluster.local in peer cert verifier
    
  2. Необходимо дождаться 24 часов (время по умолчанию для срока действия конечного сертификата) или принудительно перезапустить все рабочие нагрузки. Таким образом, все рабочие нагрузки распознают старые и новые центры сертификации для проверки MTLS.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  3. Теперь вы можете обновить секреты Azure Key Vault только с новым ЦС (без старого ЦС):

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    

    Проверьте журналы CronJob для подтверждения обнаружения обновления корневого сертификата и перезапуска istiod:

    kubectl logs -n aks-istio-system $(kubectl get pods -n aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    Ожидаемые выходные данные:

    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

    После istiod обновления он должен подтвердить только использование нового корневого ЦС:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
    

    Ожидаемые выходные данные:

    2023-11-07T08:01:17.780299Z     info    x509 cert - Issuer: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", Subject: "", SN: 1159747c72cc7ac7a54880cd49b8df0a, NotBefore: "2023-11-07T07:59:17Z", NotAfter: "2033-11-04T08:01:17Z"
    2023-11-07T08:01:17.780330Z     info    x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", SN: 2aba0c438652a1f9beae4249457023013948c7e2, NotBefore: "2023-11-04T01:42:12Z", NotAfter: "2033-11-01T01:42:12Z"
    2023-11-07T08:01:17.780345Z     info    x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Root B,O=Istio", SN: 3f9da6ddc4cb03749c3f43243a4b701ce5eb4e96, NotBefore: "2023-11-04T01:41:54Z", NotAfter: "2033-11-01T01:41:54Z"
    

    В примере выходных данных, показанных в этой статье, можно увидеть, что мы перемещены из root A (используемый при включении надстройки) в Root B.

  4. Вы можете снова ждать 24 часа или принудительно перезапустить все рабочие нагрузки. При принудительном перезапуске рабочие нагрузки получают новые конечные сертификаты из нового корневого ЦС немедленно.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>