システムログとSnortアラートのGraylogを試しています。例 ここ に従ってsnortアラートをGraylogに取り込み、別のIDSログソース用に別のストリーム、パイプライン、ルールを追加しました。基本的にSnortの例をコピーし、正規表現を変更して、新しいログソースから関連フィールドを抽出しました。 [検索]タブからメッセージを選択し、[ストリームに対してテスト]を選択すると、新しい正規表現は正常にテストされます。グレイログの上部にあるStreams
メニュー項目から選択すると、メッセージも新しいストリームの下に表示されます。
パイプラインルールでは、set_field()
関数を使用して、正規表現から一致するグループの値を割り当てます。 set_field()
を使用してルールに9つのフィールドがありますが、いずれも検索データに表示されていません。どうしてこれなの? GELFの例のように、最初にadd_field()
を使用する必要がありますか? set_field()
が自動的にそれを行うと想定していました。これは、上記のリンクのsnortの例が機能する方法です。以下に、GraylogのIDropsストリームに添付されているパイプラインルールを添付しました。
rule "Extract IDropS fields"
when
has_field("message")
then
let m = regex("^([a-z]+)\\s.*(TCP|UDP|ICMP)\\s([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}):(\\d{1,5})\\s([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}):(\\d{1,5}).*SnortSid.*:([0-9]+):([0-9]+)\\s(.*)$", to_string($message.message));
set_field("snort_alert", false);
set_field("sd_Host", m["0"]);
set_field("sd_proto", m["1"]);
set_field("sd_src", m["2"]);
set_field("sd_sport", m["3"]);
set_field("sd_dst", m["4"]);
set_field("sd_dport", m["5"]);
set_field("sd_sid", (m["6"]));
set_field("sd_rev", m["7"]);
set_field("sd_desc", m["8"]);
end
問題は、Configurations
画面でMessage Processors Configuration
の順序を変更する必要があることである可能性があります。
デフォルトではGeoIP Processor > Pipeline Processor > Message Filter Chain
です。
パイプラインの使用法に関するGreylogの公式ドキュメント の「メッセージプロセッサの構成」に記載されているように、これをMessage Filter Chain > Pipeline Processor > GeoIP Processor
に変更する必要があります。
2.1で数週間動作させた後、新しくインストールした2.2Graylogでこれを行うのを忘れました。症状はあなたと同じで、snortストリームルールとパイプラインルールが一致し、シミュレーションは機能しましたが、実際にはフィールドが設定されておらず、エラーの兆候もありませんでしたが、不思議なことに、パイプラインをデフォルトの「すべてのメッセージ」ストリームに接続すると機能します。私は欲しくない。ここで、このメッセージプロセッサの順序を変更して、snortパイプラインが期待どおりに機能するようにしました。
それが正しい方法かどうかはわかりませんが、すべてのパイプラインルールをデフォルトストリーム(システム/パイプライン>パイプライン>デフォルトストリーム)に追加しました>接続を編集..次にカスタムパイプラインを追加)すると、すべてのフィールドが検索データに表示され始めました。