このエントリは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 回、割り当てが自動的に再評価されます。
評価のトリガー / Evaluation triggers
Standard compliance evaluation cycle. Once every 24 hours, assignments are automatically reevaluated.
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
ルール違反したリソースだけアラート通知するには?
以下のような手順でイベントを拾い通知すればよい。
- Event Gridシステムトピックを作成
- Policyのポリシー変更イベントを作成したシステムトピックに流し込む
- 必要なイベントだけ残すようフィルタリング
- システムトピックをサブスクライブするアプリケーション(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)に抵触したことを示すイベントの例で、complianceState
がNonCompliant
になっていることがわかる。
{
"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つのリソースがポリシー違反している状態ということがわかる。
