RACCOON TECH BLOG

株式会社ラクーンホールディングスのエンジニア/デザイナーから技術情報をはじめ、世の中のためになることや社内のことなどを発信してます。

OSSなWAF、ModSecurityの導入①【インストール編】

こんにちは。インフラ担当のいせです。

ここ最近、弊社のサイトへサイバー攻撃と思わしき不審なアクセスが増えてきました。
大半はOSSな脆弱性検査ツールなどを悪用した、いわゆるスクリプトキディによるもののようです。
それらはあまり高度なものではなく、今のところは情報漏えいなど大きな被害はありませんが、このまま放置していてはいずれ致命的な脆弱性が発見されてしまわないとも限りません。

そこで弊社ではApacheのモジュールとしてOSSで公開されているModSecuriyの導入を進めています。
このブログでは今回から数回に渡って、ModSecurityのしくみ・導入・設定・運用について解説していきます。

今回はModSeucirtyの簡単な紹介とソースからインストールするところまでをご紹介します。

ModSecurityとは

ModSecurityはApacheのモジュールとして公開されているOSSのWAFです。ModSecurityはいわゆるシグネチャ型のWAFですが、このタイプではシグネチャの精度と定期的なアップデートが検知精度に大きく関わってきます。
ModSecurityでは、OWASPのプロジェクトとして公開されているOWASP ModSecurity Core Rule Set (CRS)を利用することができます。
CRSはおおよそ半年に1回程度アップデートがリリースされており、有名なCDNやCloudサービスでも利用されているなど実績が高いものになっています。

リファレンスマニュアルについて

今回参考にさせていただいたマニュアル等は以下のとおりです。

特にModSecurity Handbookは分厚い洋書でとっつきにくさはありますが、インストールや設定方法がかなり詳細に説明されているのでオススメです。前半の100ページ程は無料で公開されています。1

ModSecurityのインストール

今回の環境

ModSecutiyの現時点での最新版は3.0.3ですが、今回は2.x系の最新版を利用しました。
CRSプロジェクトとしてのリファレンスバージョンはまだ2.9系であったり2、3.x系はまだリファレンスが整備されていなかったりすることが理由です。
現在でも2.x系は継続してメンテナンスが行われているようです。

また、弊社ではApacheの前段にロードバランサーが入っているため、Apacheから見える送信元IPアドレスはロードバランサーに割り当てられたものとなってしまいます。X-Forwarded-Forヘッダに記載される本当のクライアントのIPアドレスをModSecurityに認識させるためにmod_remoteipを使用する必要がありますが、最近このモジュールで脆弱性が見つかったので3、この問題がFIX済みの2.4.41以降を使用するようにしてください。

modsec-sdbm-utilはModSeucirtyがブラックリストに登録したIPアドレスなどの情報が格納されるPersistent Storageを参照するためのツールです。このツールはなくてもModSecurityは動作しますが、テストや運用上あった方が便利なので一緒にインストールします。

インストール手順

ModSecurityをインストールする

1. 依存パッケージをインストールします。

対象のパッケージはCentOS6.10の場合、EPELにありました。

yum install epel-release
yum install ssdeep-devel --enablerepo=epel
2. ソースをダウンロードして解凍します。
wget https://www.modsecurity.org/tarball/2.9.3/modsecurity-2.9.3.tar.gz
tar xzvf modsecurity-2.9.3.tar.gz
cd modsecurity-2.9.3
3. ビルドとインストールを行います。

--with-apxs, --with-apr, --with-apuはパスが通っている場合は不要かもしれません。
これらのオプションにはそれぞれ、ApacheのAPXS, APR, APR-Utilのパスを指定します。
APR, APR-UtilはApacheとは別に手動でビルド・インストールした場合は別のパスになっているかもしれません。

./configure --with-apxs=<Apacheインストール先のパス>/bin/apxs --with-apr=<Apacheインストール先のパス>/bin/apr-1-config --with-apu=<Apacheインストール先のパス>/bin/apu-1-config --prefix=<Apacheインストール先のパス>
make
make install
4. 必要なディレクトリを作成する

以下のようなディレクトリを作成します。
パスについては必ずしも下記のように設定する必要はなく、各組織のポリシーなどで管理しやすい場所を選定してください。
ちなみに下記のパスはModSecurity Handbookに記載のパスになります。

パス 所有者 パーミッション 用途
/usr/local/modsecurity/var/tmp/ apache:apache drwxr-x--- HTTPリクエストが大きすぎてメモリに乗り切らなかったときなどにSwap的に利用される。
SecTmpDirディレクティブでパスを指定する。
/usr/local/modsecurity/var/data/ apache:apache drwxr-x--- Persistent Storageの保存場所。
SecDataDirディレクティブでパスを指定する。
/usr/local/modsecurity/var/audit/ root:root drwx------ 攻撃と判断されたHTTPリクエスト・レスポンスが保存されるAudit logの保存場所。
SecAuditLogディレクティブでパスを指定する。

Audit logは場合によっては正常な通信を誤って攻撃とみなしてログを残してしまうケースが考えられますが、その際にCookieやパスワードなどの機密情報が保存される可能性があるため、パーミッションを厳しく制限しています。4
Apacheは一般的に親プロセスはrootで起動し、実際にリクエストを処理する子プロセスはapacheユーザーなどで動いています。
SecAuditLogTypeディレクティブで、Concurrentを指定すると子プロセスの実行ユーザーとしてAudit logへ書き込みが行われますが、この設定をSerialとすることでrootで書き込みが行われます。今回は後者を採用したため、ディレクトリの所有者はrootとしました。

CRSをダウンロードする

CRSはバイナリではなく、ただの設定ファイルになっているのでダウンロードします。
今回はApacheをインストールしたディレクトリのconf/配下にmodsecurityという名前で格納しました。

wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz
tar xzvf v3.2.0.tar.gz
mv owasp-modsecurity-crs-3.2.0 <Apacheインストール先のパス>/conf/modsecurity

modsec-sdbm-utilをインストールする

1. ビルドに必要なツールをインストールします。
yum install cmake
2. ソースをダウンロードして解凍します。
wget https://github.com/SpiderLabs/modsec-sdbm-util/archive/master.zip
unzip master.zip
cd modsec-sdbm-util-master/
3. ビルドとインストールを行います。
./autogen.sh
./configure --with-apr=<Apacheインストール先のパス>/bin/apr-1-config --with-apu=<Apacheインストール先のパス>/bin/apu-1-config
make
make install

まとめ

今回はModSecurityのインストール方法までを紹介しました。
次回はModSecurityの仕組みと設定方法などを紹介する予定です。


  1. https://www.feistyduck.com/books/modsecurity-handbook/gettingStarted.html 
  2. こちらこちらによると、CRSプロジェクトは2.x系推しのようです。 
  3. CVE-2019-10097 
  4. sanitiseArgなどを利用して、特定のヘッダやパラメータを*(アスタリスク)に置換する機能はありますが、その設定が漏れていたとしてもすぐに問題にならないように、念の為の配慮です。 
一緒にラクーンのサービスを作りませんか? 採用情報を詳しく見る

関連記事

運営会社:株式会社ラクーンホールディングス(c)2000 RACCOON HOLDINGS, Inc