マネージドルール内のルールIDが異なるAWSアカウントでも共通か確認する
AWS WAFマネージドルール内のルールIDが、異なるAWSアカウントでも共通か確認しました。結果をお伝えすると、少なくとも検証したCSC社のルールでは同じでした。
AWS WAFマネージドルール内のルールIDとは?
WAFを利用していると、正しいユーザーの通信をブロックしてしまうことがあります。誤検知時の対応として、個々のルールを例外登録できます。マネージドルール全体ではブロックし、例外登録したルールではカウントにするといったことが可能です。例外登録については以下のブログが詳しいです。
例外登録するIDが異なるAWSアカウントのWeb ACLでも共通なのか検証し、同じであることを確認しました。
AWSアカウントが異なる場合でも、ルールIDが共通だと何が嬉しいのか?
検証環境でテストを行いAWS WAFで誤検知が発生した場合、検証環境にルールの例外登録を行うかと思います。本番環境への反映について、同じルールIDで例外登録できます。新機能のリリース前に検証環境でテストをしてAWS WAFの誤検知を見つけたら、本番環境に容易に反映できることになります。
検証手順
ここまでで本記事の趣旨は終わりですが、検証した手順をご紹介します。異なるAWSアカウントにWeb ACLを作成し、Cyber Security Cloud Managed Rules for AWS WAF Classic -OWASP Set-を割り当てました。ウェブ ACL トラフィック情報のログ記録を有効にしておきます。Web ACLはALBに適用しました。
XSSのテストコードの送信
WebブラウザのURLにhttp://alb-dnsname/?<script>alert(document.cookie)</script>
を入力します。AWS WAFでブロックされ、ブロック画面「403 Forbidden」が表示されます。
Athenaでのログ確認
AWS WAFのログを見て、どのルールIDでブロックされたのか確認します。素のログをそのまま見るのは骨が折れるため、Athenaを利用します。Athenaコンソールでテーブル「waflogs_201911」を作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS waflogs_201911 ( `timestamp` bigint, formatVersion int, webaclId string, terminatingRuleId string, terminatingRuleType string, action string, httpSourceName string, httpSourceId string, ruleGroupList array < struct < ruleGroupId: string, terminatingRule: string, nonTerminatingMatchingRules: array < struct < action: string, ruleId: string > >, excludedRules: array < struct < exclusionType: string, ruleId: string > > > >, rateBasedRuleList array < struct < rateBasedRuleId: string, limitKey: string, maxRateAllowed: int > >, nonTerminatingMatchingRules array < struct < action: string, ruleId: string > >, httpRequest struct < clientIp: string, country: string, headers: array < struct < name: string, value: string > >, uri: string, args: string, httpVersion: string, httpMethod: string, requestId: string > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://[バケット名]/';
ActionがBlockかつ,自分のIPアドレスのログを抽出します。
SELECT from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST, * FROM waflogs_201911 WHERE action = 'BLOCK' and httpRequest.clientIp='xx.xx.xx.xx';
ログは以下のように確認できます。
rouleGroupList内のterminatingRule.ruleIdが個々のルールIDになります。
異なるAWSアカウントでも同様の操作を行い、同じルールIDが表示されることを確認しました。参考までに、本環境を土日の間放置していたところ、海外から攻撃と思われる通信が残っていました。そちらについても同様の通信が同じルールIDで記録されていました。
さいごに
AWS WAFマネージドルール内のルールIDが異なるAWSアカウントでも、共通なのか確認しました。同じ通信を同じルールIDで検知していたことから、アカウントが異なる場合でもルールの例外登録が簡単にできることを確認しました。