AWS WAFで正規表現(Regex)ルールを使う方法
生徒
「先生、AWS WAFで細かい条件を設定してアクセスを制御することってできるんですか?」
先生
「もちろんできますよ。AWS WAF(エーダブリューエス ワフ)はWebアプリケーションファイアウォールで、正規表現(Regex:レジェックス)ルールを使えば、文字列のパターンに基づいて高度なアクセス制御が可能になります。」
生徒
「正規表現ってちょっと難しそうですが、どうやって使うんですか?」
先生
「安心してください。AWS WAFの管理画面から簡単に設定できます。具体的に見ていきましょう。」
1. AWS WAFと正規表現ルールとは?
AWS WAF(エーダブリューエス ワフ)は、Amazon Web Servicesが提供するクラウド型のWebアプリケーションファイアウォールです。WAF(ワフ)はWeb Application Firewallの略称で、SQLインジェクションやクロスサイトスクリプティング(XSS)といったWeb特有の攻撃からサイトを守る「盾」のような役割を果たします。
正規表現(読み方:セイキヒョウゲン)は、英語でRegex(レジェックス)と呼ばれ、特定の複雑な文字列のパターンを「たった一行の記号」で表現する手法です。プログラミング未経験の方には少し難しく感じるかもしれませんが、パズルやクイズの条件指定のようなものだと考えてください。
例えば、ユーザーが入力した「電話番号」が正しい形式かチェックしたい場合、正規表現を使うと以下のように表現できます。
^[0-9]{3}-[0-9]{4}-[0-9]{4}$
これは「数字3桁 - 数字4桁 - 数字4桁」というパターンに一致するものだけを許可するという意味になります。
AWS WAFでこの正規表現ルールを活用すると、単純な「完全一致」や「前方一致」では対応できない、高度で柔軟なセキュリティ対策が可能になります。例えば「特定の拡張子を持つファイルへのアクセスを拒否する」「不自然な記号の羅列を含むリクエストを遮断する」といった、運用の現場で求められる細かいチューニングが可能になるのが最大の特長です。
2. 正規表現ルールを使うメリット
正規表現ルールを使うことで次のようなメリットがあります。
- 特定の文字列パターンを持つリクエストを許可または拒否できる
- Bot(ボット)やスクレイピングなどの不審なアクセスをより正確に検出できる
- 柔軟に条件を組み合わせて細かい制御ができる
たとえば、アクセス元のURLに「/admin」を含む場合にだけ制御したい場合や、特定のクエリパラメータに怪しい文字列が含まれる場合に対応できます。
3. AWS WAFで正規表現ルールを設定する手順
ここではAWSマネジメントコンソールを使って正規表現ルールを設定する流れを解説します。
- AWSマネジメントコンソールにログイン サービス検索で「WAF」と入力してAWS WAFのページを開きます。
- Web ACLを作成または編集 Web ACL(ウェブ エーシーエル)はアクセス制御リストのことで、ここにルールを追加します。
- ルールを追加 新しいルールを追加し、「正規表現パターンセット」を選びます。
- 正規表現パターンを登録 例えば「^/admin.*」という正規表現を追加すると、「/admin」で始まるすべてのURLにマッチします。
- アクションを指定 マッチした場合に「Allow(許可)」「Block(拒否)」「Count(カウント)」などを設定できます。
- 保存してデプロイ 設定を反映すると、ルールが有効になります。
4. 具体的な活用例
正規表現ルールは、実際に次のような場面で役立ちます。
- 特定の拡張子(例:
.exeや.bat)を含むリクエストをブロックする - 日本語以外の怪しい文字列を含むクエリを遮断する
- ログインページへの過剰アクセスを検知して制御する
このように正規表現を使うと、単純な一致条件では防げない不正アクセスを制御できます。
5. 注意点と運用のポイント
正規表現ルールは非常に強力ですが、注意点もあります。
- 正規表現は複雑になると処理に時間がかかり、パフォーマンスに影響する可能性がある
- 誤った正規表現を設定すると正規ユーザーまでブロックしてしまう
- ルールを有効化する前に必ずテストモードで確認することが重要
また、アクセスログを確認しながら徐々に調整することで、安全性と利便性を両立できます。
6. 補足知識
正規表現は1960年代に数学的な理論として誕生し、その後プログラミング言語や検索機能などに広く応用されてきました。AWS WAFでも同じ仕組みを利用しており、長い歴史のある技術をセキュリティの分野に活かしています。
初心者の方はまず簡単なパターン(例えば「abc」を含む、「^/login」で始まるなど)から試してみるのがおすすめです。徐々に慣れていけば、より高度なセキュリティルールを構築できるでしょう。
まとめ
今回の記事では、AWS WAF(Web Application Firewall)における正規表現(Regex)ルールの活用方法について、その基礎知識から具体的な設定手順、運用上の注意点までを詳しく解説してきました。Webサイトやアプリケーションを運営する上で、避けて通れないのがセキュリティ対策です。特に近年では、単純なIP制限やURL一致だけでは防ぎきれない、巧妙なサイバー攻撃やボットによるスクレイピングが増加しています。こうした脅威に対して、正規表現を用いた柔軟なルール設定は非常に強力な武器となります。
正規表現を活用する重要性の再確認
正規表現は一見すると複雑な文字列の羅列に見えますが、その実体は「文字列の集合を一つの形式で表現する」ための洗練された言語です。AWS WAFでこれを利用することで、特定のパスへのアクセス制限だけでなく、クエリ文字列、HTTPヘッダー、さらにはリクエストボディに含まれる特定のパターンを動的に検知できるようになります。例えば、脆弱性を突こうとするSQLインジェクションの予兆や、難読化されたスクリプトの注入などを、パターンの組み合わせによって効果的にブロックすることが可能です。
運用のサイクルを回す:Countモードの活用
記事の中でも触れましたが、正規表現ルールを導入する際に最も恐れるべきは「誤検知(False Positive)」です。正規のユーザーが利用するリクエストを誤ってブロックしてしまうと、サービスの利便性を大きく損なってしまいます。そのため、いきなり「Block(拒否)」アクションを設定するのではなく、まずは「Count(カウント)」アクションで設定し、CloudWatch MetricsやWAFのログを確認しながら、意図した通りにマッチしているかを検証するプロセスが不可欠です。この「ログを確認し、正規表現を微調整する」という運用サイクルこそが、堅牢なセキュリティ環境を構築する鍵となります。
Pythonによる正規表現パターンのテスト
AWS WAFのコンソール上で直接ルールを試行錯誤するのも良いですが、複雑なパターンを作成する場合は、手元のプログラミング環境で事前テストを行うとスムーズです。以下に、AWS WAFで利用するような正規表現パターンをPythonで検証するためのサンプルコードを紹介します。
import re
# チェックしたいリクエストパスのリスト
test_paths = [
"/admin/config",
"/user/profile",
"/static/js/main.js",
"/admin/login.php",
"/api/v1/get-data"
]
# AWS WAFで設定する想定の正規表現(/adminで始まるパスにマッチさせる)
regex_pattern = r'^/admin.*'
print(f"正規表現パターン: {regex_pattern}")
print("-" * 30)
for path in test_paths:
if re.match(regex_pattern, path):
print(f"[MATCH] 対象パス: {path}")
else:
print(f"[SKIP ] 対象パス: {path}")
CLIでの設定確認
また、設定したWeb ACLの内容をコマンドラインから確認する方法も覚えておくと便利です。AWS CLIを使用することで、現在のルールセットを迅速に取得できます。
aws wafv2 get-web-acl --name MyWebACL --scope REGIONAL --id 12345678-1234-1234-1234-123456789012
{
"WebACL": {
"Name": "MyWebACL",
"Id": "12345678-1234-1234-1234-123456789012",
"Rules": [
{
"Name": "AdminPathRestriction",
"Priority": 0,
"Statement": {
"RegexPatternSetReferenceStatement": {
"ARN": "arn:aws:wafv2:ap-northeast-1:123456789012:regional/regexpatternset/MyPatternSet/..."
}
}
}
]
}
}
このように、AWS WAFと正規表現を組み合わせることで、一歩進んだWebセキュリティ対策が実現できます。最初は難しく感じるかもしれませんが、基本的なメタ文字(^, $, *, +など)の意味を理解するだけでも、設定できるルールの幅は大きく広がります。まずはスモールスタートで、よくある攻撃パターンや特定のパス制限から試してみてはいかがでしょうか。
生徒
「先生、まとめまで読んでみて、正規表現の凄さがようやく分かってきました。ただ文字列を一致させるだけじゃなくて、パターンの組み合わせで悪いアクセスを見つけ出すんですね。」
先生
「その通りです。例えば、特定の拡張子を持つファイルへのアクセスをまとめて制限したり、数字が連続する不自然なパラメータを弾いたりと、使い道は無限大ですよ。」
生徒
「さっき教えてもらったPythonのコードを使って、事前にチェックするのはいいアイデアですね。いきなり本番環境で試して、全部のアクセスを遮断しちゃったら怖いですし……。」
先生
「ははは、そうですね。WAFの『Count』モードもそのためにあります。実際にどのようなリクエストが自分のサイトに来ているのかを分析するだけでも、セキュリティの勉強になりますよ。」
生徒
「まずは自分のブログの管理画面URLを守るルールから作ってみようと思います! 正規表現のメタ文字も少しずつ覚えていきますね。」
先生
「素晴らしい意気込みです。セキュリティ対策に『完成』はありません。ログを見ながらルールを磨き上げて、安全なWebサイト運営を目指しましょう!」