このチュートリアルでは、 ModSecurityをインストールして使用する方法を説明します。 Debian/Ubuntuサーバー上のNginxを使用します。 ModSecurityは、最もよく知られているオープンソースのWebアプリケーションファイアウォールです。 (WAF)、SQLインジェクション、クロスサイトスクリプティング、ローカルファイルインクルードなどの幅広いレイヤー7(HTTP)攻撃に対して、Webアプリケーション(WordPress、Nextcloud、Ghostなど)を包括的に保護します。
>
注 :このチュートリアルは、Debian 10、Ubuntu 18.04、Ubuntu 20.04、Ubuntu 20.10を含む、現在のすべてのDebianおよびUbuntuバージョンで機能します。
Webアプリケーションは本質的に安全ではありません。 WordPressの管理者であれば、ハッカーがWordPressのプラグインやテーマの脆弱性を悪用しているというニュースをたまに聞くでしょう。特に更新を受け取らない古いアプリケーションがある場合は、WebサーバーにWAFをデプロイすることが不可欠です。 ModSecurityは、もともと2002年にIvanRistićによって作成され、現在はTrustwaveSpiderLabsによって保守されています。これは、世界で最も広く展開されているWAFであり、100万を超えるWebサイトで使用されています。最も広く使用されているホスティングコントロールパネルであるcPanelには、WAFとしてModSecurityが含まれています。
iptables、UFW、Firewalldなどの他のホストベースのファイアウォールを聞いたことがあるかもしれません。違いは、OSIモデルのレイヤー3と4で動作し、IPアドレスとポート番号に基づいてアクションを実行することです。 ModSecurity、または一般にWebアプリケーションファイアウォールは、HTTPトラフィック(OSIモデルのレイヤー7)に焦点を当てることに特化しており、HTTP要求と応答のコンテンツに基づいてアクションを実行します。
ModSecurity 3
ModSecurityは、もともとApacheWebサーバー用に設計されました。バージョン3.0より前のNginxで動作する可能性がありましたが、パフォーマンスが低下していました。 ModSecurity 3.0(別名 libmodsecurity )は2017年にリリースされました。これは、Nginxでネイティブに動作する最初のバージョンであるため、特にNginxユーザーにとって画期的なリリースです。 ModSecurity 3の注意点は、以前のバージョン(2.9)のようにまだすべての機能を備えていないことですが、新しいリリースごとに不足している機能の一部が追加されます。
ステップ1:最新バージョンのNginxをDebian/Ubuntuにインストールする
ModSecurityは動的モジュールとしてNginxと統合されているため、Nginx自体をコンパイルせずに個々のモジュールのソースコードをコンパイルできます。
Nginxバイナリは、-with-compat
を使用してコンパイルする必要があります 引数。これにより、動的モジュールが既存のNginxバイナリとバイナリ互換になります。ただし、デフォルトのDebian / Ubuntuリポジトリから出荷されたすべてのNginxバイナリが、-with-compat
でコンパイルされているわけではありません。 口論。作業を簡単にするために、 ondrej / nginx-mainline
から最新バージョンのNginxをインストールできます。 PPA。Debian開発者によって管理されています。
注 :nginx.orgリポジトリは、最新バージョンのNginxも提供します。ただし、 ondrej / nginx-mainline
PPAは、Brotliモジュールなど、役立つと思われる追加の動的モジュールを提供します。
Ubuntu
Ubuntu 16.04、18.04、20.04、または20.10を使用している場合は、次のコマンドを実行して最新バージョンのNginxをインストールします。
sudo add-apt-repository ppa:ondrej/nginx-mainline -y sudo apt update sudo apt install nginx-core nginx-common nginx nginx-full
インストールプロセス中に、パッケージディストリビューターがメイン構成ファイルの更新バージョンを出荷したことを通知する場合があります。 n
を押すことをお勧めします 現在のバージョンを保持します。後でいつでも違いを調べることができます。
デフォルトでは、バイナリリポジトリのみが有効になっています。また、Nginxソースコードをダウンロードするには、ソースコードリポジトリを有効にする必要があります。 Nginxメインラインリポジトリファイルを編集します。
sudo nano /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list
#deb-src
で始まる行を見つけます 。
# deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main
#
を削除します このソースコードリポジトリを有効にする文字。
deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main
ファイルを保存して閉じます。次に、リポジトリインデックスを更新します。
sudo apt update
Debian
Debian10またはDebian11を使用している場合は、次のコマンドを実行して最新バージョンのNginxをインストールします。
curl -sSL https://packages.sury.org/nginx-mainline/README.txt | sudo bash -x sudo apt update sudo apt install nginx-core nginx-common nginx nginx-full
インストールプロセス中に、パッケージディストリビューターがメイン構成ファイルの更新バージョンを出荷したことを通知する場合があります。 n
を押すことをお勧めします 現在のバージョンを保持します。後でいつでも違いを調べることができます。
デフォルトでは、バイナリリポジトリのみが有効になっています。また、Nginxソースコードをダウンロードするには、ソースコードリポジトリを有効にする必要があります。 Nginxメインラインリポジトリファイルを編集します。
sudo nano /etc/apt/sources.list.d/nginx-mainline.list
Nginxバイナリリポジトリを有効にする1行が見つかります。次の行を追加して、Debian10でNginxソースコードリポジトリを有効にします。
deb-src https://packages.sury.org/nginx-mainline/ buster main
Debian 11を使用している場合は、代わりに次の行を追加してください。
deb-src https://packages.sury.org/nginx-mainline/ bullseye main
ファイルを保存して閉じます。次に、リポジトリインデックスを更新します。
sudo apt update
Nginx構成引数の確認
次に、次のコマンドを使用してNginxのconfigure引数を確認します。
sudo nginx -V
PPA内のすべてのNginxバイナリは、-with-compat
でコンパイルされます。 引数。
ステップ2:Nginxソースパッケージをダウンロードする
Nginx自体をコンパイルする必要はありませんが、ModSecurity動的モジュールをコンパイルするにはNginxソースコードパッケージが必要です。次のコマンドを実行して、 nginx
を作成します / usr / local / src /
の下のディレクトリ Nginxソースコードパッケージを保存します。 username
を置き換えます 実際のユーザー名で。
sudo chown username:username /usr/local/src/ -R mkdir -p /usr/local/src/nginx
Nginxソースディレクトリにcdします。
cd /usr/local/src/nginx/
以下のコマンドを使用してNginxソースパッケージをダウンロードします:
sudo apt install dpkg-dev apt source nginx
次の警告メッセージが表示された場合は、無視しても問題ありません。
W: Download is performed unsandboxed as root as file 'nginx_1.19.5.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
ダウンロードしたソースコードファイルを確認してください。
ls
サンプル出力:
nginx-1.19.5 nginx_1.19.5-3+ubuntu20.04.1+deb.sury.org+1.debian.tar.xz nginx_1.19.5-3+ubuntu20.04.1+deb.sury.org+1.dsc nginx_1.19.5.orig.tar.gz
ソースコードのバージョンがNginxバイナリバージョンと同じであることを確認してください( sudo nginx -v
。
ステップ3:libmodsecurity3をインストールする
libmodsecurrity WebアプリケーションのHTTPフィルタリングを実際に実行するModSecurityライブラリです。 Debian10およびUbuntu20.04、20.10では、 sudo apt install libmodsecurity3
を使用してインストールできます。 、ただし、ソースからコンパイルすることをお勧めします。
libmodsecurityをコンパイルするには 、最初にGithubからソースコードのクローンを作成します。
sudo apt install git git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/ cd /usr/local/src/ModSecurity/
ビルドの依存関係をインストールします。
sudo apt install gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libpcre3 libpcre3-dev libxml2 libxml2-dev libcurl4 libgeoip-dev libyajl-dev doxygen
必要なサブモジュールをインストールします。
git submodule init git submodule update
ビルド環境を構成します。
./build.sh ./configure
次のエラーが表示された場合は、無視してかまいません。
fatal: No names found, cannot describe anything.
次のコマンドでソースコードをコンパイルします。デフォルトでは、 make
1つのCPUコアのみを使用します。サーバーに4つのCPUコアがあるので、4つのジョブを指定します( -j4
) make
の場合 コンパイルプロセスをスピードアップします。 4
を変更します 独自のCPUコア数に。
make -j4
make
の後 コマンドはエラーなしで終了しました。バイナリをインストールしてください。
sudo make install
/ usr / local / modsecurity /
の下にインストールされます ディレクトリ。
コンパイルエラーのトラブルシューティング
エラー#1
make
の実行中に次のエラーが表示された場合 コマンド、サーバーのRAMが不足している可能性があります。
g++: internal compiler error: Killed (program cc1plus)
/ var / log / syslog
の次の行 ファイルはサーバーのメモリが不足していることを示しているため、サーバーの仕様をアップグレードすることを検討してください。
または、スワップスペースを作成して、メモリ不足の問題を解決することもできます。ただし、これは一時的な手段としてのみ使用する必要があります。 SSDサーバーでスワップスペースを使用すると、システムパフォーマンスに悪影響を与える可能性があります。
エラー#2
ModSecurityのコンパイル時に次のエラーが表示された場合
utils/geo_lookup.cc: In member function ‘bool modsecurity::Utils::GeoLookup::lookup(const string&, modsecurity::Transaction*, std::function<bool(int, const std::__cxx11::basic_string<char>&)>) const’: utils/geo_lookup.cc:124:32: error: invalid conversion from ‘const MMDB_s*’ to ‘MMDB_s*’ [-fpermissive] r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
古いバージョンのlibmaxminddb-dev
をインストールしたことが原因である可能性があります 。このパッケージは削除できます。
sudo apt remove libmaxminddb-dev
そして、 libgeoip-dev
をインストールします 、これは libmaxminddb-dev
の代替です 。
sudo apt install libgeoip-dev
次に、ModSecurityを再コンパイルします。
make clean ./configure make -j4
バイナリをインストールします。
sudo make install
ステップ4:ModSecurityv3Nginxコネクタのソースコードをダウンロードしてコンパイルする
ModSecurityNginxコネクタ リンクlibmodsecurity NginxWebサーバーに接続します。 ModSecurity v3 NginxConnectorGitリポジトリのクローンを作成します。
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
Nginxソースディレクトリにいることを確認してください。
cd /usr/local/src/nginx/nginx-1.19.5/
Nginxのビルド依存関係をインストールします。
sudo apt build-dep nginx sudo apt install uuid-dev
次に、次のコマンドで環境を構成します。 Nginx自体はコンパイルしませんが、ModSecurityNginxコネクタをコンパイルします。 モジュールのみ。 -with-compat
フラグを立てると、モジュールは既存のNginxバイナリとバイナリ互換になります。
./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
ModSecurityNginxコネクタを構築します モジュール。
make modules
モジュールはobjs/ ngx_http_modsecurity_module.so
として保存されます 。 / usr / share / nginx / modules /
にコピーします ディレクトリ。
sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/
ステップ5:ModSecurityv3Nginxコネクタモジュールをロードする
メインのNginx構成ファイルを編集します。
sudo nano /etc/nginx/nginx.conf
ファイルの先頭に次の行を追加します。
load_module modules/ngx_http_modsecurity_module.so;
また、 http {...}
に次の2行を追加します セクションがあるため、ModSecurityはすべてのNginx仮想ホストで有効になります。
modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf;
ファイルを保存して閉じます。次に、 / etc / nginx / modsec /
を作成します ModSecurity構成を保存するディレクトリ
sudo mkdir /etc/nginx/modsec/
次に、ModSecurity構成ファイルをコピーします。
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
ファイルを編集します。
sudo nano /etc/nginx/modsec/modsecurity.conf
次の行を見つけます。
SecRuleEngine DetectionOnly
この構成は、ModSecurityにHTTPトランザクションをログに記録するように指示しますが、攻撃が検出された場合はアクションを実行しません。次のように変更すると、ModSecurityがWeb攻撃を検出してブロックします。
SecRuleEngine On
次に、次の行(224行目)を見つけます。これは、ModSecurityに監査ログに含める必要のある情報を示しています。
SecAuditLogParts ABIJDEFHZ
ただし、デフォルト設定は間違っています。後でModSecurityログを理解する方法を説明すると、その理由がわかります。設定を次のように変更する必要があります。
SecAuditLogParts ABCEFHJKZ
コーディングWebサイトがある場合は、応答本文の検査を無効にすることをお勧めします。無効にしないと、大量のコードコンテンツを含むWebページをロードするだけで403の禁止エラーが発生する可能性があります。
SecResponseBodyAccess Off
ファイルを保存して閉じます。次に、 /etc/nginx/modsec/main.conf
を作成します ファイル。
sudo nano /etc/nginx/modsec/main.conf
次の行を追加して、 /etc/nginx/modsec/modsecurity.conf
を含めます ファイル。
Include /etc/nginx/modsec/modsecurity.conf
ファイルを保存して閉じます。 Unicodeマッピングファイルもコピーする必要があります。
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
次に、Nginx構成をテストします。
sudo nginx -t
テストが成功したら、Nginxを再起動します。
sudo systemctl restart nginx
ステップ6:OWASPコアルールセットを有効にする
ModSecurityでWebアプリケーションを保護するには、悪意のあるアクターを検出してブロックするルールを定義する必要があります。初心者の場合は、既存のルールセットをインストールすることをお勧めします。そうすれば、すぐに始めて、将来の要点を学ぶことができます。 ModSecurityにはいくつかの無料のルールセットがあります。 OWASPコアルールセット (CRS)は、ModSecurityで使用される標準のルールセットです。
- これは無料で、コミュニティが管理し、最も広く使用されているルールセットであり、ModSecurityの販売済みのデフォルト構成を提供します。
- SQLインジェクション(SQLi)、クロスサイトスクリプティング(XSS)など、一般的な攻撃ベクトルを阻止するためのルールが含まれています。
- ProjectHoneypotと統合できます。
- ボットとスキャナーを検出するためのルールも含まれています。
- 誤検知がほとんどないように、広範囲にわたる露出によって調整されています。
GitHubから最新のOWASPCRSをダウンロードします。
wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
ファイルを抽出します。
tar xvf v3.3.0.tar.gz
ディレクトリを/etc / nginx / modsec /
に移動します 。
sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/
crs-setup.conf.example
の名前を変更します ファイル。
sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
次に、メインの構成ファイルを編集します。
sudo nano /etc/nginx/modsec/main.conf
次の2行を追加すると、NginxにCRS構成ファイルと個々のルールが含まれるようになります。
Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
ファイルを保存して閉じます。次に、Nginx構成をテストします。
sudo nginx -t
テストが成功したら、Nginxを再起動します。
sudo systemctl restart nginx
ステップ7:OWASPCRSの仕組みを学ぶ
CRSの動作に関する優れたドキュメントを提供するCRS構成ファイルを見てみましょう。
sudo nano /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
OWASPCRSは2つのモードで実行できることがわかります。
- 自己完結型モード 。これは、CRSv2.xで使用される従来のモードです。 HTTPリクエストがルールに一致する場合、ModSecurityはHTTPリクエストをすぐにブロックし、残りのルールの評価を停止します。
- 異常スコアリングモード 。これは、CRSv3.xで使用されるデフォルトのモードです。 ModSecurityはすべてのルールに対してHTTPリクエストをチェックし、一致する各ルールにスコアを追加します。しきい値に達すると、HTTPリクエストは攻撃と見なされ、ブロックされます。インバウンドリクエストのデフォルトスコアは5、アウトバウンドレスポンスのデフォルトスコアは4です。
異常スコアリングモードで実行している場合、4つのパラノイアレベルがあります。
- パラノイアレベル1(デフォルト)
- パラノイアレベル2
- パラノイアレベル3
- パラノイアレベル4
パラノイアレベルが上がるたびに、CRSは追加のルールを有効にして、より高いレベルのセキュリティを提供します。ただし、パラノイアレベルが高いと、誤警報が原因で一部の正当なトラフィックがブロックされる可能性も高くなります。
これらは、CRSを使用する前に理解する必要がある2つの基本的な概念です。これで、ファイルを閉じることができます。個々のCRSルールは/etc/nginx/modsec/coreruleset-3.3.0/rules/
に保存されます ディレクトリ。一致するルールごとに、異常スコアが増加します。
ステップ8:テスト
ModSecurityが機能しているかどうかを確認するために、自分のWebサイトで単純なSQLインジェクション攻撃を開始できます。 (許可なく他の人のWebサイトでセキュリティテストを行うことは違法であることに注意してください。)Webブラウザに次のURLを入力します。
https://yourdomain.com/?id=3 or 'a'='a'
ModSecurityが正しく機能している場合、NginxWebサーバーは403forbiddenエラーメッセージを返す必要があります。
Firefoxブラウザは403エラーメッセージを表示できない場合があります。 Ctrl + Shift + I
を押すことができます 開発者ツールウィンドウを開き、 network
を選択します タブ。次に、 F5
を押します Webページをリロードします。 Firefoxに403エラーコードが表示されるはずです。
ModSecurityがDetectionOnly
で実行されている場合 モードの場合、このSQLインジェクション攻撃はブロックされません。
ステップ9:ModSecurityログを理解する
ModSecurityログを分析することが重要です。これにより、Webアプリケーションに向けられた攻撃の種類を把握し、脅威の攻撃者から防御するためのより適切なアクションを実行できます。 ModSecurityには主に2種類のログがあります:
- デバッグログ:デフォルトで無効になっています。
- 監査ログ:
/var/log/modsec_audit.log
ModSecurity監査ログを理解するには、ModSecurityの5つの処理フェーズを知る必要があります。これらは次のとおりです。
- フェーズ1:リクエストヘッダーを検査する
- フェーズ2:リクエスト本文を検査する
- フェーズ3:応答ヘッダーを検査する
- フェーズ4:応答本体を検査する
- フェーズ5:アクション(悪意のあるリクエストのログ記録/ブロック)
これらも2種類のログファイルです。
- シリアル :すべてのログに対して1つのファイル。これがデフォルトです。
- 同時 :ロギング用の複数のファイル。これにより、書き込みパフォーマンスが向上します。 ModSecurityを有効にした後、Webページの速度が低下していることに気付いた場合は、同時ロギングタイプを使用することを選択できます。
ログ内のイベントはいくつかのセクションに分かれています。
- セクションA:監査ログヘッダー
- セクションB:リクエストヘッダー
- セクションC:リクエスト本文
- セクションD:予約済み
- セクションE:中間応答機関
- セクションF:最終応答ヘッダー
- セクションG:予約済み
- セクションH:監査ログトレーラー
- セクションI:ファイルを除外するコンパクトなリクエスト本文の代替案
- セクションJ:アップロードされたファイルに関する情報
- セクションK:一致した順に、イベントによって一致したすべてのルール
- セクションZ:最終境界
トラフィックの多いWebサイトを実行している場合、ModSecurity監査ログがすぐに大きくなりすぎる可能性があるため、ModSecurity監査ログのログローテーションを構成する必要があります。 ModSecurityのログローテーション構成ファイルを作成します。
sudo nano /etc/logrotate.d/modsecurity
このファイルに次の行を追加します。
/var/log/modsec_audit.log { rotate 14 daily missingok compress delaycompress notifempty }
これにより、ログファイルが毎日ローテーションされます(
ModSecurityログが空の場合は、おそらくNginxを再起動する必要があります。
sudo systemctl restart nginx
ステップ10:誤検知の処理
ModSecurityは汎用のWebアプリケーションファイアウォールであり、特定のWebアプリケーション用に設計されたものではありません。 OWASPコアルールセットも、特定のアプリケーションを考慮していない一般的なルールセットであるため、ModSecurityとOWASPCRSを有効にした後に誤検知が発生する可能性があります。 CRSのパラノイアレベルを上げると、誤検知が増えます。
たとえば、デフォルトでは、CRSは sudo
を入力するようなUnixコマンドの挿入を禁止しています。 私のブログではかなり一般的なWebページで。誤検知を排除するには、CRSにルールの除外を追加する必要があります。
アプリケーション固有のルールの除外
OWASP CRSに付属している、ビルド済みのアプリケーション固有の除外がいくつかあります。 crs-setup.conf
を編集します ファイル。
sudo nano /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
アプリケーション固有のルールの除外に移動します セクションを作成し、次の行を見つけます。
#SecAction \ # "id:900130,\ # phase:1,\ # nolog,\ # pass,\ # t:none,\ # setvar:tx.crs_exclusions_cpanel=1,\ # setvar:tx.crs_exclusions_drupal=1,\ # setvar:tx.crs_exclusions_dokuwiki=1,\ # setvar:tx.crs_exclusions_nextcloud=1,\ # setvar:tx.crs_exclusions_wordpress=1,\ # setvar:tx.crs_exclusions_xenforo=1"
たとえば、WordPressの除外を有効にする場合は、上記の行を次のように変更する必要があります。構文に注意してください。 t:none、\
の間にコメントがあってはなりません およびsetvar:tx.crs_exclusions_wordpress =1 "
。 (バックスラッシュ \
最後の文字は、次の行が現在の行の続きであることを示します。)
SecAction \ "id:900130,\ phase:1,\ nolog,\ pass,\ t:none,\ setvar:tx.crs_exclusions_wordpress=1" # setvar:tx.crs_exclusions_cpanel=1,\ # setvar:tx.crs_exclusions_drupal=1,\ # setvar:tx.crs_exclusions_dokuwiki=1,\ # setvar:tx.crs_exclusions_nextcloud=1,\ # setvar:tx.crs_exclusions_xenforo=1"
ファイルを保存して閉じます。次に、Nginx構成をテストします。
sudo nginx -t
テストが成功した場合は、変更を有効にするためにNginxをリロードします。
sudo systemctl reload nginx
同じサーバーに(WordPress、Nextcloud、Drupalなど)などの複数のアプリケーションがインストールされている場合、上記のルールの除外がすべてのアプリケーションに適用されることに注意してください。セキュリティリスクを最小限に抑えるには、1つのアプリケーションに対してのみルールの除外を有効にする必要があります。これを行うには、 /etc/nginx/modsec/coreruleset-3.3.0/rules/
に移動します ディレクトリ。
cd /etc/nginx/modsec/coreruleset-3.3.0/rules
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS
の名前を変更します ファイル。
sudo mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
次に、このファイルを編集します。
sudo nano REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
このファイルの最後に次の行を追加します。 WordPressがblog.yourdomain.com
を使用している場合 サブドメインと訪問者のブラウザから送信されるリクエストヘッダーにこのサブドメインが含まれている場合、ModSecurityはWordPressのルール除外を適用します。
SecRule REQUEST_HEADERS:Host "@streq blog.yourdomain.com" "id:1000,phase:1,setvar:tx.crs_exclusions_wordpress=1"
同じサーバーにNextcloudをインストールしている場合は、このファイルに次の行を追加することもできます。そのため、訪問者がNextcloudサブドメインにアクセスしている場合、ModSecurityはNextcloudルールの除外を適用します。
SecRule REQUEST_HEADERS:Host "@streq nextcloud.yourdomain.com" "id:1001,phase:1,setvar:tx.crs_exclusions_nextcloud=1"
このファイルを保存して閉じます。次に、Nginx構成をテストします。
sudo nginx -t
テストが成功した場合は、変更を有効にするためにNginxをリロードします。
sudo systemctl reload nginx
カスタムルールの除外
事前に作成されたアプリケーション固有のルールの除外を有効にしても、すべての誤検知が排除されない場合があります。その場合は、ModSecurity監査ログ( /var/log/modsec_audit.log
)を調べる必要があります )、誤検知の原因となったルールを確認し、 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
にカスタムルールの除外を追加します ファイル。
監査ログのセクションHは、どのルールが一致するかを示します。たとえば、
を使用しようとすると コメントフォームのHTML、ModSecurityは私のコメントをブロックします。次のログは、HTTPリクエストが ...
REQUEST-941-APPLICATION-ATTACK-XSS.conf
のルールに一致したことを示しています。 (527行目)。ルールIDは941310です。リクエストURIは/wp-comments-post.php
です。 。
不正な形式のエンコーディングXSSフィルター攻撃として検出されます。ただし、ユーザーが
を使用できるようにしたい および< ...
pre> ...
コメントフォームのHTMLタグなので、ルールの除外を作成しました。 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
の下部に次の行を追加します ファイル。
SecRule REQUEST_URI "@streq /wp-comments-post.php" "id:1002,phase:1,ctl:ruleRemoveById=941310"
この行は、リクエストURIが /wp-comments-post.php
の場合にModSecurityに通知します。 、ルールID941310を適用しないでください。ファイルを保存して閉じます。次に、Nginx構成をテストします。
sudo nginx -t
テストが成功したら、Nginxをリロードします。
sudo systemctl reload nginx
誤検知が複数のルールIDに一致する場合は、次のように1行でルールの除外を追加できます。
SecRule REQUEST_URI "@streq /wp-admin/post.php" "id:1003,phase:1,ctl:ruleRemoveById=941160,ctl:ruleRemoveById=941310,ctl:ruleRemoveById=942100"
注 :OWASP CRSでレベル1のルールを無効にしすぎると、Webサイトがハッキングされやすくなるため、お勧めしません。自分が何をしているのかがわかっている場合にのみ、ルールを無効にしてください。
IPホワイトリスト
自分のIPアドレスに対してModSecurityを無効にし、他のすべてのIPアドレスに対しては有効のままにする場合は、 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
に次のカスタムルールを追加します。 ファイル。 12.34.56.78
を置き換えます 実際のIPアドレスを使用します。
SecRule REMOTE_ADDR "^12\.34\.56\.78" "id:1004,phase:1,allow,ctl:ruleEngine=off"
サブネットをホワイトリストに登録するには、次の構文を使用します。これにより、 10.10.10.0 / 24
がホワイトリストに登録されます。 ネットワーク。
SecRule REMOTE_ADDR "^10\.10\.10.*" "id:1005,phase:1,allow,ctl:ruleEngine=off"
ファイルを保存して閉じます。次に、Nginx構成をテストします。
sudo nginx -t
テストが成功した場合は、変更を有効にするためにNginxを再起動します。
sudo systemctl restart nginx
チェーンルール
Nginxに複数の仮想ホストがある場合は、特定の仮想ホストのIPアドレスをホワイトリストに登録することをお勧めします。次のように2つのルールを連鎖させる必要があります:
SecRule REMOTE_ADDR "^12\.34\.56\.78" "id:1004,phase:1,allow,ctl:ruleEngine=off,chain" SecRule REQUEST_HEADERS:Host "@streq nextcloud.yourdomain.com" "t:none"
チェーンコード> 最初のルールの最後にあるキーワードは、
ruleEngine =off
次のルールの条件も真である場合にのみ、アクションが実行されます。
(オプション)ModSecurityをProjectHoneypotと統合する
Project Honeypotは、既知の悪意のあるIPアドレスのリストを保持しており、一般に無料で入手できます。 ModSecurityは、Project Honeypotと統合して、ProjectHoneypotリストのIPアドレスをブロックできます。
Project Honeypotを使用すると、新しい訪問者に対してWebサイトの速度が低下することに注意してください。これは、Webサーバーが新しい訪問者に応答を送信する前にProjectHoneypotにクエリを送信する必要があるためです。ただし、IPレピュテーションデータがWebサーバーにキャッシュされると、パフォーマンスへの影響はごくわずかになります。
Project Honeypotを使用するには、まずそのWebサイトで無料のアカウントを作成します。次に、アカウントダッシュボードに移動し、 get one
をクリックします。 HTTPブラックリストのアクセスキーを要求するためのリンク。
次に、 crs-setup.conf
を編集します ファイル。
sudo nano /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
次の行を見つけます。
#SecHttpBlKey XXXXXXXXXXXXXXXXX #SecAction "id:900500,\ # phase:1,\ # nolog,\ # pass,\ # t:none,\ # setvar:tx.block_search_ip=1,\ # setvar:tx.block_suspicious_ip=1,\ # setvar:tx.block_harvester_ip=1,\ # setvar:tx.block_spammer_ip=1"
最初の#
を削除します 文字をコメント解除し、ProjectHoneypotから取得したHTTPBLAPIキーを追加します。
block_search_ip
に注意してください 0
に設定する必要があります (無効)、検索エンジンのクローラーをブロックしたくないため。ファイルを保存して閉じます。次に、Nginxをリロードします。
sudo systemctl reload nginx
これで、ModSecurityはすべてのHTTPリクエストでProjectHoneypotにクエリを実行します。これが機能するかどうかをテストするには、/ etc / nginx / modsec/main.confファイルを編集します。
sudo nano /etc/nginx/modsec/main.conf
このファイルの最後に次の行を追加します。これにより、URLでIPアドレスを渡すことができます。 (テストが成功したら、この行をファイルから削除できます。)
SecRule ARGS:IP "@rbl dnsbl.httpbl.org" "phase:1,id:171,t:none,deny,nolog,auditlog,msg:'RBL Match for SPAM Source'
ファイルを保存して閉じます。 Nginx構成をテストします。
sudo nginx -t
次に、Nginxをリロードします。
sudo systemctl reload nginx
Project HoneypotのWebサイトにアクセスして、悪意のあるIPアドレス(134.119.218.243など)を見つけます。次のコマンドを実行して、HTTPブラックリストをテストします。
curl -i -s -k -X $'GET' 'https://yourdomain.com/?IP=134.119.218.243'
Project HoneypotのIPアドレスが原因で、Webサーバーは403禁止応答を返す必要があります。
NginxでModSecurityでBrotliを使用する方法
従来、Webページは読み込み速度を上げるためにGZIPで圧縮されていました。 Googleによって開発されたBrotliは、より優れた圧縮率を提供する新しい圧縮アルゴリズムです。すべての主要なウェブブラウザでサポートされています。 NginxでBrotliを使用するには、最初に ondrej / nginx-mainline
からBrotliNginxモジュールをインストールする必要があります PPA。
sudo apt install libnginx-mod-brotli
次に、メインのNginx構成ファイルを開きます。
sudo nano /etc/nginx/nginx.conf
http {...}
に次の行を追加します コンテキスト。
brotli on; brotli_comp_level 6; brotli_static on; brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
Save and close the file, then test Nginx configurations.
sudo nginx -t
If the test is successful, restart Nginx.
sudo systemctl restart nginx
Now go to the home page your website, open the developer tools in your web browser (In Firefox you can press Ctrl+Alt+I
to open it up). Select the Network
tab, and press F5
to reload the web page. Click on the main HTML page.
Check the response header on the right sidebar. If the content-encoding
is set to br
, then you have successfully enabled Brotli compression in Nginx.
If the content-encoding
is gzip
, then your Nginx web server is still using GZIP.
Upgrading Nginx
ModSecurity integrates with Nginx as a dynamic module, so every time the Nginx binary is upgraded, you need to rebuild the ModSecurity module for Nginx. This will make your application offline for a few minutes.
If a newer version of Nginx is available in the repository, the sudo apt upgrade
command will upgrade Nginx. The newer version of Nginx is not going to be compatible with the previously compiled ModSecurity module. If Nginx is upgraded by the sudo apt upgrade
command, it will fail to restart as shown in the screenshot below.
And if you run sudo nginx -t
command, it tells you that Nginx expects a new version of the ModSecurity module.
My advice is to prevent Nginx from being upgraded when you run sudo apt upgrade
指図。 This can be achieved by the following command:
sudo apt-mark hold nginx
Now if you run sudo apt update;sudo apt upgrade
, and the package manager tells you that the nginx
package is held back from upgrading, then it means there’s a new nginx version available in the repository.
You should download the new Nginx source package and compile the ModSecurity module again. Move the newly-compiled ModSecurity module to /usr/share/nginx/modules/
ディレクトリ。 Basically that means you need to remove everything under /usr/local/src/
directory (sudo rm /usr/local/src/* -rf
) and go through step 2 and step 4 again.
Then unhold Nginx.
sudo apt-mark unhold nginx
And upgrade Nginx.
sudo apt upgrade nginx
Once the upgrade is complete, hold Nginx again.
sudo apt-mark hold nginx
To show what packages are held, run
apt-mark showhold
Nginx Plus
If you use the commercial Nginx Plus web server, then ModSecurity is included in the Nginx Plus binary. It’s known as the NGINX WAF 。
If you don’t want to spend time re-compiling the ModSecurity source code, then you might want to purchase Nginx Plus, as the ModSecurity module is pre-compiled in the Nginx Plus binary. Benefits of Using ModSecurity 3.0 with NGINX Plus:
- You don’t need to compile the ModSecurity dynamic module yourself; NGINX, Inc. provides a precompiled module for you, saving time and effort.
- NGINX, Inc. has extensively tested the dynamic module, so you know it’s suitable for production usage.
- NGINX, Inc. continually tracks changes and updates the module for every important change and security vulnerability, so you don’t have to do this yourself.
- Each new release of NGINX Plus includes a new version of the dynamic module, so you can upgrade without having to re-compile ModSecurity.
- You get 24×7 support with both installation of the ModSecurity and the OWASP Core Rule Set, as well as troubleshooting and debugging assistance.
How to Disable ModSecurity for a Virtual Host
In this tutorial, I added the following line in the http {...}
context.
modsecurity on;
This will enable ModSecurity for all Nginx server blocks (aka virtual hosts). If you want to disable ModSecurity for a specific server block, then edit the server block file (/etc/nginx/conf.d/example.com.conf
) and add the following line to the server {...}
context.
modsecurity off;
Reload Nginx for the change to take effect.
sudo systemctl reload nginx
FAQ
Static Module vs Dynamic Module in Nginx
- A static module must be compiled with Nginx and it’s integrated with Nginx as one binary. It can’t be unloaded from Nginx.
- A dynamic module is a separate package from the main Nginx binary. It can be loaded and unloaded in Nginx.
What does Binary Compatible Mean?
- If a dynamic module is not binary compatible, then the module and Nginx should be compiled together. If there’s an existing Nginx binary installed from a software repository using
apt-get
, it must be removed and you need to install the compiled Nginx binary in order to use the dynamic module. - If a dynamic module is binary compatible, then this module can be compiled individually without compiling Nginx. The module can be used with your existing Nginx binary installed from a software repository. It’s not perfect, though.
No matter a module is static or dynamic, binary compatible or non binary compatible, if you upgrade the Nginx binary later, you need to compile the module again.
Upgrade Server RAM
ModSecurity can use a fair amount of RAM. If you can see the following error in your Nginx error log (/var/log/nginx/error.log), it means your server is short of RAM.
fork() failed while spawning "worker process" (12: Cannot allocate memory) sendmsg() failed (9: Bad file descriptor) sendmsg() failed (9: Bad file descriptor) sendmsg() failed (9: Bad file descriptor)
You need to restart Nginx and upgrade server RAM, then the above error is not going to happen again.
How to Upgrade OWASP CRS
Besides upgrading the ModSecurity Nginx module, you also need to upgrade the core rule set when a new version comes out. The process is straightforward.
- Go through step 6 again to install the new version of core rule set.
- Then go to step 10. Copy of your custom rules in the
crs-setup.conf
andREQUEST-900-EXCLUSION-RULES-BEFORE-CRS
ファイル。
Next, test Nginx configurations.
sudo nginx -t
If the test is successful, reload Nginx for the change to take effect.
sudo systemctl reload nginx
How do you know if the new version is working? Launch a simple SQL injection attack like in step 8 and check your server logs. It will show you the CRS version that’s preventing this attack.