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 ベースのサービス メッシュ アドオンに対して、Azure Key Vault を使用して入力として提供されるルート証明書、署名証明書、およびキーを使用して Istio 証明機関を構成する方法について説明します。
開始する前に
Azure CLI のバージョンを確認する
アドオンには、Azure CLI バージョン 2.57.0 以降がインストールされている必要があります。 az --version
を実行してバージョンを確認できます。 インストールまたはアップグレードするには、[Azure CLI のインストール][azure-cli-install] を参照してください。
Azure Key Vault を設定する
Istio アドオンに証明書とキー入力を提供するには、Azure Key Vault リソースが必要です。
ルート証明書、中間証明書、中間キー、証明書チェーンをオフラインで生成する必要があります。 ここからの手順 1 - 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>
[クラスターのシークレット ストア 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
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 ベースのサービス メッシュ アドオンを設定する
前に作成した 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 入力を通過する必要があります。
クラスターに
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
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 のローテーション シナリオを処理する方法について説明します。
中間証明機関のローテーション
ルート 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>
--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
ワークロードは Istio コントロール プレーンから証明書を受け取ります。この証明書は、既定で 24 時間有効です。 ポッドを再起動しない場合、すべてのワークロードは、24 時間以内に新しい中間 CA に基づいて新しいリーフ証明書を取得します。 これらすべてのワークロードで、新しい中間 CA からすぐに新しいリーフ証明書を取得するように強制する場合は、ワークロードを再起動する必要があります。
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
ルート証明機関のローテーション
古いルート証明書と新しいルート証明書を連結したルート証明書ファイルで 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
24 時間 (リーフ証明書の有効期間の既定の時刻) 待つか、すべてのワークロードを強制的に再起動する必要があります。 これにより、すべてのワークロードが mTLS 検証のために古い証明機関と新しい証明機関の両方を認識します。
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
新しい 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 に移動したことを確認できます。
もう一度 24 時間待つか、すべてのワークロードを強制的に再起動することができます。 再起動を強制すると、ワークロードは新しいルート CA から新しいリーフ証明書をすぐに取得できます。
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
Azure Kubernetes Service