ApacheのWAFモジュールであるmod_securityを導入します。
- AWS Lightsailで早々とインストールしていた
- 各種不審なIPアドレスを弾くための盾
として機能しているにもかかわらず文書化していなかったので、Web Arenaでの検証を機に文章に残します。
環境
- Ubuntu 24.04 (20.04でも一応動くとは思います)
- Apache 2.4
※ パッケージ管理にaptitudeを用いています。必要に応じてaptに読み替えてください。
さっくりとした手順
- mod_securityのインストールを行います。
- mod_securityの設定を行います。
- Apacheのバーチャルサイトにmod_securityを組み込みます。
- 設定を反映して動作を確認します。
mod_securityのインストールを行います。
sudo aptitude update
sudo aptitude install libapache2-mod-security2
sudo apache2ctl -M |grep security
security2_module (shared)
と表示されていることを確認します。
ModSecurityの設定
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
推奨ファイルをそのまま設定ファイルとして書き換えます。
OWASP Core Rule Set (CRS)のインストールと設定
cd /usr/share/modsecurity-crs && pwd
sudo git clone https://github.com/coreruleset/coreruleset.git
sudo mv /usr/share/modsecurity-crs/coreruleset/crs-setup.conf.example /usr/share/modsecurity-crs/coreruleset/crs-setup.conf
mod_securityモジュールにCRSを読み込む設定を追記
cd /etc/apache2/mods-available/ && pwd
sudo cp -pi security2.conf /path/to/backup/directory/security2.conf.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
diff -u /path/to/backup/directory/security2.conf.$(date +%Y%m%d) security2.conf
エラーがなければバックアップは成功です。
/etc/apache2/mods-available/security2.conf
を、以下の差分になるように教義・信仰に沿ったエディタで編集します。(要root権限)
- </IfModule>
+ # Include OWASP ModSecurity CRS rules if installed
+ IncludeOptional /usr/share/modsecurity-crs/*.load
+</IfModule>
sudo apache2ctl configtest
Syntax OK
を確認します。
sudo systemctl restart apache2.service
systemctl status apache2.service
active (running)
を確認します。
Apacheのバーチャルサイト編集
稼働済みのApacheバーチャルサイトの設定ファイルをいじります。バックアップ確認は入念に行ってください。
cd /etc/apache2/sites-available && pwd
sudo cp -pi your_site.conf /path/to/backup/directory/your_site.conf.$(date +%Y%m%d)
.confファイルやバックアップディレクトリは自分の環境を指定します。
diff -u /path/to/backup/directory/your_site.conf.$(date +%Y%m%d) your_site.conf
エラーがなければバックアップは成功です。
/etc/apache2/sites-available/your_site.conf
を、以下の差分になるように教義・信仰に沿ったエディタで編集します。(要root権限)
# Mod Security
## ModSecurity有効化
SecRuleEngine On
## ModSecurity検知モード
### 検知モードで動かす場合はSecRuleEngine Onをコメントアウトしてこちらを有効化します
#SecRuleEngine DetectionOnly
## ファイルのアップロードをできるようにします。
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
## テスト用の検知パラメータを付け加えます。
SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
diff -u /path/to/backup/directory/your_site.conf.$(date +%Y%m%d) your_site.conf
+# Mod Security
+
+## ModSecurity有効化
+SecRuleEngine On
+## ModSecurity検知モード
+### 検知モードで動かす場合はSecRuleEngine Onをコメントアウトしてこちらを有効化します
+#SecRuleEngine DetectionOnly
+
+## ファイルのアップロードをできるようにします。
+SecRequestBodyInMemoryLimit 524288000
+SecRequestBodyLimit 524288000
+
+## テスト用の検知パラメータを付け加えます。
+ SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
+
sudo apache2ctl configtest
Syntax OK
を確認します。
sudo systemctl restart apache2.service
systemctl status apache2.service
active (running)
を確認します。
mod_security動作確認
- ブラウザで、上記の設定を行ったWebサイトにアクセスし、閲覧できることを確認します。
- アドレスバーの末尾に
?modsecparam=test
を追加してアクセスします。
のように、アクセスできないことを確認します。
また、サーバでも
sudo cat /path/to/sites_log/directory/sites_error.log
※ログの格納場所やログの名前は自分の環境に合わせます。
を開き、
ModSecurity: Access denied with code 403 (phase 2). String match "test" at ARGS:modsecparam. [file "/etc/apache2/sites-enabled/your_site.conf"] [line "53"] [id "4321"] [msg "ModSecurity test rule has triggered"] [hostname "host_address"] [uri "/"] [unique_id "xxxxxxx"]
のように、エラーが発生していることを確認します。
備考
WordPress、Redmine等のWebアプリは自身の操作によって「不審なアクセス」として遮断することが極めてよくあります。(偽陽性)
そのため、テストを行った後は
## ModSecurity有効化
#SecRuleEngine On
## ModSecurity検知モード
### 検知モードで動かす場合はSecRuleEngine Onをコメントアウトしてこちらを有効化します
SecRuleEngine DetectionOnly
として検知モードとして動かした方が良いでしょう。