はじめに
WAF を利用する際、ポリシーのチューニングが運用課題となります。
そこで今回は、幾つかの前提を基に、運用管理環境を整備してみました。
前提
システム環境
- 限られたユーザーが利用するインターネットシステム
- 送信元グローバルIPは特定可能
運用時に求めること
- 特定送信元GIPからのリクエストがブロック及びチェックされたことを検知できること
- WAFの利用状況を可視化すること
- Log Analyticsのストレージ容量は10GBを超えると課金が発生するため、該当容量を超えないこと
運用管理環境
上記前提を満たす構成を以下の通り整備しました。
Regional WAF のサービスログを OCI Logging に格納し、そこを分岐点に各処理を実施します
- 環境コードは以下 GitHub にあげてますので、よかったら覗いてみてください
特定送信元GIPからのリクエストがブロック及びチェックされたことを検知できること
OCI Logging → OCI Connector Hub → OCI Notifications (Email) の構成 を取っています。
その中でのポイントは、OCI Connector Hub のログフィルタです。
実際のコンディションは以下の通りです。
(data.action='block' and data.clientAddr='113.*') or (data.action='allow' and data.clientAddr='113.*' and data.requestProtection.matchedRules='*')
ブロックログの例を以下に示します。(一部省略有り)
ログ内にはマッチしたルールが含まれますが、送信元IPで拾えることが重要なので action と clientAddr でフィルリングしています。
{
"datetime": 1776423505831,
"logContent": {
"data": {
"action": "block",
"backendStatusCode": "-",
"clientAddr": "113.XXX.XX.XXX",
"countryCode": "jp",
"host": "161.33.137.159",
"listenerPort": "80",
"request": {...},
"requestProtection": {
"matchedData": "Matched Data: \x22 found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: \x22 found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: url(javascript: found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: (javascript:alert( found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: javascript:a found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22",
"matchedIds": "9421100_v002;9421100_v001;9411400_v003;9411700_v003;9412100_v003;9410000_v003",
"matchedRules": "recommend-rules"
},
"requestRateLimiting": {...},
"response": {...},
"responseProtection": {...},
"responseProvider": "requestProtection/recommend-rules",
"timestamp": "2026-04-17T10:53:55Z"
},
"id": "fa8c2d8b-3f6c-4b35-b1cb-04b20d4fbc7e-waf-6",
"oracle": {...},
"source": "flb",
"specversion": "1.0",
"subject": "",
"time": "2026-04-17T10:54:04.796Z",
"type": "com.oraclecloud.loadbalancer.waf"
}
}
アクションをチェックにした場合のログの例を以下に示します。(一部省略有り)
ポイントは、チェックにしても、action は allow となります。
変わりに、requestProtection 内にマッチしたルールが記載されるようになります。
そのため action と clientAddr と requestProtection でフィルタリングしています。
{
"datetime": 1776423505831,
"logContent": {
"data": {
"action": "allow",
"backendStatusCode": "-",
"clientAddr": "113.XXX.XX.XXX",
"countryCode": "jp",
"host": "161.33.137.159",
"listenerPort": "80",
"request": {...},
"requestProtection": {
"matchedData": "Matched Data: \x22 found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: \x22 found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: url(javascript: found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: (javascript:alert( found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22;Matched Data: javascript:a found within ARGS:lt;pstyle: \x22background:url(javascript:alert(1))\x22",
"matchedIds": "9421100_v002;9421100_v001;9411400_v003;9411700_v003;9412100_v003;9410000_v003;9411400_v002;9411700_v002;9412100_v002;9410000_v002;9411400_v001;9411700_v001;9412100_v001;9410000_v001",
"matchedRules": "recommend-rules"
},
"requestRateLimiting": {...},
"response": {...},
"responseProtection": {...},
"responseProvider": "http-backendset",
"timestamp": "2026-04-17T10:53:55Z"
},
"id": "fa8c2d8b-3f6c-4b35-b1cb-04b20d4fbc7e-waf-6",
"oracle": {...},
"source": "flb",
"specversion": "1.0",
"subject": "",
"time": "2026-04-17T10:54:04.796Z",
"type": "com.oraclecloud.loadbalancer.waf"
}
}
WAFの利用状況を可視化すること
OCI Logging → OCI Connector Hub → OCI LogAnalytics の構成 を取っています。
可視化するため、OCI Connector Hub では特にフィルタリングせず、OCI LogAnalytics に取り込んでいます。
実際のダッシュボードですが、以下公式ドキュメントのものが非常にまとまっているため、こちらを使うようにしています。
Log Analyticsのストレージ容量は10GBを超えると課金が発生するため、該当容量を超えないこと
OCI Monitoring → Alarm → OCI Notifications (Functions) の構成 を取っています。
OCI LogAnalytics のアクティブストレージサイズは ActiveStorageUsed メトリクスとして確認ができます。
LogAnalytics 側のパージポリシーを使って定期的にアクティブストレージを削除できますが、cron 式でありストレージサイズに応じた処理はできないため採用していません。
メトリクスにアラームを設定し、OCI Notifications を使ってパージする Functions を呼び出しています。
おわりに
本記事では、OCI WAF ポリシーの運用管理環境を整備してみました。
少し限定的な部分もありますが、こちらを参考に拡張してもらえると。
🌟この記事が誰かの役に立てば幸いです!
また、ご質問やフィードバックもお待ちしています。
参考資料
リファレンス
ブログ
- Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 - SpeakerDeck
- O&M ログ管理サービス詳細版 (Logging, Log Analytics) - SpeakerDeck
- OCI Web Application Firewall 概要 - SpeakerDeck
- WAFv2設定手順 - SpeakerDeck
- WAF保護ルールの考え方 - OCI活用資料集
- Log Analyticsの有効化 - OCIチュートリアル
- OCIのLog AnalyticsでOCIの監査ログを可視化・分析する - OCIチュートリアル
- OCI Load Balancerに直接アタッチするタイプのWeb Application Firewallのログを分析する - OCIチュートリアル
- OCI Functionsのアーキテクチャを理解する - Qiita
- 私の3時間をあなたの5分に - OCI Functions認証編 - Qiita
- 【Python】地味だけど超重要!アンダースコア(_)の5つの役割を徹底解説

