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 サーバーにアクセスする前に、ユーザー名からバックスラッシュが削除されていることがわかりました。