Azure Kubernetes Service (AKS) とその基盤のコンテナー モデルにより、クラウド ネイティブ アプリケーションのスケーラビリティと管理性が向上します。 AKS を使用すると、システムの実行時のニーズに応じて柔軟なソフトウェア アプリケーションを起動できます。 ただし、この柔軟性により、新しい課題が生じる可能性があります。
このようなアプリケーション環境で署名済みコンテナー イメージを使用すると、デプロイが信頼されたエンティティから構築されていること、およびイメージが作成後に改ざんされていないことを確認するのに役立ちます。 イメージの整合性は、Azure Policy の組み込み定義を追加して、署名済みイメージのみが AKS クラスターにデプロイされていることを確認できるサービスです。
注
イメージの整合性は、Ratify に基づく機能です。 AKS クラスターでは、機能名とプロパティ名は ImageIntegrity ですが、関連するイメージの整合性ポッドの名前には Ratify が含まれます。
重要
AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。
前提条件
Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、無料のアカウントを作成できます。
aks-previewCLI 拡張機能バージョン 0.5.96 以降。クラスターで AKS の Azure Policy アドオンが有効になっていることを確認します。 このアドオンがインストールされていない場合は、「AKS 用の Azure Policy アドオンをインストールする」を参照してください。
OIDC Issuer を使用して有効にした AKS クラスター。 新しいクラスターを作成するか、既存のクラスターを更新するには、OIDC Issuer を使用して AKS クラスターを構成する方法に関する記事を参照してください。
Azure サブスクリプションに登録されている
EnableImageIntegrityPreview機能フラグ。 機能フラグを登録するには、次のコマンドを使用します。EnableImageIntegrityPreviewコマンドを使用して、az feature register機能フラグを登録します。# Register the EnableImageIntegrityPreview feature flag az feature register --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview" It may take a few minutes for the status to show as *Registered*.az feature showコマンドを使用して、登録の状態を確認します。# Verify the EnableImageIntegrityPreview feature flag registration status az feature show --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview"状態が [登録済み] と表示されたら、 コマンドを使用して、
Microsoft.ContainerServiceリソース プロバイダーの登録を更新します。az provider registeraz provider register --namespace Microsoft.ContainerService
考慮事項と制限事項
- AKS クラスターでは、Kubernetes バージョン 1.26 以上を実行する必要があります。
- 運用環境のAzure Container Registry (ACR) レジストリまたはワークロードには、この機能を使用しないでください。
- イメージの整合性は、クラスター全体で同時に最大 200 個の一意の署名をサポートします。
- 表記が、サポートされている唯一の検証ツールです。
- 監査が、サポートされている唯一の検証ポリシー効果です。
イメージの整合性のしくみ
イメージの整合性は、署名されたイメージを AKS クラスターにデプロイする前に、Ratify、Azure Policy、Gatekeeper を使用して検証します。 クラスターでイメージの整合性を有効にすると、Ratify ポッドがデプロイされます。 この Ratify ポッドが、次のタスクを実行します。
-
RatifyCRD 経由で設定した構成に応じて、Azure Key Vault の証明書を調整します。 - 検証要求が Azure Policy から着信すると、ACR に格納されているイメージにアクセスします。 このエクスペリエンスを有効にするために、Azure Policy は、Open Policy Agent (OPA) のアドミッション コントローラー Webhook である Gatekeeper を拡張します。
- ターゲット イメージが信頼された証明書で署名され、"信頼済み" とみなされるかどうかを判断します。
-
AzurePolicyとGatekeeperがコンプライアンス状態として検証結果を使用して、デプロイ要求を許可するかどうかを決定します。
AKS クラスターでイメージの整合性を有効にする
注
イメージの署名の検証はガバナンス指向のシナリオであり、Azure Policy を利用して AKS クラスターのイメージ署名を大規模に検証します。 AKS のイメージの整合性が組み込まれた Azure Policy イニシアチブを使用することをお勧めします。これは、Azure Policyの組み込み定義ライブラリから入手できます。
[Preview]: Use Image Integrity to ensure only trusted images are deployedコマンドを使用して、AKS ポリシー イニシアチブaz policy assignment createでポリシーの割り当てを作成します。export SCOPE="/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}" export LOCATION=$(az group show --name ${RESOURCE_GROUP} --query location -o tsv) az policy assignment create --name 'deploy-trustedimages' --policy-set-definition 'af28bf8b-c669-4dd3-9137-1e68fdc61bd6' --display-name 'Audit deployment with unsigned container images' --scope ${SCOPE} --mi-system-assigned --role Contributor --identity-scope ${SCOPE} --location ${LOCATION}この機能を有効にすると、
Ratifyポッドがデプロイされます。
注
このポリシーは、クラスターでの更新操作を検出すると、クラスターにイメージの整合性機能をデプロイします。 この機能をすぐに有効にする場合は、az policy remediation create コマンドを使用してポリシー修復を作成する必要があります。
assignment_id=$(az policy assignment show --name 'deploy-trustedimages' --scope ${SCOPE} --query id -o tsv)
az policy remediation create --policy-assignment "$assignment_id" --definition-reference-id deployAKSImageIntegrity --name remediation --resource-group ${RESOURCE_GROUP}
検証構成を設定する
Image Integrity が対象の署名付きイメージを適切に検証できるようにするには、kubectl を使用して、K8s の CRD を通じて Ratify 構成を設定する必要があります。
この記事では、公式の Ratify ドキュメントの自己署名 CA 証明書を使用して、検証構成を設定します。 その他の例については、Ratify の CRD に関するページを参照してください。
VerifyConfigという名前のverify-config.yamlファイルを作成し、そこに次の YAML をコピーします。apiVersion: config.ratify.deislabs.io/v1beta1 kind: KeyManagementProvider metadata: name: certstore-inline spec: provider: inline parameters: value: | -----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgIUDxHQ9JxxmnrLWTA5rAtIZCzY8mMwDQYJKoZIhvcNAQEL BQAwKTEPMA0GA1UECgwGUmF0aWZ5MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMB4X DTIzMDYyOTA1MjgzMloXDTMzMDYyNjA1MjgzMlowKTEPMA0GA1UECgwGUmF0aWZ5 MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAshmsL2VM9ojhgTVUUuEsZro9jfI27VKZJ4naWSHJihmOki7IoZS8 3/3ATpkE1lGbduJ77M9UxQbEW1PnESB0bWtMQtjIbser3mFCn15yz4nBXiTIu/K4 FYv6HVdc6/cds3jgfEFNw/8RVMBUGNUiSEWa1lV1zDM2v/8GekUr6SNvMyqtY8oo ItwxfUvlhgMNlLgd96mVnnPVLmPkCmXFN9iBMhSce6sn6P9oDIB+pr1ZpE4F5bwa gRBg2tWN3Tz9H/z2a51Xbn7hCT5OLBRlkorHJl2HKKRoXz1hBgR8xOL+zRySH9Qo 3yx6WvluYDNfVbCREzKJf9fFiQeVe0EJOwIDAQABo2MwYTAdBgNVHQ4EFgQUKzci EKCDwPBn4I1YZ+sDdnxEir4wHwYDVR0jBBgwFoAUKzciEKCDwPBn4I1YZ+sDdnxE ir4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQEL BQADggEBAGh6duwc1MvV+PUYvIkDfgj158KtYX+bv4PmcV/aemQUoArqM1ECYFjt BlBVmTRJA0lijU5I0oZje80zW7P8M8pra0BM6x3cPnh/oZGrsuMizd4h5b5TnwuJ hRvKFFUVeHn9kORbyQwRQ5SpL8cRGyYp+T6ncEmo0jdIOM5dgfdhwHgb+i3TejcF 90sUs65zovUjv1wa11SqOdu12cCj/MYp+H8j2lpaLL2t0cbFJlBY6DNJgxr5qync cz8gbXrZmNbzC7W5QK5J7fcx6tlffOpt5cm427f9NiK2tira50HU7gC3HJkbiSTp Xw10iXXMZzSbQ0/Hj2BF4B40WfAkgRg= -----END CERTIFICATE----- --- apiVersion: config.ratify.deislabs.io/v1beta1 kind: Store metadata: name: store-oras spec: name: oras # If you want to you use Workload Identity for Ratify to access Azure Container Registry, # uncomment the following lines, and fill the proper ClientID: # See more: https://ratify.dev/docs/reference/oras-auth-provider # parameters: # authProvider: # name: azureWorkloadIdentity # clientID: XXX --- apiVersion: config.ratify.deislabs.io/v1beta1 kind: Verifier metadata: name: verifier-notary-inline spec: name: notation artifactTypes: application/vnd.cncf.notary.signature parameters: verificationCertStores: # certificates for validating signatures certs: # name of the trustStore - certstore-inline # name of the certificate store CRD to include in this trustStore trustPolicyDoc: # policy language that indicates which identities are trusted to produce artifacts version: "1.0" trustPolicies: - name: default registryScopes: - "*" signatureVerification: level: strict trustStores: - ca:certs trustedIdentities: - "*"VerifyConfigコマンドを使用してkubectl applyをクラスターに適用します。kubectl apply -f verify-config.yaml
サンプル イメージを AKS クラスターにデプロイする
kubectl run demoコマンドを使用して署名済みイメージをデプロイします。kubectl run demo-signed --image=ghcr.io/deislabs/ratify/notary-image:signed次の出力例は、イメージの整合性がデプロイを許可することを示しています。
ghcr.io/deislabs/ratify/notary-image:signed pod/demo-signed created
独自のイメージを使用する場合は、イメージ署名のガイダンスを参照してください。
イメージの整合性を無効にする
ポリシー イニシアティブを削除する
まず、
az policy assignment deleteコマンドを使用してポリシー イニシアチブを削除する必要があります。az policy assignment delete --name 'deploy-trustedimages'
Diable アドオン
次に、
az aks updateフラグを指定して--disable-image-integrityコマンドを使用して、クラスターのイメージ整合性アドオンを無効にします。az aks update --resource-group myResourceGroup --name MyManagedCluster --disable-image-integrity
次のステップ
この記事では、Azure Kubernetes Service (AKS) クラスターにデプロイする前に、イメージの整合性を使用して署名済みイメージを検証する方法について学習しました。 独自のコンテナーに署名する方法については、Notary と Azure Key Vault (プレビュー) を使用してコンテナー イメージをビルド、署名、検証する方法に関する記事を参照してください。