OSSECとWazuhのルールエンジン比較

はじめに

WazuhはOSSECのforkとして開発されていますが、WazuhがOSSECのルールエンジンを大幅に改良している点が大きな特徴です。OSSECでは源IPアドレスや宛先IPアドレスなど事前に定義された固定フィールドのみが使用できますが、Wazuhではユーザーが任意のフィールドを無制限に拡張できます。

両方のルールエンジンはいずれも以下の機能をサポートしています:単一イベントに対する正規表現マッチング、統計ベースルール、前後関係分析(ブルートフォース攻撃や侵入成功の検出など)。Wazuhは構文レベルでOSSECと大きな差異はないものの、共通フィールドの抽出が容易になり、正規表現によるデータ抽出の柔軟性が向上しています。

1. OSSECのルール

OSSECは2種類のルール类型をサポートしています。靜的コンパイル済みルールと動的XML拡張ルールです。

1.1 コンパイル済みルール(静的)

OSSECのコンパイル済みルールは、XML形式でのルール記述を好まないユーザー向けに提供されています。この機能はC言語でログ処理ルールを記述でき、コンパイル時にanalysisdプログラムにリンクさせることで動作します。これは動的なルール拡張机构ではなく、ビルド時に組み込まれる靜的な実装です。

コンパイル済みルールのソースコードはsrc/analysisd/compiled_rulesディレクトリに位置しています。

1.2 XMLルール(動的)

OSSECの動的設定ルールはXMLフォーマットで記述され、以下の2つの種別に分類されます:

デコーダールール

デコーダーは原始ログを構造化データに変換し、タイムスタンプ、IPアドレス、イベントタイプなどの关键フィールドを抽出します。これにより、後続のルールマッチングに標準化された入力が提供されます。例えば、SSHログインログ用のデコーダーは、ユーザー名、IPアドレス、ログイン状態などの情報を抽出します。

デコーダーは/var/ossec/etc/decoders.xmlファイルで定義され、正規表現を使用してログフォーマットにマッチングさせます。各デコーダーはparentフィールドで親デコーダーのロジックを継承するか、prematch条件を使用してログを事前にフィルタリングします。

検出ルール

検出ルールはデコードされた構造化データを基に、論理条件によって異常行動や攻撃パターンをマッチングさせます。例えば、SSHへの複数回のログイン失敗を検出し、ブルートフォース攻撃のアラートを生成します。

ルールは/var/ossec/rules/ディレクトリ下のXMLファイルに定義され、脅威タイプ별로分類されます。ルールは<if_sid>を使用して親ルールIDを参照し、多段关联分析を実現します:

<rule id="10001" level="5">
  <decoded_as>ssh_login</decoded_as>
  <description>SSH login failed</description>
</rule>

<rule id="10002" level="10">
  <if_sid>10001</if_sid>
  <same_source_ip />
  <description>Multiple SSH login failures from same IP</description>
</rule>

上記のルールチェーンでは、単一の失敗(level 5)的基础上、同じIPからの複数回の失敗を検出し、アラートレベルを引き上げます(level 10)。

1.3 協調動作フロー

ログ処理フロー

OSSECのログ処理は以下のコンポーネントで構成されています:

  • ossec-logcollector:ログ収集
  • ossec-analysisd:ログの正規化と分析、ルールマッチング、アラート生成
  • ossec-syscheckd:監視対象のファイル整合性変化検出
  • ossec-maild:メール/SMSアラート送信
  • ossec-execd:応答処理スクリプト実行
  • ossec-remoted:サーバーとエージェント間の通信サービス(UDP 1514)

処理の詳細:首先、ossec-logcollectorが各種ログ(syslog、MySQL、PostgreSQL、Snort、Nmapなど)の変更を監視します。ログ変動を検知すると、対応する読み取り関数(read_syslog、read_mysql_logなど)を呼び出して処理を行います。read_syslogはログエントリを読み取り、UNIXソケットを通じてossec-analysisdに送信します。

ossec-analysisdはOS_ReadMSG_analysisd関数でイベント情報を受信し、OS_CleanMSG関数でReceivedデータをEventinfo構造体に変換します:

typedef struct _Eventinfo {
    /* イベント情報から抽出されたデータ */
    char *log;
    char *full_log;
    char *location;
    char *hostname;
    char *program_name;

    /* デコーダーから抽出されたデータ */
    char *srcip;
    char *dstip;
    char *srcport;
    char *dstport;
    char *protocol;
    char *action;
    char *srcuser;
    char *dstuser;
    char *id;
    char *status;
    char *command;
    char *url;
    char *data;
    char *systemname;

    /* 生成されたルールへのポインタ */
    RuleInfo *generated_rule;

    /* マッチングしたデコーダーへのポインタ */
    OSDecoderInfo *decoder_info;

    /* 削除するSidノード */
    OSListNode *sid_node_to_delete;

    /* ルール発火時に抽出 */
    int size;
    int p_name_size;

    /* その他の内部変数 */
    short int matched;
    
    int time;
    int day;
    int year;
    char hour[9];
    char mon[4];
} Eventinfo;

EventinfoはOSSEC検出の核心オブジェクトであり、すべての検出はこの構造体に対して実行されます。ossec-analysisdによるEventinfoの処理は以下の段階を占めています:

前処理段階では、OS_CleanMSG関数が生データから関連情報を抽出し、Eventinfoの第一部分を入力します。デコード段階では、DecodeEvent関数が呼び出され、デコーダーが原始ログを構造化データに変換します。検出段階では、残りの検出プロセスがOS_ReadMSG / OS_ReadMSG_analysisdによって調停され、OS_CheckIfRuleMatchによってルールマッチングが行われ、マッチングした場合にはOS_Execが対応するアラートレベルを触发し、预设された応答アクション(IP遮断など)を実行します。

コンパイル済みルールの実装例

コンパイル済みルールは、前処理段階だけでなく「検出段階」で,也可以使用XML定義の検出ルールと同等方式で動作します。以下はOSSECソースコードの例で、源ユーザーと目標ユーザーが同一かを検出します:

void *verify_user_identity(Eventinfo *event)
{
    if (!event->srcuser || !event->dstuser) {
        return event;
    }
    if (strcmp(event->srcuser, event->dstuser) == 0) {
        return event;
    }
    return NULL;
}

前処理プラグインの記述では、必要な機能だけを実装すれば良く、残りの作業はregister_rule.shスクリプトで処理できます。このスクリプトは以下のオプションをサポートしています:

add <関数名>    # 関数追加
list           # 追加済み関数一覧
build          # ヘッダファイル生成
save           # 関数リストバックアップ
restore        # 関数リスト復元

1.4 設定ファイルとディレクトリ構造

コンポーネント パス/ファイル 説明
デコーダー /var/ossec/etc/decoders.xml グローバルデコーダー定義を格納
ルール /var/ossec/rules/*.xml カテゴリ별로検出ルールを格納
テストツール /var/ossec/bin/ossec-logtest ログ入力シミュレーションによるデコーダー・ルール検証

2. Wazuhのルール

WazuhルールはXML形式で記述された条件群であり、ログデータを解釈するために使用されます。これらのルールは/var/ossec/etc/rules/と/var/ossec/ruleset/rules/に位置し、Wazuh Managerによって使用されます。ログメッセージ内の特定パターンや行動を検出し、それに応じてアラートまたは応答を生成します。

2.1 ルール分類

Wazuhのルールはデフォルトルールとカスタムルールの2種類に分類されます。

デフォルトルール

Wazuhデフォルトルールはインストールパッケージに含まれる組み込みルールです。/var/ossec/ruleset/rules/ディレクトリに配置されており、広範なセキュリティイベントとログソースをカバーし、常见のセキュリティ脅威のベースラインを提供します。Wazuhチームによって継続的に更新・保守されており、新種の脅威に対応し、セキュリティ検出能力の有効性を確保しています。

カスタムルール

Wazuhのカスタムルールでは、ユーザー固有の環境、アプリケーション、またはセキュリティ要件に関連する特定条件やパターンを定義できます。これらのルールは/var/ossec/etc/rules/ディレクトリに配置されます。Wazuhにはデフォルトルールが含まれていますが、カスタムルールによりユーザーはシステム具体的ニーズに合わせてカスタマイズできます。

カスタムルールの追加には2つの方法があります。新規カスタムルール追加とデフォルトルール修正です。

新規カスタムルールの追加では、XML設定ファイル形式でカスタムルールを作成してWazuh機能を拡張します。需要注意な点は、追加するルールIDは100000〜120000の範囲内に設定すること、ルール数が少ない場合は/var/ossec/etc/rules/local_rules.xmlに追加し、较多の場合は/var/ossec/etc/rules/フォルダ下に新規ルールファイルを作成すること、変更後はsystemctl restart wazuh-managerでWazuh Managerを再起動する必要があることです。

ルートルールと派生ルールでは、ルートルールが基本ルールとしてルールカテゴリを区分し、派生ルールはルートルールを参照してより詳細なフィルタリングとマッチングを行い、セキュリティイベントにより具体的な描述を生成します。

デフォルトルールの修正では、/var/ossec/ruleset/rulesフォルダ下のルールファイルを修正したい場合は、まずデフォルトルールファイルを/var/ossec/etc/rules/フォルダにコピーし、overwrite="yes"属性を追加してから修正します。/var/ossec/ruleset/rulesフォルダ下で直接修正することは推奨されません。これはWazuh升级時に修改内容が上書きされる可能性があるためです。

2.2 ルールレベル

Wazuhルールは0から16までの多个级别に分類されます。各级别はアラートの重大性を表し、カスタムルールの作成批示役立ちます。

低レベル:

  • 0 - Ignored:操作なし。误報防止のために使用。他的全ルールより先にスキャンされ、セキュリティ関連性のないイベントには使用されない
  • 2 - System low priority notification:システム低优先級通知。セキュリティ関連性なし
  • 3 - Successful/Authorized events:成功/授權イベント。ログイン成功、防火墙許可イベントなど
  • 4 - System low priority error:システム低优先級エラー。設定不良や未使用デバイス関連
  • 5 - User generated error:ユーザー生成エラー。パスワードミス、操作拒否など
  • 6 - Low relevance attack:低関連性攻撃。システムに影響しないワームや病毒、频繁なIDSイベント

中レベル:

  • 7 - "Bad word" matching: проблемных単語マッチング。未分類イベント、多くの場合セキュリティ関連性あり
  • 8 - First time seen:初回検出。初回IDSイベント、用户初のログインなど
  • 9 - Error from invalid source:無効ソースからのエラー。未知ユーザーや無効ソースからのログイン試行
  • 10 - Multiple user generated errors:複数のユーザー生成エラー。多个パスワードエラー、ログイン失敗の繰り返し
  • 11 - Integrity checking warning:整合性チェック警告。バイナリ改ざん、rootkit検出メッセージ

高レベル:

  • 12 - High importance event:高重要性イベント。システム、カーネルからのエラー/警告メッセージ
  • 13 - Unusual error (high importance):異常エラー。高重要性。多くの場合一般的な攻撃パターンにマッチング
  • 14 - High importance security event:高重要性セキュリティイベント。相関関係を通じて多くの場合攻撃を示唆

重大レベル:

  • 15 - Severe attack:严重攻撃。誤報の可能性なし、即座的关注が必要

2.3 導入と設定

Wazuhは多种多様な導入方法をサポートしています。レポジトリからのインストール、虚拟机OVA、コンテナイメージ(Docker/K8s)、Elastic Stack統合、Ansibleなどを使用した展開が可能です。

能動的応答機能として、Wazuhは危険またはアラートを検出した際に、設定された条件に基づいて一系列の反応を実行できます。例えば、アカウントログイン禁止などの 조치를 취할 수 있습니다。能動的応答スクリプトは/var/ossec/active-response/binディレクトリに配置されています。

タグ: OSSEC Wazuh セキュリティ監視 intrusion-detection ルールエンジン

10月20日 10:37 投稿