はじめに
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ディレクトリに配置されています。