Azure WAFカスタムルールの作り方を徹底解説!IP制限と地理的ブロックの設定手順
生徒
「Azure WAF(アジュール・ウェブ・アプリケーション・ファイアウォール)を使って、特定の国からのアクセスを禁止したり、特定のIPアドレス(アイピー・アドレス)だけを許可したりすることはできますか?」
先生
「はい、もちろん可能です。Azure WAFの『カスタムルール』という機能を使えば、特定の接続元IP制限や地理的(ちりてき)ブロック、いわゆるジオフィルタリングを簡単に設定できますよ。」
生徒
「難しそうですね。初心者でも管理画面から設定できるんでしょうか?」
先生
「大丈夫です。基本的な仕組みさえ理解すれば、マウス操作中心で設定できます。それでは、具体的なカスタムルールの作り方を一緒に見ていきましょう!」
1. Azure WAFのカスタムルールとは?
Azure WAF(アジュール・ウェブ・アプリケーション・ファイアウォール)は、Webアプリケーションをサイバー攻撃から守るためのセキュリティサービスです。標準で備わっている「マネージドルール」は、一般的な攻撃(SQLインジェクションなど)を自動で防いでくれますが、カスタムルールは、利用者(りようしゃ)が独自の条件を定義して通信を制御(せいぎょ)するための機能です。
例えば、「社内のネットワークからのみアクセスを許可したい」という場合や、「特定の国からの攻撃が多いため、その国全体をブロックしたい」といった個別のニーズに対応できます。カスタムルールはマネージドルールよりも先に評価されるため、特定の通信を最優先で遮断(しゃだん)したり許可したりするのに非常に強力なツールとなります。
2. IP制限(IPアドレスフィルタリング)の基本
IP制限とは、接続元のIPアドレスを判別して、アクセスを許可(Allow)または拒否(Deny)する設定のことです。インターネット上の住所(じゅうしょ)にあたるIPアドレスを指定することで、特定の場所からの通信のみを通すことができます。
Azure WAFでは、単一のIPアドレスだけでなく、CIDR(サイダー)形式という表記を使って、IPアドレスの範囲(ネットワーク帯域)を一括(いっかつ)で指定することも可能です。これにより、大規模なオフィスのネットワーク全体をまとめて許可するといった設定がスムーズに行えます。
例えば、メンテナンス用の管理画面などは、外部の不特定多数から見えないように、特定のIPアドレスからのみアクセスできるように制限するのがセキュリティの鉄則(てっそく)です。これにより、万が一パスワードが漏洩(ろうえい)しても、外部からの不正ログインを防ぐことができます。
3. 地理的ブロック(ジオフィルタリング)の仕組み
地理的ブロック(ジオフィルタリング)とは、通信がどの国や地域(ちいき)から行われているかを判別し、国単位でアクセスを制限する機能です。Azure WAFは、世界中のIPアドレスと国情報を紐付けたデータベースを持っており、リクエストが来た瞬間に「これは日本からの通信だ」「これは海外からの通信だ」と判断します。
Webサービスを日本国内限定で展開している場合、海外からの不要なトラフィックや、脆弱性(ぜいじゃくせい)を狙った海外発のスキャン攻撃を国ごとブロックすることで、サーバーの負荷軽減(ふかけいげん)とセキュリティ向上を同時に実現できます。設定も非常に簡単で、プルダウンメニューから国名を選択するだけで完了します。
4. カスタムルールの優先順位と動作
カスタムルールを作成する際に最も重要なのが「優先順位(ゆうせんじゅんい)」の設定です。Azure WAFでは、優先順位に設定した数値(すうち)が小さいものから順番にチェックされます。一度条件に一致(いっち)すると、その後のルールは評価されません。
例えば、以下の順番でルールを適用したいケースを考えてみましょう。
- 特定のホワイトリストIPのみ許可する
- それ以外の全てのアクセスを拒否する
この場合、許可ルールを優先順位「100」、拒否ルールを「200」といった形に設定します。もし順番を間違えて拒否ルールを先に評価してしまうと、せっかく許可したかったIPアドレスまで遮断されてしまうため注意が必要です。
5. 条件式の構成要素を理解しよう
カスタムルールは、以下の3つの要素(ようそ)を組み合わせて作成します。
| 要素 | 意味 |
|---|---|
| 一致変数(Match Variable) | 何をチェックするか(例:RemoteAddr、RequestHeaderなど) |
| 演算子(Operator) | どのような条件か(例:IPMatch、GeoMatch、Containsなど) |
| 一致値(Match Value) | 具体的な値(例:192.168.1.1、"JP"など) |
これらを「もし(If)〜ならば(Then)〜する」という形式で設定します。例えば、「一致変数がRemoteAddr(送信元IP)」で「演算子がIPMatch」で「一致値が1.2.3.4」であれば「アクションをAllow(許可)」にするといった具合です。プログラミングの条件分岐(じょうけんぶんき)に非常に似ているので、考え方を整理して設定しましょう。
6. Azureポータルでの作成手順(IP制限編)
実際にAzureポータルからIP制限ルールを作成する流れを確認しましょう。まずは、対象となるWAFポリシーを開き、「カスタムルール」メニューを選択します。
次に「カスタムルールの追加」をクリックし、以下の情報を入力します。
- 名前: わかりやすい名前(例:AllowOfficeIP)
- 優先順位: 他のルールとの兼ね合いを考えた数値(例:100)
- ルールタイプ: 一致ルール
- 一致変数: RemoteAddr
- 演算子: IPMatch
- 一致値: 許可したいIPアドレス(例:203.0.113.5)
- アクション: Allow
このように設定することで、指定したIPアドレスからの通信が最優先で許可されるようになります。
7. ジオフィルタリングの設定手順(国別ブロック)
特定の国をブロックする場合の設定も、IP制限とほぼ同様です。一致変数を変えるだけで地理的な制限がかかります。以下の設定例を参考にしてください。
- 名前: BlockSpecificCountries
- 優先順位: 200
- ルールタイプ: 一致ルール
- 一致変数: RemoteAddr
- 演算子: GeoMatch
- 一致値: ブロックしたい国(例:United States, Chinaなど)
- アクション: Block
Azure WAFでは複数の国を一度に指定することも可能です。リストからチェックボックスで選択するだけで設定が完了するため、非常に直感的な操作が可能です。設定保存後は、ポリシーの更新が反映(はんえい)されるまで数分待つ必要があります。
8. 複数の条件を組み合わせる「AND」と「OR」
より高度な設定として、複数の条件を組み合わせることも可能です。例えば、「特定の国からのアクセスで、かつ特定のURLへのリクエストのみをブロックする」といった設定です。
Azure WAFのカスタムルール画面では、「条件の追加」を行うことで、複数の判定基準(はんていきじゅん)を設けることができます。これにより、「海外からのアクセスは拒否したいが、特定のAPIエンドポイントだけは世界中に公開したい」といった柔軟な運用が可能になります。条件を増やすほどルールは複雑になりますが、その分きめ細かな防御(ぼうぎょ)が実現できます。
9. 設定後の動作確認とログのチェック
ルールを作成したら、必ず意図(いと)通りに動いているか確認しましょう。ブロック対象のIPアドレスや国からアクセスを試みて、403 Forbidden(フォーゼロスリー・フォービドゥン)エラーが返ってくるかを確認します。逆に、許可した通信が正常にページを表示できるかも重要です。
また、Azure Monitor(アジュール・モニター)のログを確認することで、どのルールによって通信が遮断されたかを詳細に分析できます。もし意図しないブロックが発生している場合は、ログの内容を見て「優先順位が間違っていないか」「条件が厳しすぎないか」を再検討(さいけんとう)しましょう。定期的にログを確認することが、健全なセキュリティ環境を維持(いじ)するコツです。
10. サンプルコードと設定例
ここでは、設定の参考になるような考え方を、プログラミングやSQLの形式に例えて紹介します。初心者の方でも、どのような論理(ろんり)でWAFが動いているかイメージしやすくなるはずです。
C#でのIPチェックのイメージ
string clientIp = "203.0.113.5";
string allowedIp = "203.0.113.5";
if (clientIp == allowedIp)
{
Console.WriteLine("アクセスを許可します。");
}
else
{
Console.WriteLine("アクセスを拒否します。");
}
実行結果は以下のようになります。
アクセスを許可します。
データベースでのアクセス管理イメージ
アクセス制御リスト(ACL)をテーブルに見立てた場合の例です。
id | rule_name | match_value | action
---+----------------+---------------+-------
1 | Office_Allow | 192.168.10.1 | Allow
2 | Partner_Allow | 172.16.0.5 | Allow
3 | Block_US | US | Block
4 | Block_CN | CN | Block
SELECT action
FROM waf_custom_rules
WHERE match_value = '192.168.10.1'
ORDER BY id ASC;
実行結果(アクションの判定):
Allow
Linux環境からの疎通確認イメージ
ブロックされた場合に、コマンドライン(こまんどらいん)でどのように見えるかの例です。
curl -I https://your-website.com
HTTP/1.1 403 Forbidden
Server: Microsoft-Azure-Application-Gateway/v2
Content-Type: text/html
Content-Length: 179
C#での複数条件(AND)のイメージ
string country = "US";
string path = "/admin";
if (country == "US" && path.StartsWith("/admin"))
{
Console.WriteLine("アメリカからの管理画面アクセスをブロックしました。");
}
実行結果:
アメリカからの管理画面アクセスをブロックしました。
まとめ
Azure WAF(アジュール・ウェブ・アプリケーション・ファイアウォール)のカスタムルールを活用することで、標準の防御機能だけでは手が届かない、個別のセキュリティ要件に柔軟に対応できることがお分かりいただけたかと思います。特定のIPアドレスからのアクセスを許可するホワイトリスト形式の運用や、特定の国や地域からの通信を一括で遮断するジオフィルタリング(地理的ブロック)は、Webサイトの安全性を高めるための極めて有効な手段です。
カスタムルール活用のポイント
設定において最も注意すべき点は「優先順位」と「条件の組み合わせ」です。優先順位は数値が小さいものから評価されるため、広範なブロックルールの前に、特定の許可ルールを配置するのが鉄則です。また、単一の条件だけでなく、URLパスやリクエストメソッドと組み合わせることで、より精度の高いフィルタリングが可能になります。
クラウド環境でのセキュリティ管理は、一度設定して終わりではありません。攻撃手法の変化やアクセスの増減に合わせて、定期的にログを確認し、ルールを最適化していくことが重要です。Azure WAFは直感的なポータル操作でこれらを実現できるため、エンジニアだけでなく運用担当者にとっても強力な味方となります。本記事で紹介した手順を参考に、ぜひ強固なWebアプリケーション保護環境を構築してみてください。
プログラムによる制御ロジックの再確認
WAFのカスタムルールがどのように判定を行っているか、改めてC#のロジックに当てはめて整理してみましょう。複数のルールが存在する場合、以下のようなループ処理と条件分岐に近い動きをしています。
using System;
using System.Collections.Generic;
public class WafRule
{
public int Priority { get; set; }
public string RuleName { get; set; }
public string Action { get; set; } // Allow or Block
public string MatchVariable { get; set; }
public string MatchValue { get; set; }
}
public class WafSimulator
{
public static void Main()
{
// カスタムルールのリスト(優先順位順)
List<WafRule> rules = new List<WafRule>
{
new WafRule { Priority = 100, RuleName = "Allow_Office", Action = "Allow", MatchVariable = "RemoteAddr", MatchValue = "203.0.113.5" },
new WafRule { Priority = 200, RuleName = "Block_Overseas", Action = "Block", MatchVariable = "GeoMatch", MatchValue = "US" }
};
string clientIp = "203.0.113.5";
string clientCountry = "JP";
foreach (var rule in rules)
{
if (rule.MatchVariable == "RemoteAddr" && clientIp == rule.MatchValue)
{
Console.WriteLine($"ルール適合: {rule.RuleName} 判定結果: {rule.Action}");
return;
}
if (rule.MatchVariable == "GeoMatch" && clientCountry == rule.MatchValue)
{
Console.WriteLine($"ルール適合: {rule.RuleName} 判定結果: {rule.Action}");
return;
}
}
Console.WriteLine("どのカスタムルールにも一致しませんでした(マネージドルールへ)。");
}
}
上記のシミュレーションプログラムを実行した結果、オフィスIPからの通信は最優先で許可されます。
ルール適合: Allow_Office 判定結果: Allow
データベースでのルール管理例
大規模なシステムでは、どのようなルールが適用されているかをデータベースで管理し、監査ログとして残すことも一般的です。現在の設定状況を確認するためのSQLイメージを見てみましょう。
rule_id | rule_name | priority | match_type | match_value | action
--------+----------------------+----------+------------+-------------+-------
10 | Allow_Internal_Net | 100 | IPMatch | 10.0.0.0/24 | Allow
20 | Block_Malicious_IP | 150 | IPMatch | 192.0.2.1 | Block
30 | Geo_Block_Non_JP | 200 | GeoMatch | CN | Block
40 | Geo_Block_Non_JP_US | 210 | GeoMatch | US | Block
50 | Limit_Admin_Access | 300 | RequestUri | /admin | Block
優先順位が高い(数値が小さい)順にルールを抽出するクエリは以下の通りです。
SELECT rule_name, priority, action
FROM waf_settings
WHERE action = 'Block'
ORDER BY priority ASC;
実行結果として、ブロック対象のルールが優先順位順に表示されます。
rule_name | priority | action
--------------------+----------+-------
Block_Malicious_IP | 150 | Block
Geo_Block_Non_JP | 200 | Block
Geo_Block_Non_JP_US | 210 | Block
Limit_Admin_Access | 300 | Block
このように、構造化されたデータとして捉えることで、複雑なWAFの設定も整理しやすくなります。
生徒
「先生、ありがとうございました!カスタムルールの優先順位がなぜ大事なのか、プログラムの条件分岐に例えてもらってすごく納得できました。if文と同じで、先に一致したものが適用されるんですね。」
先生
「その通りです!よく理解できましたね。もし拒否ルールを一番上(優先順位1)にしてしまうと、その下の許可ルールが全く意味をなさなくなってしまうので、そこだけは本当に注意が必要です。」
生徒
「IP制限とジオフィルタリングを組み合わせれば、日本国内の特定の拠点からだけアクセスを許可する、といったガチガチのセキュリティも作れそうですね。設定もAzureポータルからポチポチ選ぶだけなので、思っていたよりハードルが低かったです。」
先生
「そうですね。ただ、あまりルールを複雑にしすぎると、自分たちの正当なアクセスまでブロックしてしまう『過検知(かけんち)』が起きることもあります。まずは『検出(Detection)』モードで試して、ログを見ながら徐々に『防止(Prevention)』に切り替えていくのがプロのやり方ですよ。」
生徒
「なるほど、いきなり遮断するんじゃなくて、まずは様子を見るんですね。Linuxのcurlコマンドで403エラーが返ってくるのを確認するのも、実験みたいで面白そうです。さっそくテスト環境で試してみます!」
先生
「その意気です!セキュリティは実際に手を動かして、わざとブロックされる挙動を見るのが一番の近道です。頑張ってくださいね。」