Azure Kubernetes Service 上の Istio ベースのサービス メッシュ アドオンのプラグイン CA 証明書

Azure Kubernetes Serviceの Istio ベースのサービス メッシュ アドオンでは、既定で Istio 証明機関 (CA) によって自己署名ルート証明書とキーが生成され、それらを使用してワークロード証明書に署名されます。 ルート CA キーを保護するには、ルート CA を使用する必要があります。これはセキュリティで保護されたコンピューターでオフラインで実行されます。 ルート CA を使用して、各クラスターで実行される Istio CA に中間証明書を発行できます。 Istio CA は、管理者が指定した証明書とキーを使用してワークロード証明書に署名し、管理者が指定したルート証明書を信頼のルートとしてワークロードに配布できます。 この記事では、istio ベースのサービス メッシュ アドオンで Istio CA 用の独自の証明書とキーをAzure Kubernetes Serviceに取り込む方法について説明します。

Istio を使用したルートおよび中間 CA を示す図。

この記事では、Istio ベースのサービス メッシュ アドオンへのAzure Key Vaultを使用して、ルート証明書、署名証明書、および入力として提供されるキーを使用して Istio 証明機関を構成する方法について説明します。

開始する前に

Azure CLIバージョンを確認する

アドオンには、バージョン 2.57.0 以降Azure CLIインストールされている必要があります。 az --version を実行してバージョンを確認できます。 インストールまたはアップグレードするには、「Install Azure CLIを参照してください。

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-to-folder/cert-chain.pem>
    
  4. クラスター用シークレット ストア CSI ドライバーのAzure Key Vault プロバイダーを有効にする:

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

    証明書をローテーションするときに、シークレットをクラスターに同期する速度を制御するには、Azure Key Vault シークレット プロバイダー アドオンの --rotation-poll-interval パラメーターを使用します。 例: az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s

  5. Key Vaultがアクセス許可モデルAzure RBAC を使用している場合は、here の手順に従って、アドオンのユーザー割り当てマネージド ID に Key Vault Secrets ユーザーのAzureロールを割り当てます。 また、キー コンテナーがキー コンテナーのアクセス ポリシーのアクセス許可モデルを使用している場合は、アクセス ポリシーを使用して、アドオンのユーザー割り当てマネージド ID に 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
    

プラグイン CA 証明書を使用して Istio ベースのサービス メッシュ アドオンを設定する

  1. 前に作成したAzure Key Vault シークレットを参照しながら、既存の AKS クラスターの Istio サービス メッシュ アドオンを有効にします。

    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 CA によって生成された自己署名ルート証明書を使用する Istio アドオンを使用する既存のクラスターでは、プラグイン CA への切り替えはサポートされていません。 最初にこれらのクラスターでメッシュを無効にしてから、上記のコマンドを使用して再度有効にして、プラグイン CA 入力を通過する必要があります。

  2. 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"
    

証明機関のローテーション

セキュリティまたはポリシー上の理由から、証明機関を定期的にローテーションすることが必要になる場合があります。 このセクションでは、中間 CA とルート CA のローテーション シナリオを処理する方法について説明します。

中間証明機関のローテーション

  1. ルート CA は同じまま、中間 CA をローテーションできます。 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 の期間待ちます。 Azure Key Vault リソースで更新された新しい中間 CA に基づいて、クラスターで証明書が更新されたかどうかを確認します。

    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 時間有効です。 ポッドを再起動しない場合、すべてのワークロードは、24 時間以内に新しい中間 CA に基づいて新しいリーフ証明書を取得します。 これらすべてのワークロードで、新しい中間 CA からすぐに新しいリーフ証明書を取得するように強制する場合は、ワークロードを再起動する必要があります。

    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-----
    

    証明書がクラスターに同期されたら、istiod ログを確認します。

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

    予想される出力:

    2023-11-07T06:42:00.287916Z     info    Updating new ROOT-CA
    2023-11-07T06:42:00.287928Z     info    update root cert and generate new dns certs
    2023-11-07T06:42:00.288254Z     info    Update trust anchor with new root cert
    2023-11-07T06:42:00.288279Z     info    trustBundle     updating Source IstioCA with certs
    2023-11-07T06:42:00.288298Z     info    Istiod has detected the newly added intermediate CA and updated its key and certs accordingly
    2023-11-07T06:42:00.288303Z     info    Istiod certificates are reloaded
    
  2. 24 時間 (リーフ証明書の有効期間の既定の時刻) 待つか、すべてのワークロードを強制的に再起動する必要があります。 これにより、すべてのワークロードが mTLS 検証のために古い証明機関と新しい証明機関の両方を認識します。

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  3. (古い CA を使用せずに) 新しい CA のみを使用して、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>
    

    証明書がクラスターに同期されたら、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"
    

    この記事に示されている出力例から、ルート A (アドオンを有効にする場合に使用) からルート B に移動したことを確認できます。