Apache2.0+mod_securityの設定(SuSE編)


いろいろ彷徨っていたら、Webサーバのセキュリティ向上の方法に「Webアプリケーションファイアウォール」(WAF)と言うものがあり、オープンソースのWAFとしてApacheの追加モジュール用に mod_securityというのがあることがわかりました。こちらに詳しく解説されているので、参考にされると良いでしょう。
実際インストールしてみると、SuSE はかなりApacheのインストールをカスタマイズしているので、参考ページのままではエラーがでるのでいくつか手作業が必要になります。
なお、Windowsでも問題なく動作するので、Windowsユーザの方も組み込んでみるといいでしょう。

■mod_security のインストール

mod_securityのインストールは、DSOモジュールとして組み込む形になります。Apacheのapxsでモジュールをコンパイルして、それを YaST で組み込むだけです。なお、apxsはデストリによって異なりますが、apache2-devel (RedHat系ならhttpd-devel)をインストールすることで使用できるようになりますので、YaST で検索してインストールしておいてください。こちらも参考にしてください。 SuSEはApacheのインストールパス等がかなり特殊なため、「-cia」オプションでコンパイルするとエラーだらけになりますので、自分でモジュールをインストール(「i」なし)し、confファイルへのLoadModule行の設定(「a」なし)はYaSTで行います。(RedHat系は問題はでないので「-cia」オプションでコンパイルするといいでしょう。)

  1. 以下のようにmod_securityのソースを貰ってきて、解凍してコンパイルし、できあがったモジュール(mod_security.so)をApacheのmoduleディレクトリにコピーする

    # wget http://www.modsecurity.org/download/mod_security-1.8.6.tar.gz
    # tar zxfv mod_security-1.8.6.tar.gz
    # cd mod_security-1.8.6/apache2
    # /usr/sbin/apxs2-prefork -c mod_security.c
    # cp .libs/mod_security.so /usr/lib/apache2/
    # cd /usr/lib/apache2-prefork
    # ln -s ../apache2/mod_security.so mod_security.so


  2. YaST コントロールセンタを起動し、「システム」の「/etc/sysconfig エディター」を起動する。

  3. 「設定のオプション」 で 「Network」 -> 「WWW」 -> 「Apache2」 と開き、「APACHE_MODULES」を選択して「設定」欄に「 security 」を既存のモジュールに続けて、スペース区切りで追加設定し、最後に 「完了」 ボタンを押す。

  4. 変更された変数が表示されるので、確認し 「了解」 ボタンを押す。

■ルールの作成

ルールに関しては、少し勉強しないと書けそうにないので、ここはおとなしくこちらを参考に設定することにしました。ただ、参照先のままではうまく行かないのと、多少チューニングしないと正規のコンテンツでも引っかかってしまうことがあるので、いきなり実機に投入するのは危険と思います。テスト機で試験してからのほうがいいでしょう。おやじの場合、CGIとPHP関係で結構な問題がでましたので、ルールを修正しました。

◆クロスサイトスクリプティング用ルール

参照先のルールをそのまま使わせてもらい、xss.rulesとしてmod_security用に作成したディレクトリ( /etc/apache2/modsec )に置きました。そのまま使用とは書きましたが、参照先にもあるようにBBS等で改行コードについては問題がでるので対処が必要です。なお、参照先のコンテンツをコピペすると、行頭が全角の空白になっているおりエラーになるので注意が必要です。

# mkdir /etc/apache2/modsec
# cd /etc/apache2/modsec
# vi xss.rules
[i]を押す。

# スクリプトを呼び出せるタグは禁止
SecFilter "<[[:space:]]*script.*>"
SecFilter "<[[:space:]]*style.*>"
SecFilter "<[[:space:]]*link.*>"
SecFilter "<[[:space:]]*body[[:space:]]*>"

# 疑似プロトコルは禁止
SecFilter "javascript:"
SecFilter "vbscript:"
SecFilter "about:"

# スクリプトを呼び出せるので禁止
SecFilter "expression\("
SecFilter "&{.*};"

# イベントハンドラは禁止
SecFilter "onError"
SecFilter "onUnload"
SecFilter "onBlur"
SecFilter "onFocus"
SecFilter "onClick"
SecFilter "onMouseOver"
SecFilter "onMouseOut"
SecFilter "onSubmit"
SecFilter "onReset"
SecFilter "onChange"
SecFilter "onSelect"
SecFilter "onAbort"

# CookieやBasic認証情報にアクセスできるので禁止
SecFilter "document\.cookie"
SecFilter "Microsoft\.XMLHTTP"

# 改行コードは禁止(ただし、TEXTAREAが存在する場合はこのままではダメ)
SecFilter "\x0d"
SecFilter "\x0a"

[Esc]、[:]、[w]、[q]で保存


◆snort用ルールの流用

mod_securityのサイトにもありますが、snort用のルールを流用できるようです。 snort2modsec.pl というツールと snortのルールを利用して作成しますが、最新のルールはweb-attackのルールが入っていない等がありましたので、snortrules-snapshot-2_2.tar.gzを落としてきました。また、変換したルールはxss.rulesと同様に、/etc/apache2/modsec 配下に置きました。こちらも、CGIやPHPで引っかかるものが結構出てくるので対処が必要です。なお、参照先のように同一ディレクトリ内で同一名称での変換はできませんので、注意してください。

# wget http://www.snort.org/dl/rules/snortrules-snapshot-2_2.tar.gz
# tar zxfv snortrules-snapshot-2_2.tar.gz
# cd rules
# wget http://www.modsecurity.org/documentation/snort2modsec.pl
# perl snort2modsec.pl web-attacks.rules > /etc/apache2/modsec/web-attacks.rules
# perl snort2modsec.pl web-cgi.rules > /etc/apache2/modsec/web-cgi.rules
# perl snort2modsec.pl web-client.rules > /etc/apache2/modsec/web-client.rules
# perl snort2modsec.pl web-coldfusion.rules > /etc/apache2/modsec/web-coldfusion.rules
# perl snort2modsec.pl web-frontpage.rules > /etc/apache2/modsec/web-frontpage.rules
# perl snort2modsec.pl web-iis.rules > /etc/apache2/modsec/web-iis.rules
# perl snort2modsec.pl web-misc.rules > /etc/apache2/modsec/web-misc.rules
# perl snort2modsec.pl web-php.rules > /etc/apache2/modsec/web-php.rules


◆Apacheの設定

こちらも参照先を参考にして上記で作成したルールの取り込みと、mod_securityの動作条件を下記のようにmodsec.confとして作成し、/etc/apache2/conf.d ディレクトリ配下に置き、Includeするようにしました。ルールのほうも同様にmodsec.confからIncludeしました。なお、参照先のコンテンツをコピペすると、行頭が全角の空白になっているおりエラーになるので注意が必要です。

# vi /etc/apache2/conf.d/modsec.conf
[i]を押す。

<IfModule mod_security.c>

 SecFilterEngine On
 SecFilterScanPOST On
 SecFilterSelective HTTP_Transfer-Encoding "!^$"
 SecFilterDefaultAction "deny,log,status:406"
 SecFilterCheckURLEncoding On

 SecFilterDebugLog /var/log/apache2/modsec_log
 SecFilterDebugLevel 1
 SecAuditEngine RelevantOnly
 SecAuditLog /var/log/apache2/audit_log

 Include /etc/apache2/modsec/xss.rules
 Include /etc/apache2/modsec/web-attacks.rules
 Include /etc/apache2/modsec/web-cgi.rules
 Include /etc/apache2/modsec/web-client.rules
 Include /etc/apache2/modsec/web-coldfusion.rules
 Include /etc/apache2/modsec/web-frontpage.rules
 Include /etc/apache2/modsec/web-iis.rules
 Include /etc/apache2/modsec/web-misc.rules
 Include /etc/apache2/modsec/web-php.rules

</IfModule>


[Esc]、[:]、[w]、[q]で保存


◆動作確認

以上で設定は完了したので、Apacheを再起動し動作確認をします。ルールはそのままではうまくいかないので、バックアップ機などでしっかり試験してから組み込まないとエラーが出まくり、運用に支障がでると思います。当然ながら、問題が出るのはCGIやPHP等のPOST系が非常に多いです。おやじが修正した一例を示しますので、各自の環境に合わせて修正してください。エッ!こんなものが?と思われるものが結構引っかかってしまうので、地道に設定していく必要があります。設定には正規表現が使えます。

  1. xss.rulesの改行コードは、掲示板や日記系のCGIでは記事内容に出てくるのでまず引っかかる。ユーザが多いと結構大変であり、CGI名かペイロードの特徴で正規のものは許可する。(赤字を追加して、正規のものは除外した。)

    [CGI名での除外方法]
    # wf_reg.cgi/wforum.cgi以外で改行コードがあったら規制する。
    SecFilterSelective THE_REQUEST "!(/wf_regi\.cgi|wforum\.cgi)" chain
    SecFilter "\x0d"

    SecFilterSelective THE_REQUEST "!(/wf_regi\.cgi|wforum\.cgi)" chain
    SecFilter "\x0a"

    [ペイロードの特徴での除外方法]
    # POST_PAYLOAD中に「message=」という記述があるもの以外で改行コードがあったら規制する。
    SecFilterSelective POST_PAYLOAD "!(message=)" chain
    SecFilter "\x0d"

    SecFilterSelective POST_PAYLOAD "!(message=)" chain
    SecFilter "\x0a"


  2. 同様におやじが引っかかった例をあげておく。上記と類似の方法で除外して行けばよい。あまりにも単純なものはコメントアウトしてもよいかもしれない。

    [web-php.rules内]
     SecFilter "page="

    [web-misc.rules内]
     SecFilter " "
     SecFilter ">"


Top Pageへ