OpenResty Edge には高性能な WAF が組み込まれており、Web コンソールからアプリケーションごとに有効化できます。ルールセットを選び、ログのみ(Log only)モードで試験運用し、ヒットログを確認してから、アクションを 403 レスポンスによるブロックへ切り替えます。設定はすべてのゲートウェイサーバーへ、リロードや再起動なしで反映されます。

OpenResty Edge の WAF エンジンは ModSecurity や lua-resty-waf などのオープンソース WAF より数倍高速です。具体的な数値は ModSecurity との WAF 性能比較をご覧ください。本記事ではコンソール操作に焦点を当て、WAF の有効化・テスト・チューニング・拡張を順に解説します。

ログのみモードでアプリケーションの WAF を有効化する

OpenResty Edge の管理者用 Web コンソールにアクセスしましょう。これはコンソールのサンプルデプロイメントです。各ユーザーは独自のローカルデプロイメントを持っています。

OpenResty Edge Web コンソールのホーム画面とアプリケーション一覧

今回も test-edge.com ドメインのサンプルアプリケーションを使用します。

アプリケーション一覧で test-edge.com ドメインを検索

このアプリケーションに進みます。

絞り込まれた一覧に表示された test-edge.com ドメインのサンプルアプリケーション

ページルールのページに進みます。

アプリケーションのサイドバーにあるページルールメニュー

前回のチュートリアルでリバースプロキシのページルールを設定しました。

アプリケーションに既存のリバースプロキシページルール

ここで、いくつかの WAF ルールセットを有効にしましょう。

このページルールを編集するためにクリックします。

ページルールの編集ボタン

WAF を有効にするには、このスイッチをクリックする必要があります。

ルール編集ダイアログでこれからオンにする WAF スイッチ

WAF を有効化した後に展開された WAF オプション

有効にする WAF ルールセットを選択できます。

ルールセットを選択するためのページルール内の WAF ルール欄

ここでは、デフォルトのルールセットのみを保持します。

デフォルトのまま選択された WAF ルールセット

WAF ルールにヒットしたリクエストに対して実行するアクションを選択します。

WAF ルールにヒットしたリクエストへのアクション選択

「Log only」アクションは、リクエスト自体に影響を与えずに WAF ルールをテストするのに役立ちます。

WAF ルールを安全にテストするためのログのみアクションの選択

このルールを保存します。

WAF を有効化したページルールの保存

いつもと同様に、先ほどの変更をプッシュするために新しいバージョンをリリースする必要があります。

新しい WAF 設定をリリースするための未リリース変更の通知

このボタンをクリックします。

設定変更のリリースボタンをクリック

リリースします!

WAF 設定のリリースの確認

新しいバージョンがすべてのゲートウェイサーバーに同期されました。

すべてのゲートウェイサーバーへ同期されたリリース

これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。

アニメーション:設定がすべてのゲートウェイクラスターへ同期(開始)

アニメーション:設定がすべてのゲートウェイクラスターへ同期(進行中)

アニメーション:設定がすべてのゲートウェイクラスターへ同期(完了)

これらの設定変更には、サーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。

図:Edge Admin が各ゲートウェイノードのローカルストレージへ設定を同期し、リロードなしで実行中のプロセスを更新

テスト攻撃を送信して WAF ログを確認する

ここで、SQL インジェクションを試みる悪意のあるリクエストを送信してみましょう。

ログのみモードで SQL インジェクションのテストリクエストに返されたオリジンのデフォルトインデックスページ

リクエストはオリジンサーバーのデフォルトインデックスページを返します。これは「Log only」アクションを選択したため、予想通りの動作です。Web コンソールで WAF ヒットログを確認しましょう。

OpenResty Edge コンソールの WAF ログメニュー項目

記録されたルールヒットが一覧表示された WAF ログページ

このルールが確かにヒットし、ログに記録されたことがわかります。

ログのみモードで SQL インジェクションルールのヒットを示す WAF ログエントリ

この部分は、WAF によってキャプチャされたリクエストの詳細を示しています。

WAF に捕捉された個別リクエストの詳細

ルールを確認ボタンをクリックして、ヒットした WAF ルールの詳細を確認します。

マッチした WAF ルールを確認するための「ルールを確認」ボタン

ここにそのルールの Edgelang 定義が表示されています。

EdgeLang で表示されたマッチした WAF ルールの定義

個別 WAF ルールの無効化と再有効化

誤検知が発生した場合、このスイッチをオフにして、個別の WAF ルールを無効にすることができます。

ルールを無効化するための WAF ログエントリ内の個別ルールスイッチ

無効化されたルールは WAF 設定ページに表示されます。

サイドバーの WAF 設定メニュー項目

ここに無効化されたすべての WAF ルールのリストがあります。

無効化された WAF ルールの一覧

これが先ほど無効にした WAF ルールです。

一覧内の先ほど無効化した WAF ルール

削除ボタンをクリックすると、このルールを再度有効にすることができます。

無効化されたルールを再有効化するための削除ボタン

無効化エントリを削除してルールを再有効化する確認ダイアログ

WAF ホワイトリストで CPU を節約する

さらに、CPU リソースを節約するために、WAF をバイパスすべきすべてのリクエストを列挙する WAF ホワイトリストを追加することができます。

WAF 設定ページの WAF ホワイトリストセクション

例えば、通常、静的リソースに WAF フィルタリングを使用する必要はありません。これらのリソースをスキップすることで、サーバーのオーバーヘッドを減らすことができます。

WAF ホワイトリストルールの新規作成ボタン

URI プレフィックス一致条件を含む WAF ホワイトリストルールの新規作成フォーム

WAF ヒット時に 403 を返す:感度とリスクスコアしきい値

今回は、「Log only」アクションを別のものに変更しましょう。例えば、403 エラーレスポンスを返すようにします。

図:OpenResty Edge WAF がブロックしたリクエストに 403 Forbidden レスポンスを返す

ページルールのページに戻ります。

サイドバーのページルールメニュー項目

再度ページルールを編集します。

WAF アクションを変更するためのページルールの再編集

アクションを変更します。

ページルール内の WAF アクションの変更

今回は悪意のあるリクエストをブロックします。

悪意のあるリクエストをブロックするアクションの選択

ここで感度レベルを設定できます。

ページルールでの WAF 感度レベルの設定

また、スコアしきい値を設定することもできます。

最小リスクスコアしきい値の直接設定

これは、ヒットしたすべての WAF ルールのリスクスコアの合計です。先ほど設定したアクションは、合計スコアがしきい値に達した場合にのみ実行されます。このルールを保存します。

ページルールの保存

再度、設定の変更をリリースします。

403 ブロックアクションへ切り替えた後の未リリース変更の通知

リリースボタンをクリック

リリースの確認

更新された設定がすべてのゲートウェイサーバーへ同期

WAF ログで 403 ブロックを検証する

再度、悪意のあるリクエストを送信します。

再送した SQL インジェクションリクエストに返された 403 Forbidden ブロックページ

今回、サーバーは「403 Forbidden」レスポンスを返しました。

WAF のログページをもう一度確認しましょう。

ブロック設定のリリース後の WAF ログメニュー項目

ここに記録されたアクションは確かに「HTTP コード 403 でブロック」となっています。

アクションとして「HTTP コード 403 でブロック」を示す WAF ログエントリ

EdgeLang で独自の WAF ルールセットを作成する

WAF プラットフォームは非常に柔軟で拡張可能です。独自の WAF ルールセットを作成することもできます。

グローバル設定ページに移動します。

トップナビゲーションのグローバル設定タブ

「グローバル WAF」メニュー項目をクリックします。

グローバル WAF メニュー項目

「新規ルールセット」ボタンをクリックします。

グローバル WAF ページの新規ルールセットボタン

ここでルールセットの名前と定義を入力します。

WAF ルールセットの名前と定義の入力

Edge 言語で WAF ルールを定義できます。Edge 言語は Edgelang と略されます。

新規ルールセットダイアログの EdgeLang コードエディタ

このルールセットを保存します。

新しい WAF ルールセットの保存

このページを終了します。

有効にするルールセットの数が増えても、WAF は高速なままです。OpenResty Edge はすべてのルールの正規表現を単一のステートマシンに結合し、各リクエストを 1 回だけスキャンします。実装の詳細とベンチマーク数値は OpenResty Edge WAF が ModSecurity を上回る理由をご覧ください。

FAQ:OpenResty 上の WAF

オープンソース版 OpenResty に WAF は組み込まれていますか?

いいえ。オープンソース版 OpenResty には WAF モジュールは含まれていません。本チュートリアルの WAF は、OpenResty をベースにした商用ゲートウェイ製品 OpenResty Edge の機能で、上記で紹介したマネージドルールセット、ログのみモード、WAF ログ、ブロックアクションを標準搭載しています。

オープンソース版 OpenResty で ModSecurity は動かせますか?

OpenResty 向けの公式 ModSecurity モジュールはありません。libmodsecurity とサードパーティの nginx コネクタを OpenResty 同梱の nginx に対して自分でコンパイルする必要があり、しかも ModSecurity の元ベンダーは 2024 年にサポートを終了し、プロジェクトはコミュニティによる保守へ移管されました。現在は完全に自前で保守する道となります。

lua-resty-waf はまだ選択肢になりますか?

実質的になりません。lua-resty-waf は長年メンテナンスされておらず、新規の本番環境には推奨できません。OpenResty スタック上で保守されている WAF の現実的な選択肢は、本チュートリアルで設定した OpenResty Edge 組み込みの WAF です。

実トラフィックをブロックせずに WAF ルールをテストするには?

ルールセットを有効化する際に WAF アクションを「Log only」に設定します。ルールにマッチしたリクエストはそのままオリジンへ転送されますが、ヒットはすべて WAF ログに記録され、「ルールを確認」ボタンでどのルールにマッチしたかを確認できます。ルールに問題がなければ、アクションをブロックに切り替えて設定をリリースします。

OpenResty Edge WAF はどのようにブロックを判断しますか?

マッチした各 WAF ルールにはリスクスコアが設定されており、リクエストごとにマッチしたすべてのルールのスコアが合算されます。合計がしきい値に達した場合にのみブロックアクションが実行されます。しきい値は感度レベルの選択、またはスコアの直接入力で設定できます。

OpenResty Edge で単一の WAF ルールを無効化するには?

あるルールが正常なトラフィックへの誤検知を繰り返す場合は、WAF ログからそのルールだけをオフにできます。ルールセットの残りは動作し続けます。無効化されたルールは WAF 設定ページに一覧表示され、エントリを削除すると再有効化されます。静的リソースなどフィルタリング不要のリクエストはホワイトリストに登録でき、CPU の節約にもなります。

OpenResty Edge について

OpenResty Edge は、マイクロサービスと分散トラフィックアーキテクチャ向けに設計された多機能ゲートウェイソフトウェアで、当社が独自に開発しました。トラフィック管理、プライベート CDN 構築、API ゲートウェイ、セキュリティ保護などの機能を統合し、現代のアプリケーションの構築、管理、保護を容易にします。OpenResty Edge は業界をリードする性能と拡張性を持ち、高同時接続・高負荷シナリオの厳しい要求を満たすことができます。K8s などのコンテナアプリケーショントラフィックのスケジューリングをサポートし、大量のドメイン名を管理できるため、大規模ウェブサイトや複雑なアプリケーションのニーズを容易に満たすことができます。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!