Ubuntu 16.04
 

mod_security を利用する
2016/06/16
 
mod_security モジュールを有効にして、Web Application Firewall (WAF) を設定します。
[1] mod_security をインストールします。
root@www:~#
apt-get -y install libapache2-mod-security2
[2] インストールすると security2 モジュールが有効な状態になりますが、ルール未設定の状態です。
ルールの追加は「IncludeOptional」で指定されたディレクトリ配下に配置した conf ファイルで可能となっています。
root@www:~#
grep -v -E '^?.#|^$' /etc/apache2/mods-available/security2.conf

# 追加設定は /etc/modsecurity/ 配下に conf を追加することで可能

<IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
</IfModule>

# 用意されている推奨設定ファイルをリネームにして有効化

root@www:~#
mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

root@www:~#
vi /etc/modsecurity/modsecurity.conf
# デフォルトは設定ルールにマッチした際に、ブロックせずにロギングのみ行う検知モード

# ブロックモードに変更するには「SecRuleEngine On」を指定

# -- Rule engine initialization ----------------------------------------------

# Enable ModSecurity, attaching it to every transaction. Use detection
# only to start with, because that minimises the chances of post-installation
# disruption.
#
SecRuleEngine DetectionOnly

.....
.....

# 187行目:ロギングする種類を選択
SecAuditLogParts ABJDEFHZ

### ロギングの種類概要
A: 監査ログヘッダー(必須項目)
B: リクエストヘッダー
C: リクエストボディ
D: 中間レスポンスヘッダーで予約済みだが未実装
E: 中間レスポンスボディ
F: 最終レスポンスヘッダー
G: 最終レスポンスボディで予約済みだが未実装
H: 監査ログの追加情報
I: 添付ファイルなどのマルチパートフォームデータを除くリクエストボディ
J: 添付ファイルなどのマルチパートフォームデータの情報
K: アクションにマッチした全てのルール情報
Z: 一つのレコードの最終行に付加される境界線(必須項目)
[3]
セキュリティルールの書式は以下のようになっています。
    ⇒ SecRule VARIABLES OPERATOR [ACTIONS]
各パラメータの種類は非常に多いため、詳細は以下の公式ドキュメントを参照ください。
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual
[4] セキュリティルールの設定例を以下に示します。
root@www:~#
vi /etc/modsecurity/rules-01.conf
# ルールにマッチした時のデフォルトアクションを定義

# レスポンスボディフェーズで処理を停止しログを記録して 406 を返す

SecDefaultAction "phase:2,deny,log,status:406"
# リクエスト URI に「etc/passwd」が含まれる

SecRule REQUEST_URI "etc/passwd" "id:'500001'"
# リクエスト URI に「../」が含まれる

SecRule REQUEST_URI "\.\./" "id:'500002'"
# 引数に「<SCRIPT」(小文字含む) が含まれる

SecRule ARGS "<[Ss][Cc][Rr][Ii][Pp][Tt]" "id:'500003'"
# 引数に「SELECT FROM」(小文字含む) が含まれる

SecRule ARGS "[Ss][Ee][Ll][Ee][Cc][Tt][[:space:]]+[Ff][Rr][Oo][Mm]" "id:'500004'"
root@www:~#
systemctl restart apache2
[5] 設定した文字列を含めてアクセスし、動作確認してください。
[6] mod_security のログは以下の場所に保管されています。パターンマッチした場合は以下のようなログが記録されます。
root@www:~#
cat /var/log/apache2/modsec_audit.log


--b679270f-A--
[17/Jun/2016:11:56:26 +0900] V2Nm2goAAB8AAAurUwAAAAAA 10.0.0.18 56003 10.0.0.31 80
--b679270f-B--
GET /?../../etc/passwd HTTP/1.1
Host: www.srv.world
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

--b679270f-F--
HTTP/1.1 406 Not Acceptable
Content-Length: 330
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
.....
.....
 
Tweet