次の方法で共有


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

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

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

この記事では、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-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
    

    Note

    証明書をローテーションするときに、シークレットをクラスターに同期する速度を制御するには、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. Azure Key Vault リソースにアクセスできるように、アドオンのユーザー割り当てマネージド ID を承認します。

    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
    

    Note

    コンテナーのアクセス ポリシーではなく、アクセス許可モデルに Azure RBAC 承認を使用してキー コンテナーを作成した場合は、こちらの手順に従ってマネージド ID のアクセス許可を作成します。 アドオンのユーザー割り当てマネージド ID 用に Key Vault Reader の Azure ロール割り当てを追加します。

プラグイン 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
    

    Note

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

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

セキュリティまたはポリシー上の理由から、証明機関を定期的にローテーションすることが必要になる場合があります。 このセクションでは、中間 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 に基づいて、クラスターで cacerts シークレットが更新されたかどうかを確認します。

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

    アドオンには、ルート証明書への更新プログラムの確認のためにクラスターで 10 分ごとに実行される 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 の再起動後、信頼ドメインに 2 つの証明書が追加されたことを示す必要があります:

    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. 新しい 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>
    

    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 の更新後は、新しいルート CA の使用状況のみを確認する必要があります:

    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 に移動したことを確認できます。

  4. もう一度 24 時間待つか、すべてのワークロードを強制的に再起動することができます。 再起動を強制すると、ワークロードは新しいルート CA から新しいリーフ証明書をすぐに取得できます。

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