Help us understand the problem. What is going on with this article?

【初心者向け】オープンソースのWAF「ModSecurity」をCentOSに構築した話

More than 3 years have passed since last update.

 LIGブログを見ていたところ、オープンソースのWAF「ModSecurity」が紹介されている記事を発見しました。
 前職で、ゲーム会社に常駐してWebサーバを構築していた際、Webサーバの前段にWAF(Web Application Firewall)を置いて、WebサイトやWebアプリケーションの脆弱性を悪用した攻撃を防御していたのを思い出し、勉強のために、ModSecurityをCentOSに構築してみました。

 なお、一般的には、インターネット側からみて、一番手前にFirewallがあり、二番目にIDS/IPS、三番目にWAFがあって、最後にWebサーバにたどり着く構成になります。
 それぞれが防御できるレイヤや攻撃が違うので、どれか1つを入れたからサイバー攻撃への対策は十分というわけではありません。それぞれの違いは、以下の通りです。

WAF
引用元:ネットワークエンジニアとして | http://www.infraexpert.com/study/security17.html

  • Firewall
    送信元/送信先のIPアドレスやポート番号等をもとにアクセス制限を行って、ネットワークレベルでの防御を行う。
    ポートスキャンを防ぐが、80番ポートや443番ポートへの通信など、正常な通信を装った攻撃には対処できない。

  • IDS/IPS
    プラットフォーム(OSやミドルウェア)の脆弱性を悪用した攻撃や、ファイル共有サービスへの攻撃等を、シグネチャに基づいたパターンマッチングにより検知し、防御を行う。
    DoS攻撃、Synフラッド攻撃等を防ぐが、Webアプリケーションの脆弱性を利用した攻撃には対処できない。

  • WAF
    Webアプリケーションの防御に特化しており、Webサーバ(ApacheやIIS等)やミドルウェア(Tomcat等)、言語(PHP等)の脆弱性の防御にも効果がある。
    アクセス元とWebサーバ間の通信(HTTP/HTTPS)内容を検査して、シグネチャに基づき攻撃を検出し、防御を行う。また、ホワイトリストによる検査、画面遷移の正当性チェックとhiddenパラメータやCookieの保護なども行う。
    SQLインジェクション、クロスサイトスクリプティング、OSコマンドインジェクション、パスワードリスト攻撃、パラメータ改ざん等の攻撃を防ぐ。

※シグネチャ…不正な通信、攻撃パターンをまとめた定義ファイルのこと

 ちなみに、WAFは設置形態により3種類に分類され、ModSecurityは「ホスト型WAF」となります。

ネットワーク型WAF
ネットワーク機器として配置するWAFです。
アプライアンス製品とソフトウェアとして提供されている製品があります。
リバースプロキシ、あるいはブリッジとして配置します。
サーバー台数が多い場合に、コストパフォーマンスが高くなります。

ホスト型WAF
Webサーバーにソフトウェアとして導入するタイプのWAFです。
Apacheモジュールとして提供されるWAFとして、オープンソースのModSecurityや、商用製品であるSiteGuardLiteがあります。
ホスト型のWAFはネットワーク機器が増えないため、レイテンシ(遅延時間)がほとんどないことがメリットです。
また、費用も低額なものが多いです。
デメリットとして、Webサーバー毎に導入するため、サーバー台数が多い場合にコスト高になる場合があります。
その場合は、ネットワーク型WAFの方が低コストになる場合があります。

SaaS型WAF
SaaS(Software as a Service)として提供されるWAFです。
ネットワーク型WAF(リバースプロキシ)を共用サービスとして提供するものです。
初期投資を抑えることができ、運用負荷も低いことが特徴です。

引用元:WAFについて | https://www.hash-c.co.jp/security/about-waf/

ModSecurityのインストール

 CentOSのバージョンは、以下の通り。

# cat /etc/redhat-release
 CentOS release 6.8 (Final)
# arch
 x86_64

 ModSecurityをインストールするためにepel リポジトリを追加します。

# yum install epel-release

 mod_security(ModSecurity本体)と、mod_security_crs(Core Rule Set)、mod_security_crs-extras(追加のCore Rule Set) をインストールします。
 Core Rule Setは、OWASPが開発した、Webサイトに対する攻撃を検知するためのルールを定義したものです。

# yum install mod_security mod_security_crs mod_security_crs-extras
# rpm -q mod_security mod_security_crs mod_security_crs-extras
mod_security-2.7.3-3.el6.x86_64
mod_security_crs-2.2.6-3.el6.noarch
mod_security_crs-extras-2.2.6-3.el6.noarch

  あわせて、Apacheもインストールします。

# yum install httpd
# rpm -q httpd
 httpd-2.2.15-54.el6.centos.x86_64
# chkconfig httpd on

ModSecurityの設定

# cp -p /etc/httpd/conf.d/mod_security.conf /etc/httpd/conf.d/mod_security.conf.org
# vi /etc/httpd/conf.d/mod_security.conf

 # Default recommended configuration
 # SecRuleEngine On ←コメントアウト
 SecRuleEngine DetectionOnly ←追記(攻撃を検知した場合、遮断せず、検知内容をログに出力する設定)

 Apacheを再起動します。

# service httpd restart

ModSecurityのログを確認

 ModSecurityのログの出力先は mod_security.confで定義されています。
 デフォルトの定義は、以下の通りです。

# less /etc/httpd/conf.d/mod_security.conf

 SecAuditLog /var/log/httpd/modsec_audit.log

 modsec_audit.logを見る事で、どのようなアクセスが検知されたかを確認する事ができます。

# less /var/log/httpd/modsec_audit.log

 偽陽性判定(ユーザの正当なリクエストを誤って攻撃と判定すること)された場合、auditログでid ( [id "XXXXXX"] ) を確認し、例外としてmod_security.confに除外設定を行います。
 例として、modsec_audit.log内の[id "960017"]は偽陽性として除外設定を行う場合、以下のように記述します。

# vi /etc/httpd/conf.d/mod_security.conf

 SecRuleRemoveById 960017 ←任意の場所に追記

 設定変更後は、Apacheを再起動します。

# service httpd restart

AuditConsoleの導入

 modsec_audit.logの内容は直感的にわかりづらく、解析に時間がかかります。そのため、ログの内容をGUIで閲覧できるツール「AuditConsole」を導入します。

AuditConsole は Mod Security が出力する audit イベントを管理する事ができるアプリケーションです。
J2EEアプリケーション(JavaのWebアプリケーション) として実装されており、Webブラウザからアクセスする事で、以下のような事が行えます。

  • audit イベントの収集、保存
    mlogc ( ModSecurity log collector ) を利用するか、直接 audit.log をインポートしてイベントを収集する事ができます。
    収集されたイベントはDBに保存されます。

  • GUIによるイベント情報の閲覧
    ログファイルを直接見るのに比べると情報のチェックはかなりやり易くなるはずです。
    保存されたイベントのフィルタリング等も随時行えます。

  • ビューの定義
    ユーザー毎にビュー定義が行えます。チェック・管理したいイベントを抽出するビューを定義する事で、特に定期的なチェックがやり易くなります。

  • イベントへのタグ付け
    イベントへのタグ付けが行えます。ブックマーク的に利用したり、偽陽性と思われるイベントに自分で定義したタグをつけておいて、後でタグでフィルタリングを行うといった使い方ができます。

  • ルールの定義
    ルール定義のための簡単な機能があります。
    これに関しては、まだ使っていないため大した事が言えませんが、フィルタリングルール(=チェックしたい情報を抽出するためのルール)に適合したイベントに対してアクションを行うためのルールを生成できるようです。

引用元:WAF(Web Application Firewall)でWebサイトを脆弱性から守る | https://www.agilegroup.co.jp/technote/mod_security.html

 AuditConsoleの導入には、JavaとTomcatが必要となります。
 また、AuditConsoleのダウンロードはこちらのサイトから行います。
 lastest releaseのリンクを確認し、最新版のAuditConsole-0.4.6-13.warをダウンロードします。

 Javaのバージョンに要注意!1.7を明示的に指定してインストールしないとはまります
 Javaのバージョンを特に指定せず、yumでインストールすると、1.8がインストールされます。

# java -version
 openjdk version "1.8.0_111"
 OpenJDK Runtime Environment (build 1.8.0_111-b15)
 OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)

 Webブラウザから、AuditConsole にアクセス(詳しくは後述)した際、500エラーとなり、JSPがコンパイルできませんというメッセージが表示されます(詳しくはこちらのサイトを参照)。
 そこで、Javaをyumでインストールする際は「yum install java-1.7.*」と明示的に1.7がインストールされるようにします。

# yum install tomcat

# tomcat version
 Server version: Apache Tomcat/7.0.70
 Server built:   Aug 5 2016 19:24:52 UTC
 Server number:  7.0.70.0
 OS Name:        Linux
 OS Version:     2.6.32-642.6.1.el6.x86_64
 Architecture:   amd64
 JVM Version:    1.7.0_111-mockbuild_2016_07_27_10_11-b00
 JVM Vendor:     Oracle Corporation

# java -version
 java version "1.7.0_111"
 OpenJDK Runtime Environment (rhel-2.6.7.2.el6_8-x86_64 u111-b01)
 OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)

# service tomcat start
# chkconfig tomcat on
# cd /var/lib/tomcat/webapps
# wget http://download.jwall.org/AuditConsole/current/AuditConsole-0.4.6-13.war

  AuditConsole-0.4.6-13.warが、/var/lib/tomcat/webappsに配置して、所有者・グループをtomcatにした時点で、自動的に展開されます。
  ちなみに、ダウンロード完了までに30分弱かかりました。

# ls -al /var/lib/tomcat/webapps
 drwxrwxr-x 2 tomcat tomcat     4096 11月  9 11:18 2016 .
 drwxr-xr-x 3 root   tomcat     4096 11月  8 15:59 2016 ..
 -rw-r--r-- 1 root   root   58205297  1月  5 20:15 2015 AuditConsole-0.4.6-13.war

# chown tomcat.tomcat AuditConsole-0.4.6-13.war

# ls -al /var/lib/tomcat/webapps
 drwxrwxr-x 3 tomcat tomcat     4096 11月  9 11:23 2016 .
 drwxr-xr-x 3 root   tomcat     4096 11月  8 15:59 2016 ..
 drwxr-xr-x 9 tomcat tomcat     4096 11月  9 11:23 2016 AuditConsole-0.4.6-13
 -rw-r--r-- 1 tomcat tomcat 58205297  1月  5 20:15 2015 AuditConsole-0.4.6-13.war

  次に、Webブラウザから、AuditConsole にアクセスして、ログイン画面を表示させます。
  URLは、http://ホスト名:8080/AuditConsole-0.4.6-13となります。
  初期状態では、LoginとPasswordともに、adminと入力すればログインできます。

  また、初回アクセス時は、以下のセットアップ処理画面が表示されます。

  1. Term of use & Copyright Notece ( 利用規約 & 著作権表示 )
   内容を確認し、問題がない場合、[I accept these terms.] にチェックを入れ、[Ok]をクリックします。

  2. Basic Settings
   以下の項目は、自動的に入力されています。
   Base Directory:「/usr/share/tomcat」
   Base URL:「http://ホスト名:8080/AuditConsole-0.4.6-13/」
   Base Directoryの内容を「/usr/share/tomcat/webapps/AuditConsole-0.4.6-13」に書き換えます。
   その後、[Save]ボタンをクリックして先へ進みます。

  3. Storage Engine
   そのまま[Save]ボタンをクリックします。

  前述の設定が正常に行えていた場合、AuditConsoleが利用可能になります。
  画面左上の「Dashboard」をクリックすると、ModSecurityのAuditログがGUIで確認できるようになります。
  確認方法は、こちらのサイトの「AuditConsole の利用」をご確認ください。

本番環境への導入前にテストを行う

 本番環境のWebサーバやWebアプリケージョンサーバへModSecurityを導入する場合、事前にテスト環境に導入し・試験を行うことをおすすめします。
 WAFがリクエストの内容を判定する場合、その判定は機械的に行われるため、誤検知の可能性があります。
 誤検知には、以下の2種類があります。テスト環境で、問題がないことを確認してから本番環境に導入しましょう。

  • 偽陽性
    ユーザからの正当なリクエストを誤って攻撃と判定すること。
    偽陽性があると、ユーザの正答なリクエストを遮断してしまい、Webサイトの閲覧やWebアプリケーションの利用ができない。

  • 偽陰性
    攻撃を攻撃と判定せずに見逃すこと。
    偽陰性があると、その見逃された攻撃に対する防御ができない。

 また、ModSecurityの動作を確認し、自社のWebサイトやWebアプリケーションに適した、ModSecurityやCore Rules Setの設定を見つける意味でも、テスト環境での導入・試験をおすすめします。

参考文献

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away