ModSecurityとはオープンソースのWAF(Web Application Firewall)で、ApacheやNginxと連携して使用することができます。今回はCentOS/Apache の環境で、ModSecurityのインストールからブロックするルールの作成、ホワイトリストのルール作成、動作確認の方法までを紹介します。
ApacheとModSecurityのインストール
環境
- CentOS 7.2
- Apache 2.4.6
- ModSecurity 2.7.3
インストール
yum で http と ModSecurity のインストールを行います。
| 1 | # yum install httpd mod_security | 
インストール完了ですね。次は、ModSecurityの設定ファイルや使用するディレクトリ、ログファイルなどについて確認してみます。
設定ファイル、ディレクトリの確認
config系は /etc/httpd 配下をみてみます。
| 1 2 3 4 | # find /etc/httpd/ -name "*security*" /etc/httpd/conf.d/mod_security.conf /etc/httpd/conf.modules.d/10-mod_security.conf /etc/httpd/modsecurity.d | 
- mod_security.conf
 ModSecurityの基本的な設定ファイルです。mod_ssl をインストールしている場合は ssl.conf なども他のconfigも設置されていると思います。
- 10-mod_security.conf
 ModSecurityモジュールを有効にするためのファイルです。特に設定の必要はありません。
- modsecurity.d
 ルールを記載したファイルを設置するディレクトリです。正確には後述する「/etc/httpd/modsecurity.d/activated_rules/」へ設置します。
ログの確認
| 1 2 3 | # ll /var/log/httpd/mod* -rw-r-----. 1 root root 0  3月 31 18:00 /var/log/httpd/modsec_audit.log -rw-r-----. 1 root root 0  3月 31 18:00 /var/log/httpd/modsec_debug.log | 
- modsec_audit.log
 監査ログです。リクエストの内容やルールにマッチした場合などに記録されます。
- modsec_debug.log
 デバッグログです。
設定
ModSecurityの設定
今回は最低限の設定として、ModSecurityの動きを有効にするか否かの説明のみ記載します。
| 1 | SecRuleEngine On|DetectionOnly | 
有効にする場合は「On」、監査のみにしたい(リクエストをブロックしない)場合は「DetectionOnly」を記載します。デフォルトは「On」となっているため動作させるためだけであれば設定変更の必要はありません。
ModSecurityのルールの作成
ModSecurityをインストールしただけではルールは存在しませんのでリクエストをチェックするルールを作成します。
ルールの保存ディレクトリは以下です。
| 1 | /etc/httpd/modsecurity.d/activated_rules/ | 
作成するルール①
リクエストのURLが指定したものと合致したら405を返して拒否するルールを作成します。
| 1 2 3 | SecDefaultAction "phase:2,deny,log,status:405" SecRule REQUEST_URI "foo" "id:'1000'" SecRule REQUEST_URI "bar" "id:'1001'" | 
SecDefaultAction はルールにマッチした場合のデフォルトの動きを指定します。SecRule はルールを指定しますので、今回はリクエストのURLにfooまたはbarが含まれる場合 を示しています。
作成するルール②
ホワイトリストのルールとしてチェックをスルーするIPアドレスを指定するルールを作成します。
| 1 | SecRule REMOTE_ADDR "@ipMatch 172.16.10.100" id:2000,phase:1,t:none,log,allow | 
range指定も可能です。
| 1 | SecRule REMOTE_ADDR "@ipMatch 172.16.10.100/24" id:2000,phase:1,t:none,log,allow | 
複数のIPアドレスを指定する場合はカンマ(,)区切りで指定可能です。
| 1 | SecRule REMOTE_ADDR "@ipMatch 172.16.10.100,172.16.10.200" id:2000,phase:1,t:none,log,allow | 
また、基本的なWAFのルール一式がOWASPという団体から Core Rule Set という名称で配布されていますので、あらかじめインストールしておくこともできます。
| 1 | # yum install mod_security_crs | 
Apache起動
起動および自動起動の設定をしておきます。/foo/bar/は作成済みとして割愛します。
| 1 2 | # systemctl start httpd # systemctl enable httpd | 
確認
では、実際にWebブラウザでアクセスして確認してみます。
| 1 | http://HOSTNAME/foo/bar/ | 
ClientのIPアドレスが「172.16.10.100」の場合はアクセス可能、それ以外は405応答で拒否されれば正常に動いています。
まとめ
ModSecurityの設定は偽陽性の確認が大変ですが、あらかじめチェックをスルーして良いIPアドレスがわかっている場合は指定しておくと運用が楽になるかもしれません。
以上です。この記事がお役に立ちましたらシェアして頂けるとうれしいです。
