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のインストール
今回の環境
- CentOS 6.10
- Apache 2.4.41
- ModSecurity 2.9.3
- owasp-modsecurity-crs 3.2.0
- modsec-sdbm-util (Commit:e02b4a10b327aadd1a97b15cd32980d6a251bf3d)
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の仕組みと設定方法などを紹介する予定です。
- https://www.feistyduck.com/books/modsecurity-handbook/gettingStarted.html ↩
- こちらやこちらによると、CRSプロジェクトは2.x系推しのようです。 ↩
- CVE-2019-10097 ↩
- sanitiseArgなどを利用して、特定のヘッダやパラメータを*(アスタリスク)に置換する機能はありますが、その設定が漏れていたとしてもすぐに問題にならないように、念の為の配慮です。 ↩