Logstashを使用してログファイルを収集したいのですが、ファイルの形式は次のとおりです。
type=USER_START msg=audit(1404170401.294:157): user pid=29228 uid=0 auid=0 ses=7972 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_open acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
ラインを一致させるためにどのフィルターを使用する必要がありますか?またはそれを処理する別の方法があります。
任意の助けいただければ幸いです。
以下のパターンを使用して、行を grok debugger と一致させましたが、No matches
メッセージ。
type=%{Word:audit_type} msg=audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\): user pid=%{NUMBER:audit_pid} uid=%{NUMBER:audit_uid} auid=%{NUMBER:audit_audid} subj=%{Word:audit_subject} msg=%{GREEDYDATA:audit_message}
しかし、私が削除したときsubj=%{Word:audit_subject} msg=%{GREEDYDATA:audit_message}
、成功し、このようなJSONオブジェクトを取得しました。
{
"audit_type": [
[
"USER_END"
]
],
"audit_Epoch": [
[
"1404175981.491"
]
],
"BASE10NUM": [
[
"1404175981.491",
"524",
"1465",
"0",
"0"
]
],
"audit_counter": [
[
"524"
]
],
"audit_pid": [
[
"1465"
]
],
"audit_uid": [
[
"0"
]
],
"audit_audid": [
[
"0"
]
]
}
subj
とmsg
が機能しない理由がわかりません。
クイック検索でgithubで this が見つかります
AUDIT type=%{Word:audit_type} msg=audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\): user pid=%{NUMBER:audit_pid} uid=%{NUMBER:audit_uid} auid=%{NUMBER:audit_audid} subj=%{Word:audit_subject} msg=%{GREEDYDATA:audit_message}
AUDITLOGIN type=%{Word:audit_type} msg=audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\): login pid=%{NUMBER:audit_pid} uid=%{NUMBER:audit_uid} old auid=%{NUMBER:old_auid} new auid=%{NUMBER:new_auid} old ses=%{NUMBER:old_ses} new ses=%{NUMBER:new_ses}
大ざっぱなレビューは、それがおそらくあなたが探しているものであることを示唆しています。
監査ログは、kvフィルターを使用して簡単に抽出できる一連のkey = valueペアとして書き込まれます。ただし、キーmsg
が2回使用されることがあり、一連のkey = valueペアでもあることに気付きました。
最初のgrokを使用してフィールドを取得しますaudit_type
、audit_Epoch
、audit_counter
およびsub_msg
(2番目のメッセージフィールド)
grok {
pattern => [ "type=%{DATA:audit_type}\smsg=audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\):.*?( msg=\'(?<sub_msg>.*?)\')?$" ]
named_captures_only => true
}
kvは、msgとtypeを除くすべてのkey = valueペアを抽出するために使用されます。これは、すでにgrokでそのデータを取得しているためです。
kv {
exclude_keys => [ "msg", "type" ]
}
kvはsub_msgのkey = valueペアを解析するために再度使用されます(存在する場合):
kv {
source => "sub_msg"
}
dateは、日付をaudit_Epochの値に設定するために使用され、日付形式UNIX
を使用して、浮動小数点または整数のタイムスタンプを解析します。
date {
match => [ "audit_Epoch", "UNIX" ]
}
最後に、mutateを使用して冗長フィールドを削除します。
mutate {
remove_field => ['sub_msg', 'audit_Epoch']
}
Sysadmin1138のようなフィールドの名前を変更することもできます。
mutate {
rename => [
"auid", "uid_audit",
"fsuid", "uid_fs",
"suid", "uid_set",
"ses", "session_id"
]
remove_field => ['sub_msg', 'audit_Epoch']
}
組み合わせたフィルターはすべて次のようになります。
filter {
grok {
pattern => [ "type=%{DATA:audit_type}\smsg=audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\):.*?( msg=\'(?<sub_msg>.*?)\')?$" ]
named_captures_only => true
}
kv {
exclude_keys => [ "msg", "type" ]
}
kv {
source => "sub_msg"
}
date {
match => [ "audit_Epoch", "UNIX" ]
}
mutate {
rename => [
"auid", "uid_audit",
"fsuid", "uid_fs",
"suid", "uid_set",
"ses", "session_id"
]
remove_field => ['sub_msg', 'audit_Epoch']
}
}
Grokよりも良い解決策は kv フィルターを使用することかもしれません。これは、「key = value」形式で設定されたフィールドを解析します。これは、ほとんどの監査ログのエントリです。 Grokとは異なり、これは時々ある場合とない場合があるフィールドを持つ文字列を処理します。ただし、フィールド名は役に立たない短い形式なので、フィールド名の変更が必要になる場合があります。
filter {
kv { }
}
これでほとんどの情報が得られ、フィールドはログに表示されるものと一致します。すべてのデータ型はstring
になります。すべての面倒を見て、フィールドを人間化するには:
filter {
kv { }
mutate {
rename => {
"type" => "audit_type"
"auid" => "uid_audit"
"fsuid => "uid_fs"
"suid" => "uid_set"
"ses" => "session_id"
}
}
}
ただし、タイムスタンプとイベントIDが含まれているmsg
フィールドは、引き続きグロッキングする必要があります。他の答えはそれを行う方法を示しています。
filter {
kv { }
grok {
match => { "msg" => "audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\):"
}
mutate {
rename => {
"type" => "audit_type"
"auid" => "uid_audit"
"fsuid => "uid_fs"
"suid" => "uid_set"
"ses" => "session_id"
}
}
}
grokのフォーマットが変更されたので、これを見てください:
filter {
grok {
# example: type=CRED_DISP msg=audit(1431084081.914:298): pid=1807 uid=0 auid=1000 ses=7 msg='op=PAM:setcred acct="user1" exe="/usr/sbin/sshd" hostname=Host1 addr=192.168.160.1 terminal=ssh res=success'
match => { "message" => "type=%{Word:audit_type} msg=audit\(%{NUMBER:audit_Epoch}:%{NUMBER:audit_counter}\): pid=%{NUMBER:audit_pid} uid=%{NUMBER:audit_uid} auid=%{NUMBER:audit_audid} ses=%{NUMBER:ses} msg=\'op=%{Word:operation}:%{Word:detail_operation} acct=\"%{Word:acct_user}\" exe=\"%{GREEDYDATA:exec}\" hostname=%{GREEDYDATA:hostname} addr=%{GREEDYDATA:ipaddr} terminal=%{Word:terminal} res=%{Word:result}\'" }
}
date {
match => [ "audit_Epoch", "UNIX_MS" ]
}
}
これは、@ datetimeとしてaudit_Epochからの日付を使用します。