無料の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 }
ディスカッション
コメント一覧
まだ、コメントがありません