Os logs de auditoria são gravados como uma série de pares key = value que são facilmente extraídos usando o filtro kv. No entanto, notei que a chave msg
às vezes é usada duas vezes e também é uma série de pares chave = valor.
O primeiro grok é usado para obter os campos audit_type
, audit_epoch
, audit_counter
e sub_msg
(o campo da segunda msg)
grok {
pattern => [ "type=%{DATA:audit_type}\smsg=audit\(%{NUMBER:audit_epoch}:%{NUMBER:audit_counter}\):.*?( msg=\'(?<sub_msg>.*?)\')?$" ]
named_captures_only => true
}
kv é usado para extrair todos os pares key = value, exceto msg e type, pois já obtivemos esses dados com grok:
kv {
exclude_keys => [ "msg", "type" ]
}
kv é usado novamente para analisar os pares chave = valor em sub_msg (se existir):
kv {
source => "sub_msg"
}
date é usada para definir a data como o valor em audit_epoch, usando o formato de data UNIX
para analisar os timestamps de float ou inteiro:
date {
match => [ "audit_epoch", "UNIX" ]
}
Por último, o uso de mutate é usado para remover campos redundantes:
mutate {
remove_field => ['sub_msg', 'audit_epoch']
}
Você também pode renomear campos como o sysadmin1138 sugerido:
mutate {
rename => [
"auid", "uid_audit",
"fsuid", "uid_fs",
"suid", "uid_set",
"ses", "session_id"
]
remove_field => ['sub_msg', 'audit_epoch']
}
Tudo combinado o filtro se parece com isso:
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']
}
}