
ModSecurityは、Apache、IIS、Nginx向けのオープンソースでクロスプラットフォームなWebアプリケーションファイアウォール(WAF)エンジンです。堅牢なイベントベースのプログラミング言語を備えており、Webアプリケーションに対するさまざまな攻撃から保護し、HTTPトラフィックの監視、ロギング、リアルタイム分析を可能にします。
Libmodsecurity は ModSecurity v3 プロジェクトのコンポーネントの 1 つです。ライブラリのコードベースは ModSecurity コネクタへのインターフェースとして機能し、Web トラフィックを受け取り、従来の ModSecurity 処理を適用します。一般的には、ModSecurity SecRules 形式で記述されたルールをロード・解釈し、コネクタ経由でアプリケーションが提供する HTTP コンテンツにそれらを適用する機能を提供します。
Apache 向け ModSecurity(別名 ModSecurity v2.x)をお探しの場合は、現在もメンテナンス中で、こちらから入手できます:こちら。
Libmodsecurity は ModSecurity プラットフォームの完全な書き直しです。当初 ModSecurity プロジェクトは Apache モジュールとして始まりましたが、時間の経過とともに、多くの要望を受けて Nginx や IIS などの他のプラットフォームもサポートするように拡張されました。プラットフォームサポートの需要の高まりに応えるためには、このプロジェクトの基盤となる Apache 依存関係を取り除き、よりプラットフォームに依存しないものにする必要がありました。
この目標の結果として、Libmodsecurity を再設計し、コンパイル時および実行時の両方で Apache Web サーバーに依存しないようにしました。これにより、すべてのプラットフォームでパフォーマンスが向上することが期待できます。さらに、この機会に、ユーザーが長らく望んでいたいくつかの新機能の基盤を築きました。たとえば、将来のバージョンでは JSON 形式の監査ログをネイティブでサポートする予定です。
「ModSecurity」ブランチには、従来のように Nginx、Apache、IIS 向けの従来のモジュールロジックは含まれなくなりました。その代わり、このブランチにはこのプロジェクトのライブラリ部分(libmodsecurity)のみが含まれています。このライブラリは、私たちが「コネクタ」と呼ぶものによって消費されます。これらのコネクタは Web サーバーとインターフェースし、ライブラリが理解できる共通の形式を提供します。各コネクタは別の GitHub プロジェクトとして管理されています。たとえば、Nginx コネクタは ModSecurity-nginx プロジェクト(https://github.com/owasp-modsecurity/ModSecurity-nginx)で提供されています。
これらのコネクタを分離することで、各プロジェクトが異なるリリースサイクル、課題、開発ツリーを持つことができます。また、ModSecurity v3 をインストールする際に必要なものだけを正確に入手でき、使わない余分なものは入手できません。
コンパイルプロセスを開始する前に、必要な依存関係がすべてインストールされていることを確認してください。 詳細については、依存関係 および Git サブモジュール のセクションを参照してください。
コンパイル後、ビルド/プラットフォームに問題がないことを確認してください。
ユニットテストと回帰テストを実行することを強くお勧めします。これらのテストユーティリティは tests/ サブフォルダにあります。
動的ライブラリとして、libmodsecurity はオペレーティングシステムが動的ライブラリを見つけられる場所にインストールする必要があります。
Unix 系システムでは、プロジェクトはコンパイルプロセスに autotools を使用します。
git チェックアウトで作業している場合は、ビルド前にリポジトリを再帰的にクローンするか、すべてのサブモジュールを初期化してください。 Git サブモジュール セクションも参照してください。
git clone https://github.com/owasp-modsecurity/ModSecurity ModSecurity
cd ModSecurity
このリポジトリは git サブモジュールを使用しています。クローン後、すべてのサブモジュールを初期化してフェッチしてください。
git submodule update --init --recursive
すべてのサブモジュールが正しく初期化されていることを確認するには、次のコマンドを使用します。
git submodule status
正しく初期化されたサブモジュールにはコミットハッシュが表示されます。
先頭に - が付いている場合は、サブモジュールが初期化されていないことを示します。
その後、ビルドプロセスを開始できます。
./build.sh
./configure
make
sudo make install
ディストリビューション固有のビルドの詳細は、Wiki にあります。 コンパイルレシピ
Windows のビルド情報はこちらにあります。
SecRules での正規表現処理は、Regex ユーティリティ(src/utils/regex.*)を介して実装されています。
デフォルトでは、ModSecurity は正規表現処理に PCRE2 を使用します。
これは @rx、@rxGlobal、@verifyCC などのオペレーターで使用されます。
ビルド時の動作:
--with-pcre が明示的に指定された場合(WITH_PCRE)、従来の PCRE を使用できます。言い換えれば、特に指定がない限り、現在のビルドは PCRE2 を前提としています。
その他の依存関係は、SecRules 内で指定されたオペレーターや設定ディレクティブに関連しており、コンパイルには必要ない場合があります。
libinjection は、@detectXSS および @detectSQL オペレーターに必要です。curl は、SecRemoteRules ディレクティブに必要です。これらのライブラリがない場合、ModSecurity はそれぞれのオペレーターやディレクティブのサポートなしでコンパイルされます。
リポジトリには以下のサブモジュールが含まれています。
others/libinjection – @detectSQLi および @detectXSS オペレーターで使用されます。
others/mbedtls(TF-PSA-Crypto サブセット) – 暗号化機能やヘルパー(ハッシュ、base64 など)に使用されます。
注: 新しい mbedTLS v4 のレイアウトは、古い v3 の構造と互換性がありません。 内部構造が大幅に変更され、多くのコンポーネントがサブモジュール(例:TF-PSA-Crypto)に移動されました。
PR #3532 のマージ後、以下を実行する必要があります。
git submodule update --init --recursive
これにより、必要なすべてのサブモジュールがフェッチされます。この手順をスキップすると、プロジェクトは正常にビルドされません。
すべてのサブモジュールが正しく初期化されていることを確認するには、次のコマンドを使用します。
git submodule status
出力例:
bc625d5... bindings/python
2117822... others/libinjection (v4.0.0)
0fe989b... others/mbedtls (v4.1.0)
a3d4405... test/test-cases/secrules-language-tests
サブモジュールが欠落している場合、先頭に - が付いて表示されます。例:
-bc625d5... bindings/python
先頭の - は、サブモジュールが初期化またはフェッチされていないことを示します。
test/test-cases/secrules-language-tests – make check で使用される共有の SecRules 適合性テストおよび回帰テストスイートです。
bindings/python – ModSecurity の Python バインディング(コアライブラリのコンパイルには不要)。
others/libinjection および others/mbedtls は、ソースビルドに実質的に必須であり、ビルド前に初期化する必要があります。
いくつかの外部ライブラリはオプションで、追加機能を有効にします。以下を含みます。
libcurl – SecRemoteRules に必要
LMDB – 永続ストレージサポート
Lua – スクリプトサポート
XML ライブラリ – 拡張 XML 処理
GeoIP(レガシー)/ MaxMind
レガシー GeoIP C API(libGeoIP)は、MaxMind によって非推奨であり、もはやメンテナンスされていません。 上流のリポジトリはアーカイブされており、新しいデプロイメントには使用しないでください。
代わりに、ModSecurity は最新の MaxMind DB API(libmaxminddb) をサポートしており、こちらはアクティブにメンテナンスされています。
設定中に、次のような表示がされる場合があります。
+ GeoIP/MaxMind ....found
* (MaxMind) v1.12.2
-lmaxminddb , -I/usr/include/x86_64-linux-gnu
これは libmaxminddb が使用されていることを示します(推奨)。
レガシー GeoIP ライブラリではなく、MaxMind DB を使用することを強くお勧めします。
ライブラリのドキュメントは、コード内に Doxygen 形式で記述されています。このドキュメントを生成するには、提供されている設定ファイル "doxygen.cfg" を "doc/" サブフォルダとともに doxygen ユーティリティで使用してください。これにより、使用例を含む HTML 形式のドキュメントが生成されます。
ライブラリは C++ および C のインターフェースを提供しています。一部のリソースは現在 C++ インターフェースでのみ利用可能です。たとえば、カスタムロギングメカニズムを作成する機能(ロギングメカニズムの動作を確認するには回帰テストを参照)などです。目標は、両方の API(C、C++)が同じ機能を提供することです。特定のインターフェースで API の側面が欠けている場合は、Issue を開いてください。
サブフォルダ examples 内には、API の使用方法を示す簡単な例があります。以下にいくつかを示します。
using ModSecurity::ModSecurity;
using ModSecurity::Rules;
using ModSecurity::Transaction;
ModSecurity *modsec;
ModSecurity::Rules *rules;
modsec = new ModSecurity();
rules = new Rules();
rules->loadFromUri(rules_file);
Transaction *modsecTransaction = new Transaction(modsec, rules);
modsecTransaction->processConnection("127.0.0.1");
if (modsecTransaction->intervention()) {
std::cout << "There is an intervention" << std::endl;
}
#include "modsecurity/modsecurity.h"
#include "modsecurity/transaction.h"
char main_rule_uri[] = "basic_rules.conf";
int main (int argc, char **argv)
{
ModSecurity *modsec = NULL;
Transaction *transaction = NULL;
Rules *rules = NULL;
modsec = msc_init();