概要
- こんにちわ、新川です。本日は OCI でWebシステムを構築する際に、セキュリティの不可欠なリソースとなる OCI WAF (Web Application Firewall) の検証結果をまとめます。Webアプリケーションをインターネットに公開する際、SQLインジェクションやクロスサイトスクリプティング(XSS)など、悪意のある攻撃からアプリケーションを守ることは必須です。
- 本記事では、ロードバランサにWAF ポリシーを適用し、実際に疑似的な攻撃を行ってアクセスがブロックされる様子と、その証拠となるWAF ログの確認までを詳しく紹介します。
事前準備
- インターネットからアクセス可能なロードバランサおよびバックエンドの Computeインスタンス(今回は Oracle Linux 9 にセットアップしたWeb サーバー)が構築済みであること 。

- Computeインスタンス起動時に、以下のCloud-init スクリプトを使用して、httpd のインストールとセットアップを行っています。
- Webブラウザを使用してロードバランサのパブリックIPアドレスへアクセスすると以下のWebページが表示されます。

OCI WAF構築手順
- OCIの管理コンソールにて、左ナビゲーションから「Identity & Security」→「Web application firewall」→「Policies」を選択します。
- 「Create WAF policy」を選択します。

- WAF policy のName を入力、Compartmentを選択します。

- Actions をカスタマイズすることもできますが、今回はデフォルトのAction を使用します。

- Access control、Rate limiting は、今回指定しません。
- Protections において「Enable to configure protection rules」を選択します。「Add request protection rule」を選択します。
- 追加するルールのName を指定します。Conditions は今回指定しません。Path を指定しない場合、すべてのパスを対象とします。

- ルールのAction を設定します。Action name に「Pre-configured 401 Response Code Action」を選択します。WAF のブロック時のデフォルト応答は 403 Forbiddenとなりますが、今回追加したルールの動作を識別しやすくするため、あえて401 Unauthorized を選択しています。

- Protection capabilities において「Choose protection capabilities」を選択します。今回は、Recommended フィルタで表示されるすべての保護機能を選択します。

- 以下のルールが追加されました。

- Select enforcement point において、ファイアウォールを適用するロードバランサーを選択します。

- Review and create において、「Create WAF policy」を選択します。

- WAF の作成が完了しました。

攻撃検知テスト
- 次は、WAF に追加したルールに対する攻撃検知テストを行います。ルールに設定した保護機能のSQL Injection (SQLi) (ルールID: 942270) の攻撃を模擬したテストを行います。攻撃を検知してアクセスがブロックされ、401 のエラーステータスが返却されることを確認します。
- SQL Injection (SQLi) のテストは、URLに以下のようなデータベースの操作に関わるキーワードを指定することで模擬可能です。
?id=1%27%20UNION%20SELECT%20NULL,username,password%20FROM%20users
あるいは
?id=1′ UNION SELECT NULL,username,password FROM users
- 以下のようにWebページは表示されず、401 のエラーステータスが返されることが確認できました。

WAFログの有効化
- 最後に、WAFログを有効化します。
- OCIの管理コンソールにて、左ナビゲーションから「Observability & Management」→「Logging」→「Logs」を選択します。
- 「Actions」→「Enable service log」を選択します。

- Select resource において、Resource compartment を選択、Serviceに「WAF Service」を選択、Resource を選択します。
- Configure log において、Log category を選択、Log name を入力します。

- ログ有効化後、ログが表示されるまで数分のタイムラグがあります。数分待ってから、再度攻撃検知テストを行います。以下のように”Block”や”Allow” を示すログが表示されることを確認します。合わせて、送信元アドレスのclientAddr が記録されているか、どのルールで検知されたかにも注目します。

まとめ
- OCI WAF の構築から、疑似的な攻撃による検知テスト、そしてログ設定の有効化までを一通り検証しました。
- 実際に体験して感じたことは、直感的な GUI の操作だけで強力なセキュリティ機能をロードバランサに追加できる手軽さです。これにより、Web アプリケーションへ防御を導入するハードルがぐっと下がったと感じています。
- また、今回のようにあえて401 のエラーレスポンスを返す設定を行い、実際のSQL インジェクション等の攻撃がどのように識別されるかを確認することで、セキュリティ攻撃への理解も深まりました。
- 単なる構築だけで終わらせず、ログの有効化までをセットで確認できたことで、証跡の記録や事後分析といった、実案件の運用に近い検証ができた点も良かったと思います。
