IIS ログと Elasticsearch で解決しようとしている問題があります。何が起こっているのかというと、IIS ログのユーザー名にスラッシュ (/) ではなくバックスラッシュ () が含まれているということです。Elasticsearch が名前を返すと、入力時にエスケープされることを望んでいた \ がなくなりました。そのため、Elasticsearch または Kibana で結果を表示すると、ユーザー名に \ がなく、そこにあるスラッシュが正規表現として扱われます。この例として、ユーザー名 abcd\bob は abcdob として返されます。
また、IIS からの各エントリに _grokparsefailure タグが追加されるのは、この問題が原因であると考えています。
助言がありますか?
データを取得する私のNXLOGファイル:
## ROOT を nxlog がインストールされたフォルダに設定してください。 ## そうしないと起動しません。 #define ROOT C:\Program Files\nxlog ルート C:\Program Files (x86)\nxlog を定義します Moduledir %ROOT%\modules CacheDir %ROOT%\data pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data ログファイル %ROOT%\data\nxlog.log <拡張json> モジュール xm_json </拡張子> #<拡張子 w3c> #iis ログ フィールドをフィールド タイプにマップする # モジュール xm_csv # フィールド $date, $time, $website, $serverip, $method, $url, $querystring, $port, $username, $clientip, $version, $useragent, $referer, $status, $substatus, $sc_win32_status, $sc_bytes、$cs_bytes、$time_taken # FieldTypes 文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、整数、整数、整数、整数、整数、整数 # # #フィールド $date、$time、$website、$hostname、$serverip、$verb、$request、$querystring、$dstport、$user、$clientip、$httpversion、$useragent、$cookie、$referrer、$fqdn 、$status、$substatus、$sc_win32_status、$sc_bytes、$cs_bytes、$time_taken # #FieldTypes 文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、整数、整数、整数、整数、整数、整数 # デリミタ ' ' # QuoteChar '"' # EscapeControl FALSE # UndefValue - #</拡張子> <拡張子w3c> #iis ログ フィールドをフィールド タイプにマップする モジュール xm_csv フィールド $date、$time、$website、$hostname、$serverip、$verb、$request、$querystring、$dstport、$user、$clientip、$httpversion、$useragent、$cookie、$referrer、$fqdn、$ステータス、$substatus、$sc_win32_status、$sc_bytes、$cs_bytes、$time_taken FieldTypes 文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、文字列、整数、整数、整数、整数、整数 区切り文字 ' ' </拡張子> # Nxlog 内部ログ <内部入力> モジュール im_internal Exec $EventReceivedTime = integer($EventReceivedTime) / 1000000; to_json(); </入力> # Windows イベント ログ <入力イベントログ> # Windows Vista/2008 以降では im_msvistalog のコメントを外します モジュール im_msvistalog # Windows XP/2000/2003 の場合は im_mseventlog のコメントを外します # モジュール im_mseventlog Exec $EventReceivedTime = integer($EventReceivedTime) / 1000000; to_json(); </入力> <入力 iis-logs> モジュール im_file ファイル「C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log」 ReadFromLast TRUE Exec if $raw_event =~ /^#/ drop(); \ そうしないと \ { \ w3c->parse_csv(); \ $EventTime = parsedate($date + " " + $time); \ to_json (); \ } </入力> <アウトプットアウト> モジュール om_tcp ホスト ログ。{ドメインが削除されました}.com ポート 3515 </出力> <出力 iis-out> モジュール om_tcp ホスト ログ。{ドメインが削除されました}.com ポート 3516 </出力> <ルート1> パス内部、イベントログ => 出力 </ルート> <ルート2> パス iis-logs => iis-out </ルート>
私の Logstash.conf ファイル:
入力 { TCP { ポート => 5000 タイプ =>「syslog」 } TCP { タイプ => 「イベントログ」 ポート => 3515 コーデック => json_lines } TCP { タイプ => "iislog" ポート => 3516 コーデック => json_lines } } フィルター { [タイプ] == "syslog" { グルク{ match => { "message" => "<%{POSINT:syslog_pri}>%{DATA:syslog_timestamp} %{DATA:syslog_program}\[%{NUMBER:syslog_pid}\]\: %{GREEDYDATA:syslog_message}" } add_field => [ "received_at", "%{@timestamp}" ] # add_field => [ "received_from", "%{@source_host}" ] } syslog_pri { } 日にち { 一致 => [「syslog_timestamp」、「yyyy:MM:dd-HH:mm:ss」] } 「_grokparsefailure」が[タグ]にない場合{ 突然変異 { 置換 => [ "@message", "%{syslog_message}" ] } } 突然変異 { 削除 => [「syslog_message」、「syslog_timestamp」] } kv { ソース=>「@メッセージ」 } } [タイプ] == "イベントログ" { # nxlog からの受信 Windows イベント ログ # EventReceivedTime フィールドには数字のみを含める必要があります。そうしないと、無効なメッセージになります # if [EventReceivedTime] !~ /\d+/ { drop { } } #グレップ{ # 一致 => [ "EventReceivedTime", "\d+" ] # } 突然変異 { # 常に大文字の一部の値を小文字にします 小文字 => [ "EventType", "FileName", "Hostname", "Severity" ] } 突然変異 { # ソースをメッセージの内容に設定 名前の変更 => [「ホスト名」、「@source_host」] } 日にち { # タイムスタンプを整数から UTC に変換する 一致 => [ "EventReceivedTime", "UNIX" ] } 突然変異 { # 一部のフィールドの名前をより便利なものに変更 名前の変更 => [「メッセージ」、「@メッセージ」] 名前の変更 => [「重大度」、「eventlog_severity」] 名前の変更 => [ "SeverityValue", "eventlog_severity_code" ] 名前の変更 => [「チャンネル」、「eventlog_channel」] rename => [ "SourceName", "eventlog_program" ] 名前の変更 => [「ソースモジュール名」、「nxlog_input」] 名前の変更 => [「カテゴリ」、「eventlog_category」] 名前の変更 => ["EventID", "eventlog_id"] rename => [ "RecordNumber", "eventlog_record_number" ] 名前の変更 => [「ProcessID」、「eventlog_pid」] } 突然変異 { # 冗長なフィールドを削除 削除 => [「SourceModuleType」、「EventTimeWritten」、「EventTime」、「EventReceivedTime」、「EventType」] } [イベントログ ID] == 4624 { 突然変異 { add_tag => [「広告ログオン成功」] } } [イベントログ ID] == 4634 { 突然変異 { add_tag => [「広告ログオフ成功」] } } if [eventlog_id] == 4771 or [eventlog_id] == 4625 or [eventlog_id] == 4769 { 突然変異 { add_tag => [「広告ログオン失敗」] } } [eventlog_id] == 4723 { 突然変異 { add_tag => [「広告パスワード変更」] } } [eventlog_id] == 4724 { 突然変異 { add_tag => [「広告パスワードのリセット」] } } if "ad-logon-success" in [tags] { メトリクス { add_tag => [「ドロップ」、「メトリック」、「広告ログオン成功」] メーター => 「広告ログオン成功メトリック」 } } if "ad-logon-failure" in [tags] { メトリクス { add_tag => [「ドロップ」、「メトリック」、「広告ログオン失敗」] メーター => 「広告ログオン失敗メトリック」 } } } [タイプ] == "iislog" の場合 { グルク{ # match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:iisSite} %{IPORHOST:site} %{IP:hostip} %{WORD:method} %{URIPATH:page} %{NOTSPACE: querystring} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientip} %{NOTSPACE:httpversion} %{NOTSPACE:useragent} %{NOTSPACE:referer} %{NUMBER:status} %{NUMBER:sub- status} %{NUMBER:win32-status} %{NUMBER:bytes-received} %{NUMBER:bytes-sent} %{NUMBER:time-taken}"] match => ["message", "%{DATESTAMP:log_timestamp} %{WORD:sitename} %{HOSTNAME:computername} %{IP:hostip} %{URIPROTO:method} %{URIPATH:request} (?:%{ NOTSPACE:queryparam}|-) %{NUMBER:port} (?:%{NOTSPACE:username}|-) %{IP:clientip} %{NOTSPACE:httpversion} %{NOTSPACE:user-agent} (?:%{ NOTSPACE:cookie}|-) (?:%{NOTSPACE:referer}|-) (?:%{HOSTNAME:host}|-) %{NUMBER:status} %{NUMBER:sub-status} %{NUMBER:win32 -status} %{NUMBER:bytes-received} %{NUMBER:bytes-sent} %{NUMBER:time-taken}"] } ユーザーエージェント { ソース=>「ユーザーエージェント」 } #geoip { # ソース => "clientip" #} } メトリクス { メーター => 「イベント」 add_tag => [「ドロップ」、「メトリック」、「イベント メトリック」] } } 出力 { if "drop" not [tags] { エラスティックサーチ { ホスト => 「127.0.0.1」 クラスター => 「ログ」 } # stdout { codec => rubydebug } } }
IIS ログ エントリの例:
2015-05-06 15:41:18 W3SVC2 WEB1 10.11.10.137 GET /main/ - 80 ABCD\smith 10.11.11.127 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.3;+WOW64;+Trident/7.0;+Touch;+.NET4.0E;+.NET4.0C;+Tablet+PC+2.0;+.NET+CLR+3.5.30729;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+InfoPath.3) cisession=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22959e25c7a1663350eeb85edb676de096%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%2210.11.11.127%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F4.0+%28compatible%3B+MSIE+7.0%3B+Windows+NT+6.3%3B+WOW64%3B+Trident%2F7.0%3B+Touch%3B+.NET4.0E%3B+.NET4.0C%3B+Tablet+PC+2.0%3B+.NET+CL%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1430926793%3B%7D08a40eacaf8b6eba6102c7746c35c46497a6502a http://my.domain.com/main/scheduling my.domain.com 200 0 0 11314 1009 1458
更新: 2 つ目の nxlog iis 入力/出力を追加し、logstash サーバーにデータを出力する代わりに、フラット ファイルに出力しました。
<出力 iis2-out> モジュール om_file ファイル「C:\logs\logtest.txt」 </出力>
この出力を確認したところ、logstash サーバーにアクセスする前に、ユーザー名からバックスラッシュが削除されていることがわかりました。