Raspberry Pi 4にWAFのmod-securityをインストールする

mod-security

約 14 分で読めます。

Raspberry Pi 4にWAFであるmod-securityを入れました!

セキュリティ対策はアンチウィルス以外にもあるよね。
nextcloudとかはWebアプリだけど、これらの対策はないのかな?

こんな疑問を解決します。

WAFとは?

WAFとはウェブアプリケーションファイアウォールの略称です。
攻撃者からのWebアプリケーションへの攻撃を防火壁のごとく防ぎます。

これに対し「ファイアウォール」はOSI参照モデルのネットワーク層以下で動作し、特定のポートへのアクセスを許可・遮断する機能を持つことが多いです。
自宅サーバーの場合、ルーターがファイアウォールの役割を担っていると思っていいと思います。

見て分かる通り、WAFとファイアウォールは防御する部分が異なります。
そのため、WAFを入れたからファイアウォールは入れなくていい、などというものではなく、それぞれを併用する必要があります。

mod-securityをインストール

apt installでサクッと入れられます。

$ sudo apt install libapache2-mod-security2

入れただけの状態ですと、apache2に組み込まれていないため動きません。
組み込みを有効にしましょう。

$ sudo a2enmod security2
$ sudo systemctl restart apache2

# 有効になったことが確認できる
$ a2query -m
security2 (enabled by site administrator)

apache2に組み込まれましたが、mod-security2自体の設定が無効なため動きません。
有効にしましょう。

# modsecurityが用意している推奨設定ファイルを使う
$ sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
$ sudo nvim /etc/modsecurity/modsecurity.conf

# /etc/modsecurity/modsecurity.confを↓の通り修正する
# SecRuleEngine DetectionOnly
SecRuleEngine On

# 修正が終わったらapache2を再起動する
$ sudo systemctl restart apache2

ここでmod-security2が動作するようになったはずです。
攻撃と取られるURLでアクセスしてみましょう。

アクセスが拒否されたことがわかりますね!

このときアクセスしたURLは http://192.168.1.16/?union+select です。
↓のページを参考にさせていただきました、感謝。

Apache WAF mod_security の導入 - Qiita
想定環境 CentOS 6 または 7 # rpm -q mod_security mod_security_crs mod_security-2.7.3-5.el6.x86_64 mod_security_crs-2.2.6...

ログには以下の通り記録されています。
「Access denied」とありますね!

$ tail -f /var/log/apache2/error.log
[Wed Nov 18 13:13:17.485727 2020] [:error] [pid 20869:tid 2919232544] [client 192.168.1.8:44226] [client 192.168.1.8] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 8)"] [severity "CRITICAL"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "192.168.1.16"] [uri "/"] [unique_id "X7SfXZW9OgYf2AIHcCQObAAAAAc"]

この時点でWAFの導入は終わりました。
ですが、今はmod-security2デフォルトのルールファイルです。
従い、本当は攻撃ではないのに攻撃と解釈する、いわゆる偽陽性のパターンが起こりえます。

当面はテスト環境で稼働させ、サービスが今まで通り動作するか確認することをオススメします。

2020/12/09追記
実際にデフォルトのルールだとnextcloudのある通常動作を異常と検出してしまいます。
具体的には以下の通りログに記録されています。

$ tail /var/log/apache2/error.log
[Tue Dec 08 14:18:04.596661 2020] [:error] [pid 25071] [client 192.168.1.8:43522] [client 192.168.1.8] ModSecurity: Warning. Match of "within %{tx.allowed_methods}" against "REQUEST_METHOD" required. [file "/usr/share/modsecurity-crs/rules/REQUEST-911-METHOD-ENFORCEMENT.conf"] [line "46"] [id "911100"] [msg "Method is not allowed by policy"] [data "PUT"] [severity "CRITICAL"] [ver "OWASP_CRS/3.1.0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [tag "OWASP_CRS/POLICY/METHOD_NOT_ALLOWED"] [tag "WASCTC/WASC-15"] [tag "OWASP_TOP_10/A6"] [tag "OWASP_AppSensor/RE1"] [tag "PCI/12.1"] [hostname "www.yasufumi-yokoyama.gq"] [uri "/nextcloud/index.php/apps/user_status/heartbeat"] [unique_id "X8@LHDWoYALJA@sakO@q5gAAAAQ"]
[Tue Dec 08 14:18:04.601432 2020] [:error] [pid 25095] [client 192.168.1.8:43526] [client 192.168.1.8] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [severity "CRITICAL"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "www.yasufumi-yokoyama.gq"] [uri "/nextcloud/index.php/apps/user_status/heartbeat"] [unique_id "X8@LHEh6WBypLbI3fh27zQAAAAY"]

やたら長いですが、気にすべき部分は以下。

Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score.

アノマリー検知でスコアが5以上になったので403でForbiddenにしたよ、と読めますね。
ということは、スコアが上がる要因があったはず。

ここにありました。

Warning. Match of "within %{tx.allowed_methods}" against "REQUEST_METHOD" required.

ユーザーからのREQUEST_METHODで引っかかったようです。

allowed_methodsはと言うと、ここに記載があります。
 GET HEAD POST OPTIONSのみ許可している模様。

$ grep -r allowed_methods /usr/share/modsecurity-crs/
/usr/share/modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf: setvar:'tx.allowed_methods=GET HEAD POST OPTIONS'"

今回ユーザーがnextcloudにアクセスしたときに使ったのはPUTの様子。
 前記error.logに [data “PUT”] という記載がある。

確かにPUT自体は一般的に危険なメソッドなので使わないほうがいいですね。
 攻撃者が悪意あるファイルを置いたり、既存ファイルを上書きできてしまうので。

ですが、今回のPUTはnextcloudの動作であって攻撃者の操作ではありませんし、nextcloudへのアクセスは二要素認証を行うため、許可することによるリスクが大きくないと判断できます。

ということで、nextcloudへのPUTアクセスのみは許可するようにしましょう。
 apache全体にPUTを許可するのはやはり危ないのでやめておきます。
以下の通りやればOKです。
ID:91100が先ほどのREQUEST_METHODをチェックするルールですので、nextcloud以下へのアクセス時はこのルールを除外するようにしました。

$ sudo vim /etc/modsecurity/nextcloud.conf

# 以下nextcloud.confの中身
<Directory /var/www/html/nextcloud/>
    SecRuleRemoveById 911100
</Directory>

# 設定反映させるためapache2を再起動
$ sudo systemctl restart apache2

ちなみに↑のファイル名はnextcloud.confでなくても何でもいいです。
理由は以下の通り記載があるからです。

$ sudo cat /etc/apache2/mods-enabled/security2.conf
<IfModule security2_module>
    IncludeOptional /etc/modsecurity/*.conf
</IfModule>

これで先ほどのWarning/Errorは起こらなくなったと思います!

終わりに

いかがでしたか。

これで、
 ・アンチウィルスの導入
 ・WAFの導入
が終わりました。

次回はhttps化をやっていきたいと思います!

Comments

タイトルとURLをコピーしました