Azure Policy を使用した Azure コンテナー レジストリのコンプライアンスの監査

Azure Policy は Azure のサービスであり、ポリシー定義の作成、割り当て、管理に使うことができます。 これらのポリシー定義により、リソースにさまざまなルールと効果が適用され、会社の標準とサービス レベル アグリーメントへのリソースの準拠が維持されます。

この記事では、Azure Container Registry の組み込みポリシー定義について説明します。 これらの定義を使用して、新しいレジストリと既存のレジストリのコンプライアンスを監査します。

Azure Policy は無料で利用できます。

組み込みのポリシー定義

次の組み込みのポリシー定義は Azure Container Registry に固有となります。

名前
(Azure portal)
説明 効果 Version
(GitHub)
[プレビュー]: コンテナー レジストリはゾーン冗長にする必要があります コンテナー レジストリは、ゾーン冗長にするようにも、ゾーン冗長にしないようにも構成できます。 コンテナー レジストリの zoneRedundancy プロパティが "無効" に設定されると、レジストリはゾーン冗長ではありません。 このポリシーを適用すると、コンテナー レジストリのゾーン回復性が適切に構成され、ゾーン停止中のダウンタイムのリスクが減ります。 Audit、Deny、Disabled 1.0.0-preview
[プレビュー]: コンテナー レジストリは仮想ネットワーク サービス エンドポイントを使う必要がある このポリシーでは、仮想ネットワーク サービス エンドポイントを使用するように構成されていないすべてのコンテナー レジストリを監査します。 Audit、Disabled 1.0.0-preview
Azure レジストリ コンテナー イメージの脆弱性が解決されている必要がある (Microsoft Defender 脆弱性管理を利用) コンテナー イメージの脆弱性評価では、レジストリをスキャンして一般的な脆弱性 (CVE) を調べ、各イメージの詳細な脆弱性レポートを提供します。 脆弱性を解決すると、セキュリティ態勢が大幅に向上し、デプロイ前にイメージが安全に使用できるようになります。 AuditIfNotExists、Disabled 1.0.1
コンテナー レジストリを構成して、匿名認証を無効にする 認証されていないユーザーがデータにアクセスできないように、レジストリに対する匿名プルを無効にします。 管理者ユーザー、リポジトリ スコープのアクセス トークン、匿名プルなどのローカル認証方法を無効にすると、コンテナー レジストリでは認証のために Azure Active Directory ID だけが確実に要求されるようになるため、セキュリティが向上します。 詳細については、https://aka.ms/acr/authentication を参照してください。 Modify、Disabled 1.0.0
ARM 対象ユーザー トークン認証が無効になるようコンテナー レジストリを構成する。 レジストリへの認証のために Azure Active Directory ARM 対象ユーザー トークンを無効にします。 認証には、Azure Container Registry (ACR) の対象ユーザー トークンのみが使用されます。 これにより、レジストリで使用するためのトークンのみを認証に使用できるようになります。 ARM 対象ユーザー トークンを無効にしても、管理者ユーザーまたはスコープ付きアクセス トークンの認証には影響しません。 詳細については、https://aka.ms/acr/authentication を参照してください。 Modify、Disabled 1.0.0
コンテナー レジストリを構成して、ローカルの管理者アカウントを無効にする レジストリの管理者アカウントを無効にして、ローカル管理者がアクセスできないようにします。管理者ユーザー、リポジトリ スコープのアクセス トークン、匿名プルなどのローカル認証方法を無効にすると、コンテナー レジストリでは認証のために Azure Active Directory ID だけが確実に要求されるようになるため、セキュリティが向上します。 詳細については、https://aka.ms/acr/authentication を参照してください。 Modify、Disabled 1.0.1
パブリック ネットワーク アクセスが無効になるようにコンテナー レジストリを構成する Container Registry リソースの公衆ネットワーク アクセスを無効にして、パブリック インターネット経由でアクセスできないようにします。 これにより、データ漏えいのリスクを軽減することができます。 詳細情報: https://aka.ms/acr/portal/public-network および https://aka.ms/acr/private-link Modify、Disabled 1.0.0
リポジトリ スコープのアクセス トークンを無効にするようにコンテナー レジストリを構成する トークンを使用してリポジトリにアクセスできないように、レジストリのリポジトリ スコープのアクセス トークンを無効にします。 管理者ユーザー、リポジトリ スコープのアクセス トークン、匿名プルなどのローカル認証方法を無効にすると、コンテナー レジストリでは認証のために Azure Active Directory ID だけが確実に要求されるようになるため、セキュリティが向上します。 詳細については、https://aka.ms/acr/authentication を参照してください。 Modify、Disabled 1.0.0
プライベート エンドポイントを使用してコンテナー レジストリを構成する プライベート エンドポイントを使用すると、接続元または接続先にパブリック IP アドレスを使用せずに、仮想ネットワークが Azure サービスに接続されます。 Premium Container Registry リソースにプライベート エンドポイントをマッピングすることで、データ漏洩のリスクを軽減できます。 詳細情報: https://aka.ms/privateendpoints および https://aka.ms/acr/private-link DeployIfNotExists、Disabled 1.0.0
コンテナー レジストリは、カスタマー マネージド キーを使用して暗号化する必要がある カスタマー マネージド キーを使用して、レジストリのコンテンツ保存時の暗号化を管理します。 既定では、データはサービス マネージド キーを使用して保存時に暗号化されますが、規制コンプライアンス標準を満たすには、一般にカスタマー マネージド キーが必要です。 カスタマー マネージド キーを使用すると、自分が作成して所有する Azure Key Vault キーを使用してデータを暗号化できます。 ローテーションや管理など、キーのライフサイクルを完全に制御し、責任を負うことになります。 詳細については、https://aka.ms/acr/CMK をご覧ください。 Audit、Deny、Disabled 1.1.2
コンテナー レジストリでは、匿名認証が無効になっている必要がある 認証されていないユーザーがデータにアクセスできないように、レジストリに対する匿名プルを無効にします。 管理者ユーザー、リポジトリ スコープのアクセス トークン、匿名プルなどのローカル認証方法を無効にすると、コンテナー レジストリでは認証のために Azure Active Directory ID だけが確実に要求されるようになるため、セキュリティが向上します。 詳細については、https://aka.ms/acr/authentication を参照してください。 Audit、Deny、Disabled 1.0.0
コンテナー レジストリでは、ARM 対象ユーザー トークン認証を無効にする必要がある。 レジストリへの認証のために Azure Active Directory ARM 対象ユーザー トークンを無効にします。 認証には、Azure Container Registry (ACR) の対象ユーザー トークンのみが使用されます。 これにより、レジストリで使用するためのトークンのみを認証に使用できるようになります。 ARM 対象ユーザー トークンを無効にしても、管理者ユーザーまたはスコープ付きアクセス トークンの認証には影響しません。 詳細については、https://aka.ms/acr/authentication を参照してください。 Audit、Deny、Disabled 1.0.0
コンテナー レジストリではエクスポートを無効にする必要があります エクスポートを無効にすると、データプレーン (' docker pull ') を介してのみレジストリ内のデータにアクセスできるようになるため、セキュリティが強化されます。 'acr import' または ' acr transfer ' を使用して、レジストリからデータを移動することはできません。 エクスポートを無効にするには、公衆ネットワーク アクセスを無効にする必要があります。 詳細については、https://aka.ms/acr/export-policy を参照してください。 Audit、Deny、Disabled 1.0.0
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある レジストリの管理者アカウントを無効にして、ローカル管理者がアクセスできないようにします。管理者ユーザー、リポジトリ スコープのアクセス トークン、匿名プルなどのローカル認証方法を無効にすると、コンテナー レジストリでは認証のために Azure Active Directory ID だけが確実に要求されるようになるため、セキュリティが向上します。 詳細については、https://aka.ms/acr/authentication を参照してください。 Audit、Deny、Disabled 1.0.1
コンテナー レジストリでは、リポジトリ スコープのアクセス トークンが無効になっている必要がある トークンを使用してリポジトリにアクセスできないように、レジストリのリポジトリ スコープのアクセス トークンを無効にします。 管理者ユーザー、リポジトリ スコープのアクセス トークン、匿名プルなどのローカル認証方法を無効にすると、コンテナー レジストリでは認証のために Azure Active Directory ID だけが確実に要求されるようになるため、セキュリティが向上します。 詳細については、https://aka.ms/acr/authentication を参照してください。 Audit、Deny、Disabled 1.0.0
コンテナー レジストリにはプライベート リンクをサポートする SKU が必要である Azure Private Link を使用すると、接続元または接続先にパブリック IP アドレスを使用せずに、仮想ネットワークを Azure サービスに接続できます。 プライベート リンク プラットフォームでは、Azure のバックボーン ネットワークを介してコンシューマーとサービスの間の接続が処理されます。 サービス全体ではなくコンテナー レジストリにプライベート エンドポイントをマッピングすることで、データ漏えいのリスクが軽減されます。 詳細については、https://aka.ms/acr/private-link を参照してください。 Audit、Deny、Disabled 1.0.0
コンテナー レジストリでは無制限のネットワーク アクセスを許可しない 既定では、Azure コンテナー レジストリは、任意のネットワーク上のホストからのインターネット経由の接続を受け入れます。 潜在的な脅威からレジストリを保護するには、特定のプライベート エンドポイント、パブリック IP アドレス、またはアドレス範囲のみからのアクセスを許可します。 レジストリにネットワーク規則が構成されていない場合は、異常なリソースとして表示されます。 Container Registry ネットワーク規則の詳細については、https://aka.ms/acr/privatelink、https://aka.ms/acr/portal/public-network、および https://aka.ms/acr/vnet を参照してください。 Audit、Deny、Disabled 2.0.0
コンテナー レジストリでキャッシュ ルールの作成を禁止する必要がある Azure コンテナー レジストリのキャッシュ ルールの作成を無効にして、キャッシュ プルを介したプルを防ぎます。 詳細については、https://aka.ms/acr/cache を参照してください。 Audit、Deny、Disabled 1.0.0
コンテナー レジストリではプライベート リンクを使用する必要がある Azure Private Link を使用すると、接続元または接続先にパブリック IP アドレスを使用せずに、仮想ネットワークを Azure サービスに接続できます。 プライベート リンク プラットフォームでは、Azure バックボーン ネットワークを介してコンシューマーとサービスの間の接続が処理されます。サービス全体ではなく、コンテナー レジストリにプライベート エンドポイントをマッピングすることで、データ漏洩のリスクからも保護されます。 詳細については、https://aka.ms/acr/private-link を参照してください。 Audit、Disabled 1.0.1
イベント ハブへのコンテナー レジストリ (microsoft.containerregistry/registries) のカテゴリ グループごとのログを有効にする リソース ログを有効にして、リソースで発生するアクティビティとイベントを追跡し、発生した変更を可視化し、分析情報を提供する必要があります。 このポリシーでは、カテゴリ グループを使用して診断設定をデプロイし、コンテナー レジストリ (microsoft.containerregistry/registries) 用のイベント ハブにログをルーティングします。 DeployIfNotExists、AuditIfNotExists、Disabled 1.1.0
コンテナー レジストリ (microsoft.containerregistry/registries) のカテゴリ グループごとの Log Analytics へのログを有効にする リソース ログを有効にして、リソースで発生するアクティビティとイベントを追跡し、発生した変更を可視化し、分析情報を提供する必要があります。 このポリシーでは、カテゴリ グループを使用して診断設定をデプロイし、コンテナー レジストリ (microsoft.containerregistry/registries) 用の Log Analytics ワークスペースにログをルーティングします。 DeployIfNotExists、AuditIfNotExists、Disabled 1.0.0
コンテナー レジストリ (microsoft.containerregistry/registries) のカテゴリ グループごとのストレージへのログを有効にする リソース ログを有効にして、リソースで発生するアクティビティとイベントを追跡し、発生した変更を可視化し、分析情報を提供する必要があります。 このポリシーでは、カテゴリ グループを使用して診断設定をデプロイし、コンテナー レジストリ (microsoft.containerregistry/registries) 用のストレージ アカウントにログをルーティングします。 DeployIfNotExists、AuditIfNotExists、Disabled 1.0.0
コンテナー レジストリに対してパブリック ネットワーク アクセスを無効にする必要がある 公衆ネットワーク アクセスを無効にすると、パブリック インターネットにコンテナー レジストリが露出されなくなるのでセキュリティが向上します。 プライベート エンドポイントを作成すると、コンテナー レジストリ リソースの公開を制限することができます。 詳細情報: https://aka.ms/acr/portal/public-network および https://aka.ms/acr/private-link Audit、Deny、Disabled 1.0.0

ポリシーの割り当てを作成する

  • Azure portalAzure CLIResource Manager テンプレート、または Azure Policy SDK を使用して、ポリシーの割り当てを作成します。
  • ポリシーの割り当て範囲をリソース グループ、サブスクリプション、または Azure 管理グループに設定します。 コンテナー レジストリのポリシー割り当ては、範囲内の既存のコンテナー レジストリと新しいコンテナー レジストリに適用されます。
  • ポリシー適用の有効と無効はいつでも切り替えられます。

Note

ポリシーの割り当てを作成または更新した後、定義されている範囲内のリソースが割り当てによって評価されるまで少し時間がかかります。 詳細は、ポリシー評価トリガーを参照してください。

ポリシーのコンプライアンスを確認する

Azure portal、Azure コマンドライン ツール、または Azure Policy SDK を使用し、ポリシー割り当てによって生成されたコンプライアンス情報にアクセスします。 詳細については、「Azure リソースのコンプライアンス データを取得する」を参照してください。

リソースのコンプライアンス違反には多くの理由が考えられます。 理由や原因となった変更を特定する方法については、「コンプライアンス違反の原因の特定」をご覧ください。

ポータルのポリシー コンプライアンス:

  1. [すべてのサービス] を選択し、ポリシーを検索します。

  2. [コンプライアンス] を選択します。

  3. フィルターを使用し、コンプライアンスの状態を限定するか、ポリシーを検索します。

    ポータルのポリシーのコンプライアンス

  4. ポリシーを選択し、集約コンプライアンスの詳細とイベントを確認します。 必要であれば、リソース コンプライアンスに対して特定のレジストリを選択します。

Azure CLI のポリシー コンプライアンス

Azure CLI を利用してコンプライアンス データを取得することもできます。 たとえば、CLI で az policy assignment list コマンドを使用し、適用されている Azure Container Registry ポリシーのポリシー ID を取得します。

az policy assignment list --query "[?contains(displayName,'Container Registries')].{name:displayName, ID:id}" --output table

サンプル出力:

Name                                                                                   ID
-------------------------------------------------------------------------------------  --------------------------------------------------------------------------------------------------------------------------------
Container Registries should not allow unrestricted network access           /subscriptions/<subscriptionID>/providers/Microsoft.Authorization/policyAssignments/b4faf132dc344b84ba68a441
Container Registries should be encrypted with a Customer-Managed Key (CMK)  /subscriptions/<subscriptionID>/providers/Microsoft.Authorization/policyAssignments/cce1ed4f38a147ad994ab60a

次に az policy state list を実行すると、特定のポリシー ID の下にあるすべてのリソースに関して JSON で書式設定されたコンプライアンスの状態が返されます。

az policy state list \
  --resource <policyID>

あるいは az policy state list を実行すると、myregistry など、特定のレジストリ リソースの JSON で書式設定されたコンプライアンスの状態が返されます。

az policy state list \
 --resource myregistry \
 --namespace Microsoft.ContainerRegistry \
 --resource-type registries \
 --resource-group myresourcegroup

次のステップ