日本語
京都・けいはんな学研都市のソフトウエア開発・Webシステム
株式会社Coolware
けいはんな学研都市

UbuntuでWAF(Web Application Firewall)を利用する方法

読者の皆様こんにちは。今日はUbuntuへのWAFのインストール&調整方法、具体的にはModSecurityでのお話をお伝えしていこうと思います。ウェブアプリケーションのセキュリティのために”WAF”と検索すると、わんさか有料サービスが出てきますが、開発や運用の規模によっては”セキュリティは必要だけど初っ端から大金を叩くわけにはいかない”というケースも多いでしょう。今回扱うModSecurityはオープンソースなのでその辺の心配はご無用です!!それでは本文へ!!


1. WAFってなんぞや?

冒頭からWAFって何度も言ってますが、”WAFってなんやねん”って思っておられる読者の方も一定数いそうなのでまずはそこの説明から。WAFは”Web Application Firewal“の略でウェブアプリケーションへの攻撃を防ぐために重要なセキュリティ対策です。まぁつまり、”パソコンでお使いのウイルス対策ソフトのすごい版”くらいのイメージで見ていただければわかりやすいかと思います。もう少し詳細にお話しするとWAFは、ウェブアプリケーションへのリクエストを解析し、悪意あるトラフィックを検出してブロックする役割を果たします。またSQLインジェクションやクロスサイトスクリプティング(XSS)といった一般的な攻撃から、ウェブアプリケーションを保護します。

WAFの主な機能

  • 攻撃の検出と防御:リクエストの内容を検査し、脅威を特定。
  • ルールベースの防御:特定の条件に基づいてアクセスを許可または拒否。
  • ログ収集と監視:不審なリクエストを記録して監視。

2.ModSecurityよ、貴様何者じゃ?

先ほどの章でWAFとは何かをご理解いただけたかと思いますが、そうなると有料版や無料版など様々なものがたくさんあるのも同時にご理解いただけると思います。今回利用するWAFは”ModSecurity”というオープンソースものです。WAFには設置形態によりSaas型、ゲートウェイ型、ホスト型の3つに区分されますが、ModSecurityはホスト型という種類になり、対象のWebサーバーへインストールして利用します。

3. UbuntuでのWAF導入

ModSecurityの詳細な機能についてはまだまだお伝えしていきたいところではありますが、今回はインストールから利用までを扱う記事になるので、詳細はModSecurityをご覧ください。

3.1 必要なソフトウェアのインストール

流石にWAFの導入を検討されている読者の皆様に向けては必要ないかもしれませんが、今回はサーバーにApacheをインストールするところから話を進めていきますね。一応ね!?

  1. Apacheのインストール
    WAFはウェブサーバーと連携するため、まずウェブサーバーをセットアップします。例としてApacheを使用します。sudo apt update sudo apt install apache2
  2. ModSecurityのインストール sudo apt install libapache2-mod-security2
  3. ModSecurityを有効化 インストール後、モジュールを有効化します。sudo a2enmod security2 sudo systemctl restart apache2

4. ModSecurityの基本設定

ModSecurityはデフォルト設定でも基本的な攻撃を防ぐことができますが、チューニングを行うことで、環境に合わせた最適な防御が可能です。

4.1 設定ファイルの場所

  • メイン設定ファイル:
    /etc/modsecurity/modsecurity.conf
  • ルール設定ファイル:
    /etc/modsecurity/crs/

4.2 基本設定の変更

設定ファイルを編集してModSecurityを有効化します。

sudo nano /etc/modsecurity/modsecurity.conf

以下の行を確認・変更します:

  • 検査モードの有効化 SecRuleEngine On
  • ログの詳細度 ログの記録を調整します(例: 詳細度を低くするには「SecAuditLogParts」を減らす)。SecAuditLogParts ABIJDEFHZ

4.3 OWASPルールセットの導入

OWASP Core Rule Set(CRS)は、広く利用されているModSecurityルールセットです。以下の手順で導入します。

  1. ルールセットをダウンロード:sudo apt install modsecurity-crs
  2. ルールを有効化:sudo ln -s /usr/share/modsecurity-crs /etc/modsecurity/crs sudo cp /usr/share/modsecurity-crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf
  3. Apacheの再起動:sudo systemctl restart apache2

5. WAFのチューニング方法

中の人の経験的にはこの章が結構大事です。なかなかに優秀なModSecurity君はいろんなアクセスをブロックしてくれちゃいます。それゆえに自身が作ったWebアプリケーションの動きを阻害するようなところまでブロックしてくることがあるんです。実体験としては画像のアップロードやデータベースへのデータの保存の時に発生していました。具体的な方法は下記に記載していますが、これらを回避するためにはざっくり

  1. ログを見て何がブロックされているかを確認する。
  2. 当該操作に該当するログを確認しそのidを控える。
  3. idを除外リストに追加する。
  4. サーバーを再起動する

の4ステップで解消できます。開発したサービスが機能するかどうか必ず確認しましょう。

5.1 ログの解析

ModSecurityのログを確認し、誤検知を把握します。

sudo tail -f /var/log/apache2/modsec_audit.log

この中に引っかかったルールが一覧で載っているのでidを確認します。厳密には引っかかっても問題なく動作するルールもあるので、表示されているすべてのidを一気に除外リストに追加するより、一件ずつ何をブロックしているのかを確認する方が安全でしょう。

5.2 ルールの無効化

続いて先ほどのログ解析で確認したidを除外リストに追加していきます。

以下の手順で特定のルールを無効にできます。

  1. ログからルールidを確認。例:[id "980130"]
  2. 無効化ルールを設定ファイルに追加:sudo nano /etc/modsecurity/crs/crs-setup.confに次の行を追加します:SecRuleRemoveById 980130
  3. Apacheを再起動:sudo systemctl restart apache2

この手順により除外するルールを選定し意図した機能を実現することができます。


6. トラフィックのホワイトリスト化

特定のIPアドレスやドメインからのトラフィックを許可するには、以下を設定します。

6.1 ホワイトリスト設定

modsecurity.conf に以下のルールを追加:

SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" "id:1000,phase:1,pass,nolog"

7. 性能最適化

WAFはトラフィックを解析するため、サーバーのパフォーマンスに影響を与える場合があります。

7.1 必要なルールのみ有効化

CRSの中から、自分のシステムに不要なルールを無効化します。

7.2 ログの制限

ログ記録を詳細にしすぎるとディスク容量を圧迫します。必要に応じてログ出力レベルを調整してください。


8. 運用と監視

  1. 定期的なログ確認
    攻撃のパターンを理解し、新たな脅威に対応します。
  2. ルールの更新
    CRSは定期的に更新されるため、最新のルールセットを反映させます。sudo apt update && sudo apt upgrade modsecurity-crs
  3. 自動化
    Fail2Banなどのツールと組み合わせて、攻撃元のIPアドレスをブロックすることも可能です。

まとめ

こんな感じでWAFって割と簡単に設定することができます。ただし上述のSaaS型やゲートウェイ型に比べると、自身でサーバーへのWAFのモジュールインストールが必要なため手間がかかるのと多少の知識が必要です。また、WAFを設定するウェブサーバーの台数が増えてくると、各々にこの記事の作業を施していく必要があるため手間もある程度かかります。とはいえ、初期費用をかけずに一級品のWAFを設定できるのModSecurityはなかなか使い勝手がいいですよ:)皆様ぜひWebアプリケーションのセキュリティについて一度考えてみてください!!