What will be Grok Pattern for following IIS logs? - logstash-grok

I have following IIS server logs :
2018-09-16 04:11:47 W3SVC10 webserver 107.6.166.194 POST /api/uploadjsontrip - 443 - 203.77.177.176 HTTP/1.1 Java/1.8.0_45 - - vehicletrack.biz 200 0 0 506 872 508
Data Description:
date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken
How to write the Grok pattern to extract the value of each column??
I tried following but it did not work.
%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:s-sitename} %{WORD:cs-method} %{URIPATH:cs-uri-stem} %{NOTSPACE:cs-uri-query} %{NUMBER:s-port} %{NOTSPACE:cs-username} %{IPORHOST:c-ip} %{NOTSPACE:cs(User-Agent)} %{NOTSPACE:cs(Cookie)} %{NOTSPACE:cs(Referer)} %{NOTSPACE:cs-host} %{NUMBER:sc-status:int} %{NUMBER:sc-substatus:int} %{NUMBER:sc-win32-status:int} %{NUMBER:sc-bytes:int} %{NUMBER:cs-bytes:int} %{NUMBER:time-taken:int}" ,
"message", "%{TIMESTAMP_ISO8601:timestamp} %{IPORHOST:s-sitename} %{WORD:cs-method} %{URIPATH:cs-uri-stem} %{NOTSPACE:cs-uri-query} %{NUMBER:s-port} %{NOTSPACE:cs-username} %{IPORHOST:c-ip} %{NOTSPACE:cs(User-Agent)} %{NOTSPACE:cs(Referer)} %{NUMBER:response:int} %{NUMBER:sc-substatus:int} %{NUMBER:sc-substatus:int} %{NUMBER:time-taken:int}" ,
"message", "%{TIMESTAMP_ISO8601:timestamp} %{WORD:cs-method} %{URIPATH:cs-uri-stem} %{NOTSPACE:cs-post-data} %{NUMBER:s-port} %{IPORHOST:c-ip} HTTP/%{NUMBER:c-http-version} %{NOTSPACE:cs(User-Agent)} %{NOTSPACE:cs(Cookie)} %{NOTSPACE:cs(Referer)} %{NOTSPACE:cs-host} %{NUMBER:sc-status:int} %{NUMBER:sc-bytes:int} %{NUMBER:cs-bytes:int} %{NUMBER:time-taken:int}
Please help me.
Thanks in advance.

This will work for grok line that you have provided. But it may fail near user-agent and cookie depending on data.
%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:s_sitename} %{WORD:s_computername} %{IPV4:s_ip} %{WORD:cs_method} %{URIPATH:cs_uri_stem} %{DATA:cs_uri_query} %{NUMBER:s_port} - %{IPV4:cs_ip} HTTP/%{NUMBER:cs_vserion} %{NOTSPACE:cs_user_agent} %{NOTSPACE:cs_cookie} (-|%{URI:cs_refrer}) %{IPORHOST:cs_host} %{INT:sc_status} %{INT:sc_substatus} %{INT:sc_win32-status} %{INT:sc_bytes} %{INT:cs_bytes} %{INT:time_taken}
Also, you might find this tool easier to do any grok testing and debugging https://grokdebug.herokuapp.com/

Related

Excel convert decimal to date time

I am trying to convert these numbers in seconds to a date-time format yyyy-mm-ddat a specific start date for example 2014-01-01.I tried searching for some online resources for this task, however, I was unable to find anything.
For example, at T = 86400, I would like it to be converted to 2014-01-02. When T=129600, then it would be 1.5 days from 2014-01-01 so it should be converted to 2014-01-02.
Any help is appreciated. And I apologize if my syntax is incorrect as this is my first time using stackoverflow.
T
86400
129600
172800
259200
345600
432000
518400
523800
532542.8571
542828.5714
555685.7143
580242.8571
592521.4286
604800
629357.1429
660278.5714
691200
734400
756000
777600
783000
786375
793125
800625
815625
You can use:
=$A$1+A2/60/60/24

Logstash filter pattern for Audit logs?

I am collecting all levels of logs including AuditD logs from my VM's using Syslog and keeping in the centralized location which is Syslog server. Then I am pushing all my VM's logs to ELK stack using filebeat. While pushing to the logstash. I want to separate following details from my auditD logs
1) User Name
2) What command he executed
I Used the following pattern to separate the same but I am not able to get the username as a string since AUID taking as an integer.
Used Pattern
type=%{WORD:audit_type} msg=audit\(%{NUMBER:audit_epoch}:%{NUMBER:audit_counter}\): arch=%{NOTSPACE} syscall=%{NUMBER:syscall_number} success=(?<syscall_sucess>(yes|no)) exit=%{NUMBER:syscall_exit_code} %{GREEDYDATA:syscall_arguments} items=%{NUMBER:syscall_path_records} ppid=%{NUMBER:syscall_parent_pid} pid=%{NUMBER:syscall_pid} auid=%{NUMBER:uid_audit} uid=%{NUMBER:running_uid} gid=%{NUMBER:group_id} euid=%{NUMBER:uid_effective} suid=%{NUMBER:uid_set} fsuid=%{NUMBER:uid_fs} egid=%{NUMBER:gid_effective} sgid=%{NUMBER:gid_set} fsgid=%{NUMBER:gid_fs} tty=%{NOTSPACE:tty} ses=%{NUMBER:session_id} comm=\"%{GREEDYDATA:command}\" exe=\"%{GREEDYDATA:exec_file}\" key=\"%{GREEDYDATA:audit_rule}\" SYSCALL=\"%{GREEDYDATA:syscall}\" AUID=\"%{GREEDYDATA:user}\"
My example input
type=SYSCALL msg=audit(1582540425.222:375): arch=c000003e syscall=59 success=yes exit=0 a0=55ea2c3d1f90 a1=55ea2c2e2c20 a2=55ea2c41f570 a3=0 items=2 ppid=16081 pid=16249 auid=1578986719 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key="rootact"#035ARCH=x86_64 SYSCALL=execve AUID="giri" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"
from the above example, I can able to get the auid as 1578986719 but not as giri which is AUID.
Kindly help me to get the AUID as a string.
Hope this pattern helps to get AUID as string
type=%{WORD:audit_type} msg=audit\(%{NUMBER:audit_epoch}:%{NUMBER:audit_counter}\): arch=%{NOTSPACE} syscall=%{NUMBER:syscall_number} success=(?<syscall_sucess>(yes|no)) exit=%{NUMBER:syscall_exit_code} %{GREEDYDATA:syscall_arguments} items=%{NUMBER:syscall_path_records} ppid=%{NUMBER:syscall_parent_pid} pid=%{NUMBER:syscall_pid} auid=%{NUMBER:uid_audit} uid=%{NUMBER:running_uid} gid=%{NUMBER:group_id} euid=%{NUMBER:uid_effective} suid=%{NUMBER:uid_set} fsuid=%{NUMBER:uid_fs} egid=%{NUMBER:gid_effective} sgid=%{NUMBER:gid_set} fsgid=%{NUMBER:gid_fs} tty=%{NOTSPACE:tty} ses=%{NUMBER:session_id} comm=\"%{GREEDYDATA:command}\" exe=\"%{GREEDYDATA:exec_file}\" key=\"%{GREEDYDATA:audit_rule}\"%{GREEDYDATA} SYSCALL=%{GREEDYDATA:syscall} AUID=\"%{GREEDYDATA:user}\" UID
Or if you're just interested in the user name and AUID, you can use this pattern:
(?=.*auid=%{NUMBER:uid_audit})(?=.*AUID=\"%{DATA:user}\")
Which doesn't rely on the log format staying the same.

What will be Grok pattern for following IIS server logs?

I have following IIS server logs :-
2018-09-16 06:19:25 W3SVC10 webserver 107.6.166.194 GET /axestrack/homepagedata/ uname=satish5633&pwd=5633&panelid=1 80 - 117.225.237.56 HTTP/1.1 Dalvik/2.1.0+(Linux;+U;+Android+6.0.1;+vivo+1606+Build/MMB29M) - - vehicletrack.biz 200 0 0 883 224 4
I tried following :-
%{TIMESTAMP_ISO8601:logtime} %{WORD:s-sitename} %{WORD:s-computername} %{IPORHOST:s-ip} %{WORD:cs-method
But after cs-method I don't know how to write grok pattern to extract remaining fields.
How to write Grok pattern for following :-
API_NAME : /axestrack/homepagedata/
API_PARAMETRES : uname=satish5633&pwd=5633&panelid=1
PORT : 80
CS-USERNAME : -(Can be hyphen or username)
CLIENT-IP : 117.225.237.56
Try this:
%{TIMESTAMP_ISO8601:logtime} %{WORD:s-sitename} %{WORD:s-computername} %{IPORHOST:s-ip} %{WORD:cs-method} %{URIPATH:API_NAME} %{NOTSPACE:API_PARAMETRES} %{NUMBER:PORT} %{NOTSPACE:CS_USERNAME} %{IPORHOST:CLIENT_IP} %{NOTSPACE:protocolVersion} %{NOTSPACE:userAgent} %{NOTSPACE:cookie} %{NOTSPACE:referer} %{NOTSPACE:requestHost} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:bytesSent} %{NUMBER:bytesReceived} %{NUMBER:timeTaken}

Parsing two formats of log messages in LogStash

In a single log file, there are two formats of log messages. First as so:
Apr 22, 2017 2:00:14 AM org.activebpel.rt.util.AeLoggerFactory info
INFO:
======================================================
ActiveVOS 9.* version Full license.
Licensed for All application server(s), for 8 cpus,
License expiration date: Never.
======================================================
and second:
Apr 22, 2017 2:00:14 AM org.activebpel.rt.AeException logWarning
WARNING: The product license does not include Socrates.
First line is same, but on the other lines, there can be (written in pseudo) :loglevel: <msg>, or loglevel:<newline><many of =><newline><multiple line msg><newline><many of =>
I have the following configuration:
Query:
%{TIMESTAMP_MW_ERR:timestamp} %{DATA:logger} %{GREEDYDATA:info}%{SPACE}%{LOGLEVEL:level}:(%{SPACE}%{GREEDYDATA:msg}|%{SPACE}=+(%{GREEDYDATA:msg}%{SPACE})*=+)
Grok patterns:
AMPM (am|AM|pm|PM|Am|Pm)
TIMESTAMP_MW_ERR %{MONTH} %{MONTHDAY}, %{YEAR} %{HOUR}:%{MINUTE}:%{SECOND} %{AMPM}
Multiline filter:
%{LOGLEVEL}|%{GREEDYDATA}|=+
The problem is that all messages are always identified with %{SPACE}%{GREEDYDATA:msg}, and so in second case return <many of => as msg, and never with %{SPACE}=+(%{GREEDYDATA:msg}%{SPACE})*=+, probably as first msg pattern contains the second.
How can I parse these two patterns of msg ?
I fixed it by following:
Query:
%{TIMESTAMP_MW_ERR:timestamp} %{DATA:logger} %{DATA:info}\s%{LOGLEVEL:level}:\s((=+\s%{GDS:msg}\s=+)|%{GDS:msg})
Patterns:
AMPM (am|AM|pm|PM|Am|Pm)
TIMESTAMP_MW_ERR %{MONTH} %{MONTHDAY}, %{YEAR} %{HOUR}:%{MINUTE}:%{SECOND} %{AMPM}
GDS (.|\s)*
Multiline pattern:
%{LOGLEVEL}|%{GREEDYDATA}
Logs are correctly parsed.

Logstash - one event per logile

We want to introduce a log management tool. One of the possible candidates is the ELK stack.
I looked into the manual and it says that logstash is primary for logs which are continuously written and one event per line. Unfortunately we have to deal with logs where it would we one event per logfile. For example:
************************************************************
Protokollstart: XX.XX.XXXX XX:XX:XX
SessionID: XXXXX - XXX.XXX.XXX.XXX - XXXX
Kommentar: DASY
DASY-Batchlauf für Aufgaben bis XX.XX.XXXX XX:XX:XX
Sachbearbeiter: XXXX
ACHTUNG: Echtlauf - Daten gespeichert
Selektierte Gläubiger - Achtung: keine Aufgaben auf Partnerakten betrachtet
XX - XXXXX
XX - XXXXX
XX - XXXXX
nur Aufgaben zum XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX betrachtet
nur Aufgaben zur Wiedervorlage XXXX betrachtet
************************************************************
Startzeit : XX.XX.XXXX XX:XX:XX
************************************************************
Es liegen keine Aufgaben zur Bearbeitung an.
insgesamt bearbeitete Anzahl Aufgaben: 0
************************************************************
Ende des DASY-Batchlauf für Aufgaben: XX.XX.XXXX XX:XX:XX
Statistik:
Warnungen: 0
Protokollende: XX.XX.XXXX XX:XX:XX
************************************************************
I know that there is a multiline plugin / codec, but we some problems to deal with.
There has to be an indicator whether the file is still written or finished, because there can occur large gaps between the writing of the file. The indicator should always be Protokollende: XX.XX.XXXX XX:XX:XX
The writing of the files can last multiple hours (we once had a workload running for 48 hours) and the event mustn't trigger until the in 1. defined indicator is reached.
Is there any way to implement these requirements with standard functionality?
I hope I described my problem the problem well enough. If there are any questions please let me know :)

Resources