企業内で許可していない設定をしているリソースを見つけ出したい

このエントリは2022/03/07現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。

発端

とある人(いつもの人ではない)から以下のような問い合わせを受けた。

リソース作成の利便性を考え、Azure上で一部権限(ロール)を一般ユーザーに付与しているのだが、その結果、例えばApp Serviceでパブリックアクセスを許可するような形でそのままリソースを作成できてしまう状態にある。本来ならガードレールを配置してそのようなリソース作成をできなくする必要があるが、まずは社内ルールに違反しているリソースをピックアップしたい。そうした場合にどうすればよいか?

Azureに詳しい方であれば、すぐにイメージできるかもしれない。

どうすればよいか?

Azure PolicyでDenyポリシーを作成、もしくはビルトインポリシーを使う。このポリシーはガードレールとしても利用可能。以下は機能と構成の備忘録。

具体的には?

Azure Policyは、Azure 内のリソースのプロパティをビジネス ルールと比較して、それらのリソースを評価することで、コンプライアンスを大規模に評価することができるサービス。詳細は以下のドキュメントを参照。

Azure Policy とは / What is Azure Policy?
https://docs.microsoft.com/azure/governance/policy/overview

例えば、App Serviceでパブリックアクセスを許可しているものをレポートするために、以下のポリシーを利用できる。

App Services では公衆ネットワーク アクセスを無効にする必要がある / App Services should disable public network access
ポリシー定義
https://github.com/Azure/azure-policy/blob/master/built-in-policies/policyDefinitions/App%20Service/AppService_PublicNetworkAccess_AINE.json

ドキュメント上は、App Serviceの項に記述がある。

App Service
https://docs.microsoft.com/azure/governance/policy/samples/built-in-policies#app-service

ポリシー評価はデフォルトでは24時間に1回である点に注意。

標準コンプライアンス評価サイクル。 24 時間に 1 回、割り当てが自動的に再評価されます。
Standard compliance evaluation cycle. Once every 24 hours, assignments are automatically reevaluated.

評価のトリガー / Evaluation triggers
https://docs.microsoft.com/azure/governance/policy/how-to/get-compliance-data#evaluation-triggers

もっと頻度を上げてチェックしたい場合には、REST API、Azure CLI、PowerShellやGitHub Actionsを使って、オンデマンドで評価開始のトリガーを発行できる(Visual Studio Codeでもできるが、定期実行するならVS Code以外を選択することになろう)。

オンデマンドの評価スキャン / On-demand evaluation scan
https://docs.microsoft.com/azure/governance/policy/how-to/get-compliance-data#on-demand-evaluation-scan

ルール違反したリソースだけアラート通知するには?

以下のような手順でイベントを拾い通知すればよい。

  1. Event Gridシステムトピックを作成
  2. Policyのポリシー変更イベントを作成したシステムトピックに流し込む
  3. 必要なイベントだけ残すようフィルタリング
  4. システムトピックをサブスクライブするアプリケーション(Functions、Logic Appsなど)でイベントをサブスクライブし、アラート通知

サンプルアプリを使ったチュートリアルがあるので、手を動かしながら理解するのが早道と思われる。

チュートリアル: Azure CLI を使用してポリシー状態変更イベントを Event Grid にルーティングする / Tutorial: Route policy state change events to Event Grid with Azure CLI
https://docs.microsoft.com/azure/governance/policy/tutorials/route-state-change-events

システムトピックを構成すると、Event Gridスキーマに則った以下のようなイベントが流れてくる。これは上記のポリシー(App Services では公衆ネットワーク アクセスを無効にする必要がある / App Services should disable public network access)に抵触したことを示すイベントの例で、complianceStateNonCompliantになっていることがわかる。

{
    "topic": "/subscriptions/{subscription_id}",
    "id": "{id}",
    "eventType": "Microsoft.PolicyInsights.PolicyStateCreated",
    "subject": "/subscriptions/{subscription_id}/resourcegroups/{resource_group}/providers/microsoft.web/sites/{resource_name}",
    "data": {
        "timestamp": "2022-03-07T10:20:47.4907123Z",
        "policyAssignmentId": "/subscriptions/{subscription_id}/providers/microsoft.authorization/policyassignments/{policy_assignment_id}",
        "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/{policy_definition_id}",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "{subscription_id}",
        "complianceReasonCode": ""
    },
    "dataVersion": "1",
    "metadataVersion": "1",
    "eventTime": "2022-03-07T10:31:56.1850687Z"
}

この内容の通知を受けたら管理者がAzure Portalを見に行くとか、必要な情報をREST APIで取得して付加して通知するとか、情報をもとにリソース作成者に変更を指示させるとか、いろいろなオプションが考えられる。

ルール違反したリソースはAzure Portalでどう見えるか?

Azure Portalでは以下のように確認できる。この例では3つのリソースがポリシー違反している状態ということがわかる。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中