APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Policyで特定のタグが付与されていないリソースを特定する

はじめに

こんにちは、ACS事業部の青木です。
この記事では、Azure Policyで特定のタグが付与されていないリソースを特定する方法について説明します。

皆さん、Azureのタグ機能は利用していますか?
組織でAzureを利用するとき、あらかじめ所有者やプロジェクトなどを表すタグをリソースに付与するようにルール作りをしておくと、タグをもとにどのようにAzure環境が利用されているか分析することができます。 とはいうもののタグでの管理を普及する際に課題になるのが、特定タグの付与をAzure環境の利用者に遵守してもらうことです。
新しい利用ガイドラインを打ち出しても自発的に守ってもらうことを期待しているだけでは、なかなか浸透しづらい現状があると思います。

とはいえ管理者側がすべてのリソースを確認してタグがあるかどうか一つずつ見て回るのはとても大変です。せめて取り決めたルールを守っているか自動的に一覧化して楽に確認できるようにしたいですよね?
ご安心ください。Azure Policyを利用することで、タグを付与していないリソースを一覧化して確認することができます。
この記事では、ポリシーの作成方法やポリシーを使ったタグの付与状況の確認方法などを解説していきます。

ちなみに、そもそもAzure Policyってなんぞや?という方には、以下の記事をまず見ていただくことをお勧めします。

Azure Policyを爆速で理解する

ポリシー作成

前提条件

ここでは仮に、「Azure管理者が利用者に対して、『"owner"というタグをリソースグループに設定してください』と周知しており、Azure管理者は付与していないリソースグループを定期的に確認したい」というシチュエーションを想定します。
この前提をもとに、各リソースグループにownerタグが付与されているか一覧で確認できるようにするために、今回は以下のようなAzure Policyを作成します。

  • リソースグループにownerタグが付与されていないとき、もしくはownerタグが付与されているものの値が空の場合に監査ログを出力するAzurePolicyを作成する
  • 作成したAzure Policyはサブスクリプションに紐づけ、紐づけられたサブスクリプション配下のリソースグループを対象に評価を行う

Azure Portalでポリシーを作成する

ではさっそく、Azure Policyの作成を行っていきましょう。

Azure Portalで[ポリシー]をクリックします。

ポリシー画面にて左ペイン[定義]→[+ポリシー定義]をクリックします。

ポリシー定義画面にて、以下の表に従って設定を入力していきましょう。

設定名 入力する値 説明
定義の場所 <サブスクリプション名> Policyをセットするサブスクリプションの名前
名前 リソースグループにownerタグが割り当てられていません 作成するポリシーのポリシー名
説明 リソースグループにownerタグがない時、またはownerタグの値が空の時、監査ログを出力します。 作成するポリシーのポリシーの説明(任意)
カテゴリ Tags ポリシーが所属するカテゴリを選択します(任意)
ポリシールール <以下のjsonを参考> 作成するポリシーの仕様

※ポリシールールについては以下をコピペしてください。次の項目で補足として詳しく解説します。

{
  "mode": "All",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Resources/subscriptions/resourceGroups"
        },
        {
          "anyOf": [
            {
              "not": {
                "field": "tags.owner",
                "exists": true
              }
            },
            {
              "field": "tags.owner",
              "equals": ""
            }
          ]
        }
      ]
    },
    "then": {
      "effect": "Audit"
    }
  },
  "parameters": {}
}

ここまで記載できたら、画面下の[保存]をクリックしましょう。

【補足】ポリシールールの解説

補足として、前項に記載されているjson形式のポリシールールについて解説します。

主にポリシーの評価条件と条件に合致した際のアクションについてはpolicyRulesに記載していきます。

policyRule内にはifセクションがあり、その中にポリシーの評価条件を記載します。
今回利用するポリシールールのif文の中を見てみると、まずallOfセクションがあることが分かります。
allOfセクションは、配下に記載した複数の条件をすべて満たす場合に真になります(AND条件と同様)。

また、二つ目の条件の中を見るとanyOfセクションがあり、その中に二つの条件があることが分かります。
anyOfセクションは、配下に記載した複数の条件いずれかを満たす場合に真になります(OR条件と同様)

    "if": {
      # AND条件
      "allOf": [
        # 一つ目の条件(該当するリソースのリソースタイプがリソースグループである)
        {
          "field": "type",
          "equals": "Microsoft.Resources/subscriptions/resourceGroups"
        },
        # 二つ目の条件(該当するリソースにownerタグが存在しない、もしくはownerタグの値が空である)
        {
          # OR条件
          "anyOf": [
            # ownerタグが存在しない
            {
              "not": {
                "field": "tags.owner",
                "exists": true
              }
            },
            # ownerタグの値が""(空)である
            {
              "field": "tags.owner",
              "equals": ""
            }
          ]
        }
      ]

つづいて、ifセクションの次にthenセクションが続いています。 こちらを見てみると、effect: Auditと記載されているのが分かります。

    "then": {
      # アクティビティログに監査ログを出力する
      "effect": "Audit"
    }

このセクションで、ifセクションに記載した条件に合致したリソースを検知した場合、ポリシー側でどのような挙動をするかを指定することができます。 "Audit"の場合は監査ログ(Azureのアクティビティログ)にログを出力します。 (他にも"Deny"などを選択することで、ポリシー条件に一致したリソース作成などを禁止することができます)

ポイント

①policyRule内にポリシーの条件とアクションを記載
②ifセクションに条件を記載し、thenに条件に合致した際のアクションを記載
③allOf=AND条件、anyOf=OR条件

ポリシーの割り当て

ポリシーを保存すると、以下のような画面に遷移します。 そのまま、[ポリシーの割り当て]をクリックしましょう。

スコープにAzure Policyを割り当てたいサブスクリプション名を選択しましょう。 こちらで選択したサブスクリプションに対して、作成したAzure Policyの条件で評価が行われます。

それ以外は特に記載せず、[確認および作成]で割り当てを実行しましょう。

ポリシー設定画面で[作成]→[割り当て]とクリックし、作成したポリシーが該当のサブスクリプションに割り当てられていることを確認しましょう。

動作確認

※Azure Policyは即時適用されるとは限らず、場合によっては効果が適用されるまで15分~30分ほどかかる場合があります。
 十分な時間を取ったら、動作確認をしてみましょう。

Azure Portalで、ownerタグを付与せずにリソースグループを作成します。
このとき、Azure Policyを割り当てたサブスクリプション上でリソースグループを作成するようにしてください。

作成後、実際にアクティビティ ログに監査ログが出力されているか確認してみましょう。
Azure Portalで[サブスクリプション]→[< Azure Policyを割り当てたサブスクリプション名 >]→[アクティビティ ログ]とクリックします。
アクティビティ ログの検索バーで、Policyと検索し、"'audit' Policy action."というログをクリックしてみましょう。

リソース名に、先ほど作成したリソースグループ名が表示されていることが確認できれば、ポリシーが問題なく動作しているといえます。
(JSONタブをクリックすることで作成したポリシー名なども確認することができるので、気になる人は見てみてください)

Azure Policyのコンプライアンス画面で準拠しているリソースを確認

割り当てたAzure Policyにどれだけのリソースが準拠しているかは、[ポリシー]の[コンプライアンス]にて確認することができます。
コンプライアンスの画面にて作成したポリシー名で検索し、ポリシー名をクリックします。

この画面で、本ポリシーに準拠しているリソースと準拠していないリソースを一覧で確認することができます。
※ここでいう"準拠しているリソース"とは作成したポリシーのポリシー条件に当てはまらないもの、"準拠していないリソース"は作成したポリシーのポリシー条件に当てはまものなので注意してください。
(今回の場合でいうと、"準拠していない"と表示されるものは「ownerタグが付与されていないか、ownerタグの値が無いリソースグループ」ということになります)

おわりに

今回は、Azure Policyで特定のタグが付与されていないリソースを特定する方法についてまとめました。
Azure Policyを利用して、効果的にAzure環境を管理していきましょう。

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp