読者の皆様こんにちは。今日はUbuntuへのWAFのインストール&調整方法、具体的にはModSecurityでのお話をお伝えしていこうと思います。ウェブアプリケーションのセキュリティのために”WAF”と検索すると、わんさか有料サービスが出てきますが、開発や運用の規模によっては”セキュリティは必要だけど初っ端から大金を叩くわけにはいかない”というケースも多いでしょう。今回扱うModSecurityはオープンソースなのでその辺の心配はご無用です!!それでは本文へ!!
冒頭からWAFって何度も言ってますが、”WAFってなんやねん”って思っておられる読者の方も一定数いそうなのでまずはそこの説明から。WAFは”Web Application Firewal“の略でウェブアプリケーションへの攻撃を防ぐために重要なセキュリティ対策です。まぁつまり、”パソコンでお使いのウイルス対策ソフトのすごい版”くらいのイメージで見ていただければわかりやすいかと思います。もう少し詳細にお話しするとWAFは、ウェブアプリケーションへのリクエストを解析し、悪意あるトラフィックを検出してブロックする役割を果たします。またSQLインジェクションやクロスサイトスクリプティング(XSS)といった一般的な攻撃から、ウェブアプリケーションを保護します。
先ほどの章でWAFとは何かをご理解いただけたかと思いますが、そうなると有料版や無料版など様々なものがたくさんあるのも同時にご理解いただけると思います。今回利用するWAFは”ModSecurity”というオープンソースものです。WAFには設置形態によりSaas型、ゲートウェイ型、ホスト型の3つに区分されますが、ModSecurityはホスト型という種類になり、対象のWebサーバーへインストールして利用します。
ModSecurityの詳細な機能についてはまだまだお伝えしていきたいところではありますが、今回はインストールから利用までを扱う記事になるので、詳細はModSecurityをご覧ください。
流石にWAFの導入を検討されている読者の皆様に向けては必要ないかもしれませんが、今回はサーバーにApacheをインストールするところから話を進めていきますね。一応ね!?
sudo apt update sudo apt install apache2
sudo apt install libapache2-mod-security2
sudo a2enmod security2 sudo systemctl restart apache2
ModSecurityはデフォルト設定でも基本的な攻撃を防ぐことができますが、チューニングを行うことで、環境に合わせた最適な防御が可能です。
/etc/modsecurity/modsecurity.conf
/etc/modsecurity/crs/
設定ファイルを編集してModSecurityを有効化します。
sudo nano /etc/modsecurity/modsecurity.conf
以下の行を確認・変更します:
SecRuleEngine On
SecAuditLogParts ABIJDEFHZ
OWASP Core Rule Set(CRS)は、広く利用されているModSecurityルールセットです。以下の手順で導入します。
sudo apt install modsecurity-crs
sudo ln -s /usr/share/modsecurity-crs /etc/modsecurity/crs sudo cp /usr/share/modsecurity-crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf
sudo systemctl restart apache2
中の人の経験的にはこの章が結構大事です。なかなかに優秀なModSecurity君はいろんなアクセスをブロックしてくれちゃいます。それゆえに自身が作ったWebアプリケーションの動きを阻害するようなところまでブロックしてくることがあるんです。実体験としては画像のアップロードやデータベースへのデータの保存の時に発生していました。具体的な方法は下記に記載していますが、これらを回避するためにはざっくり
の4ステップで解消できます。開発したサービスが機能するかどうか必ず確認しましょう。
ModSecurityのログを確認し、誤検知を把握します。
sudo tail -f /var/log/apache2/modsec_audit.log
この中に引っかかったルールが一覧で載っているのでidを確認します。厳密には引っかかっても問題なく動作するルールもあるので、表示されているすべてのidを一気に除外リストに追加するより、一件ずつ何をブロックしているのかを確認する方が安全でしょう。
続いて先ほどのログ解析で確認したidを除外リストに追加していきます。
以下の手順で特定のルールを無効にできます。
例:[id "980130"]
sudo nano /etc/modsecurity/crs/crs-setup.conf
に次の行を追加します:SecRuleRemoveById 980130
sudo systemctl restart apache2
この手順により除外するルールを選定し意図した機能を実現することができます。
特定のIPアドレスやドメインからのトラフィックを許可するには、以下を設定します。
modsecurity.conf
に以下のルールを追加:
SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" "id:1000,phase:1,pass,nolog"
WAFはトラフィックを解析するため、サーバーのパフォーマンスに影響を与える場合があります。
CRSの中から、自分のシステムに不要なルールを無効化します。
ログ記録を詳細にしすぎるとディスク容量を圧迫します。必要に応じてログ出力レベルを調整してください。
sudo apt update && sudo apt upgrade modsecurity-crs
こんな感じでWAFって割と簡単に設定することができます。ただし上述のSaaS型やゲートウェイ型に比べると、自身でサーバーへのWAFのモジュールインストールが必要なため手間がかかるのと多少の知識が必要です。また、WAFを設定するウェブサーバーの台数が増えてくると、各々にこの記事の作業を施していく必要があるため手間もある程度かかります。とはいえ、初期費用をかけずに一級品のWAFを設定できるのModSecurityはなかなか使い勝手がいいですよ:)皆様ぜひWebアプリケーションのセキュリティについて一度考えてみてください!!