無料のWAF(Web Application Firewall)のModSecurityを導入

ModSecurityについて

ModSecurityは、オープンソースで開発され無料で利用できるWAF(Web Application Firewall)です。

WAPはApache・Nagios等のWebサーバーからHTTPの通信を監視して悪意のあるリクエストや攻撃パターンを検知して、それらをブロックします。ModSecurityは、事前に定義されたルールを使用して、攻撃を特定し、ブロックすることができます。
ModSecurityは、SQLインジェクション、クロスサイトスクリプティング、OSコマンドインジェクション、ファイルシステムトラバーサル、不正なHTTPメソッド、およびその他の多数の攻撃からWebアプリケーションを保護することができます。

今回は、このModSecurityをCentOS Stream 9 でApacheが稼働しているサーバーに導入します。WebサーバーのコンテンツはWordpressでブログと、NextCloudがインストールされています

ModSecurity のインストール

ModSecurityのインストールは、dnf コマンドでインストールできます

# dnfコマンドで「mod_security 」,「mod_security_crs」をインストールします
$ sudo dnf install mod_security mod_security_crs

# インストールしたらApacheを再起動して設定を読み直してmod_securityを有効にします
$ sudo systemctl restart httpd

「mod_security」が有効になれば、「/var/log/httpd/modsec_audit.log」にログが吐き出されているとそちらで確認できます

$ sudo tail /var/log/httpd/modsec_audit.log

mod_security の初期設定の変更

上記のインストール作業で、「mod_security_crs」もインストールしています。
「mod_security_crs」は、ModSecurity Core Rule Set (CRS) と呼ばれる、ModSecurity用のルールセットです。

様々なルールがインストールされるので、使用される環境には不要なルールもインストールされます。このルールは「/etc/httpd/conf.d/mod_security.conf」で下記のディレクトリがインクルードされています

$ sudo ls /etc/httpd/modsecurity.d/activated_rules
crawlers-user-agents.data                        REQUEST-903.9006-XENFORO-EXCLUSION-RULES.conf         REQUEST-949-BLOCKING-EVALUATION.conf
iis-errors.data                                  REQUEST-905-COMMON-EXCEPTIONS.conf                    RESPONSE-950-DATA-LEAKAGES.conf
java-classes.data                                REQUEST-910-IP-REPUTATION.conf                        RESPONSE-951-DATA-LEAKAGES-SQL.conf
java-code-leakages.data                          REQUEST-911-METHOD-ENFORCEMENT.conf                   RESPONSE-952-DATA-LEAKAGES-JAVA.conf
java-errors.data                                 REQUEST-912-DOS-PROTECTION.conf                       RESPONSE-953-DATA-LEAKAGES-PHP.conf
lfi-os-files.data                                REQUEST-913-SCANNER-DETECTION.conf                    RESPONSE-954-DATA-LEAKAGES-IIS.conf
php-config-directives.data                       REQUEST-920-PROTOCOL-ENFORCEMENT.conf                 RESPONSE-959-BLOCKING-EVALUATION.conf
php-errors.data                                  REQUEST-921-PROTOCOL-ATTACK.conf                      RESPONSE-980-CORRELATION.conf
php-function-names-933150.data                   REQUEST-922-MULTIPART-ATTACK.conf                     RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
php-function-names-933151.data                   REQUEST-930-APPLICATION-ATTACK-LFI.conf               restricted-files.data
php-variables.data                               REQUEST-931-APPLICATION-ATTACK-RFI.conf               restricted-upload.data
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf      REQUEST-932-APPLICATION-ATTACK-RCE.conf               scanners-headers.data
REQUEST-901-INITIALIZATION.conf                  REQUEST-933-APPLICATION-ATTACK-PHP.conf               scanners-urls.data
REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf     REQUEST-934-APPLICATION-ATTACK-NODEJS.conf            scanners-user-agents.data
REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf  REQUEST-941-APPLICATION-ATTACK-XSS.conf               scripting-user-agents.data
REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf  REQUEST-942-APPLICATION-ATTACK-SQLI.conf              sql-errors.data
REQUEST-903.9004-DOKUWIKI-EXCLUSION-RULES.conf   REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf  unix-shell.data
REQUEST-903.9005-CPANEL-EXCLUSION-RULES.conf     REQUEST-944-APPLICATION-ATTACK-JAVA.conf              windows-powershell-commands.data

mod_securityの設定は、以下のように変更します

  • 不要なルールは必要とせずに必要なルールのみ有効
  • デフォルトでは、ファイルのアップロードが1MBに制限され、NextCloudがエラーとなるのでファイル制限を2Gに変更します
$ sudo vim /etc/httpd/conf.d/mod_security.conf

# ファイルのアップロード時の容量制限を 1MBから2GBに変更します
#  SecRequestBodyLimit 13107200
#  SecRequestBodyNoFilesLimit 131072
SecRequestBodyLimit 2147483648
SecRequestBodyNoFilesLimit 2147483648

# インクルードするファイルを指定(modsecurity.d/activated_rules/*.confをコメントアウトして必要なもののみに)
# ModSecurity Core Rules Set and Local configuration
 IncludeOptional modsecurity.d/*.conf
#  IncludeOptional modsecurity.d/activated_rules/*.conf
 Include modsecurity.d/activated_rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
 Include modsecurity.d/activated_rules/REQUEST-912-DOS-PROTECTION.conf
 Include modsecurity.d/activated_rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
 Include modsecurity.d/activated_rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
 Include modsecurity.d/activated_rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf

設定を変更したら、Apacheを再起動します

$ sudo systemctl restart httpd

今回ロードしているルールは以下のようなルールです。

  • REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf:WordPressの特定の機能やリクエストを除外するためのルールを提供します。たとえば、XML-RPCの除外、/wp-admin/ ページの制限、およびwp-login.phpからのログイン制限などが含まれます。
  • REQUEST-912-DOS-PROTECTION.conf:Denial-of-Service (DoS)攻撃を検出するためのルールを提供します。たとえば、単一のIPアドレスから多数のリクエストが送信された場合、またはサーバーに多数の同時接続が試行された場合などが含まれます。
  • REQUEST-941-APPLICATION-ATTACK-XSS.conf:クロスサイトスクリプティング(XSS)攻撃を検出するためのルールを提供します。
  • REQUEST-942-APPLICATION-ATTACK-SQLI.conf:SQLインジェクション攻撃を検出するためのルールを提供します。
  • RESPONSE-951-DATA-LEAKAGES-SQL.conf:データ漏洩を検出するためのルールを提供します。たとえば、SQL文に含まれる個人情報やクレジットカード番号などの機密情報を検出することができます。

mod_security のログについて

mod_securityのログは、「/var/log/httpd/modsec_audit.log」にログが出力されます。
サイトのアクセス状況によりますが、このログですが不正アクセス・攻撃を検知してログが出力されるので、すごく大きなファイルになりますので、ログローテーションで古いログは圧縮するなどしてログファイルが肥大化するのを防ぎます。

出力されるログの内容も、ログのフォーマットを変更して出力内容を少し制限します。
標準では「SecAuditLogParts」のディレクティブで「ABIJDEFHZ」のフォーマットで出力されます。「BDEFHZ」に変更して出力内容を少し少なくしています

  • A: リモートIPアドレス
  • B: リクエストのヘッダー
  • I: 実行されたID
  • J: 事前に定義されたルールID
  • D: リクエストからレスポンスまでの時間
  • E: エラーの種類
  • F: ファイル名
  • H: リクエストヘッダーのみ
  • Z: 生成されたID
# LogFormatを少し変更して、出力される内容を簡素にします
$ sudo vim /etc/httpd/conf.d/mod_security.conf

# SecAuditLogParts ABIJDEFHZ
 SecAuditLogParts BDEFHZ

# 設定変更したら、Apacheの再起動
$ sudo systemctl restart httpd

また、デフォルトの設定ではmod_securityのログですが、Apacheのerror.log と modsec_audit.logのどちらにも出力されているので、modsec_audit.logのみします

# ログ出力を、modsec_audit.logのみに出力するようにします
$ sudo vim /etc/httpd/modsecurity.d/crs-setup.conf

#SecDefaultAction "phase:1,log,auditlog,pass"
#SecDefaultAction "phase:2,log,auditlog,pass"

SecDefaultAction "phase:1,nolog,auditlog,pass"
SecDefaultAction "phase:2,nolog,auditlog,pass"

# 設定変更したら、Apacheの再起動
$ sudo systemctl restart httpd

ログローテーションは、以下のように変更しました。
ログは日時でローテーションされ、ログの保存期間は30日で古いのは圧縮するように変更しました

$ sudo vim /etc/logrotate.d/httpd 
/etc/httpd/logs/modsec_*.log {
  daily
  rotate 30
  missingok
  notifempty
  compress
  dateext
  sharedscripts
  postrotate
     /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
  endscript
}

 

 

 

LinuxCentOS 9,CentOS Stream 9

Posted by admin