約 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 です。
↓のページを参考にさせていただきました、感謝。
ログには以下の通り記録されています。
「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化をやっていきたいと思います!
また、↓のページには、Raspberry Pi 4をnextcloudサーバーとしてクラウドストレージとして動かすまでを各ステップ順を追って説明しています!
こちらも合わせてどうぞ!
Comments