ELK LOGGER ALT HVA NÅ? NSM NorCERT, Oslo Håkon Brynildsen SLIDE 1
AGENDA SENTRALISERT LOGGING Forstå viktighet av sentralisert logging Rask innføring i The Elastic Stack Erfaringer det siste året Eksempler fra den virkelige verden Spørsmål SLIDE 2
MÅLSETTING SENTRALISERT LOGGING Forstå viktighet av sentralisert logging Ha en verktøykasse for deteksjon av uønsket oppførsel Verdi og nytte SLIDE 3
SIKKERHET VS VIRKELIGHET SENTRALISERT LOGGING Følg fornuftige sikkerhetstiltak Hold systemene patchet Høy sikkerhet = mindre frihet? Du er fortsatt sårbar(!) SLIDE 4
LOGGER LIGGER OVERALT HVORDAN FÅ OVERSIKT Windows Eventviewer Powershell Linux syslog Authlog VPN logg E-post logg Applikasjonslogger etc SLIDE 5
BESTANDDELER ELK Elasticsearch Logstash Kibana http://www.elastic.co SLIDE 6
BESTANDDELER ELASTIC STACK Elasticsearch Logstash Kibana Beats http://www.elastic.co SLIDE 7
BESTANDDELER ELASTIC STACK Elasticsearch Logstash Kibana Beats http://www.elastic.co nxlog http://nxlog-ce.sourceforge.net SLIDE 8
ALTERNATIVER TIL ELASTIC SENTRALISERT LOGGING Splunk Graylog Arcsight OSSIM SLIDE 9
HVORFOR SENTRALISERTE LOGGER? ER DET VERDT DET? Hvorfor ikke? Sentralisert kontroll Ett sted for feilsøking Optimalisert søkemotor Historikk Avanserte metrics Compliance krav og rapportering SLIDE 10
TYPISK SÅRBARHETSUTNYTTELSE FREMGANGSMÅTE Rekognosering Utnyttelse av svakheter Passord cracking/gjenbruk/gjetting Installasjon av bakdør SLIDE 11
TYPISK SÅRBARHETSUTNYTTELSE AD Påloggingsforsøk - ordinær arbeidstid? Mange påloggingsforsøk som har feilet Antall låste brukere Legge til/fjerne brukere i AD Priviligerte grupper SLIDE 12
Å LESE LOGGER LINUX Påloggingsforsøk - ordinær arbeidstid? Mange påloggingsforsøk som har feilet SUDO oppslag SLIDE 13
SAMMENLIKNING AV HASTIGHET EVENTLOG Eventviewer => magi Powershell Linux commandline Web / API SLIDE 14
SAMMENLIKNING AV HASTIGHET POWERSHELL Eventviewer => magi Powershell => please wait... Linux commandline Web / API SLIDE 15
SAMMENLIKNING AV HASTIGHET LINUX SHELL Eventviewer => magi Powershell => please wait... Linux commandline => kung fu Web / API SLIDE 16
SAMMENLIKNING AV HASTIGHET WEB / API Eventviewer => magi Powershell => please wait... Linux commandline => kung fu Web / API => sikkert fin, den SLIDE 17
SAMMENLIKNING AV HASTIGHET ELASTIC STACK Eventviewer => magi Powershell => please wait... Linux commandline => kung fu Web / API => sikkert fin, den Elastic Stack => :) SLIDE 18
Å FINNE INNHOLD BRUKER SØK TargetUserName: testbruker SLIDE 19
Å FINNE INNHOLD ENDRING AV RETTIGHETSGRUPPER TargetUserName: testbruker Category: Security Group Management SLIDE 20
Å FINNE INNHOLD DNS SØK TargetUserName: testbruker Category: Security Group Management DNSRecord: * AND Direction Rcv SLIDE 21
Å FINNE INNHOLD SUDO SØK TargetUserName: testbruker Category: Security Group Management DNSRecord: * AND Direction Rcv Category: sudo SLIDE 22
Å FINNE INNHOLD E-POST LOGGER TargetUserName: testbruker Category: Security Group Management DNSRecord: * AND Direction Rcv Category: sudo Mail logger SLIDE 23
Å FINNE INNHOLD TO MANAGMENT WITH LOVE TargetUserName: testbruker Category: Security Group Management DNSRecord: * AND Direction Rcv Category: sudo Mail logger Ledelsesvennlig SLIDE 24
Å FINNE INNHOLD ØYEBLIKKSBILDE M/HISTORIKK TargetUserName: testbruker Category: Security Group Management DNSRecord: * AND Direction Rcv Category: sudo Mail logger Ledelsesvennlig SLIDE 25
INSTALLASJON SENTRALISERT LOGGING Repo for APT og YUM http://www.elastic.co/ Oppdatering fra 1.x -> 2.x krever noe arbeid SLIDE 26
TEST AV VELLYKKET INSTALLASJON SENTRALISERT LOGGING Test Elasticsearch fra shell curl XGET 'localhost:9200/_search?pretty' curl XGET 'localhost:9200/_cluster/health?pretty' Sørg for testdata Push data inn i Elasticsearch Åpne Kibana i nettleser http://elk:5601/ Generer initiell index Velg '@timestamp' i time-field name Trykk 'Create' for logstash-* SLIDE 27
EKSEMPEL INSTALLASJON SENTRALISERT LOGGING SLIDE 28
KONFIGURASJON LOGGKJEDE SENTRALISERT LOGGING Kilde (Linux rsyslogd) bruker@enserver $ cat /etc/rsyslog.d/10-syslog-forwarder.conf *.* @1.2.3.4:514 # action(type="omfwd" Target="1.2.3.4" Port="514" Protocol="udp") SLIDE 29
KONFIGURASJON LOGGKJEDE SENTRALISERT LOGGING Forwarder (Linux rsyslogd) bruker@syslog.serversone $ cat /etc/rsyslog.conf.. $ModLoad imtcp $UDPServerRun 514.. bruker@syslog.serversone $ cat /etc/rsyslog.d/10-syslog-forwarder.conf template(name="json3" type="string" string="%rawmsg:::drop-last-lf%") if $msg contains '"OSType":"Windows"' or $msg contains '"SourceModuleName":"in_dnslog"' or $msg contains '"SourceName":"exchange_msgtrk_log"' then { action(type="omfwd" Target="1.2.3.4" Port="514" Protocol="udp" Template="json3") stop } else { action(type="omfwd" Target="1.2.3.4" Port="514" Protocol="udp") } SLIDE 30
KONFIGURASJON LOGGKJEDE SENTRALISERT LOGGING Forwarder (Linux rsyslogd) bruker@syslog.sikkersone $ cat /etc/rsyslog.conf.. $ModLoad imtcp $UDPServerRun 514.. bruker@syslog.sikkersone $ cat /etc/rsyslog.d/10-syslog-forwarder.conf template(name="json3" type="string" string="%rawmsg:::drop-last-lf%") if $msg contains '"OSType":"Windows"' or $msg contains '"SourceModuleName":"in_dnslog"' or $msg contains '"SourceName":"exchange_msgtrk_log"' then { action(type="omfwd" Target="1.2.3.4" Port="514" Protocol="udp" Template="json3") stop } else { action(type="omfwd" Target="1.2.3.4" Port="514" Protocol="udp") } SLIDE 31
KONFIGURASJON LOGSTASH ELK Input bruker@elk $ cat /etc/logstash/conf.d/30-inputs.conf input { tcp { port => 9999 host => "0.0.0.0" type => "eventlog" } udp { port => 514 host => "0.0.0.0" } tcp { port => 1514 host => "0.0.0.0" type => "syslog" } NB: Å } lytte til privilegerte porter ( <1024) vil kreve at logstash kjører som root. Alternativ: Bruk lokal rsyslogd og videresend fra udp port 514 til en høyere port for logstash. Bruk Iptables: iptables t nat A PREROUTING p udp destination-port 514 j REDIRECT to-ports 9514 (Husk i det tilfellet på å sørge for at iptables reglene overlever reboot!) SLIDE 32
KONFIGURASJON LOGSTASH ELK bruker@elk $ cat /etc/logstash/conf.d/60-eventlog.conf filter { } Filter if [type] == "eventlog" { json { source => "message" } } bruker@elk $ cat /etc/logstash/conf.d/55-syslog.conf filter { if [type] == "syslog" { grok { source => "Grok-magic here!" } } } SLIDE 33
KONFIGURASJON LOGSTASH ELK Output bruker@elk $ cat /etc/logstash/conf.d/70-outputs.conf output { elasticsearch { host => localhost protocol => http embedded => false } if [type] == "eventlog" { file { path => "/var/log/eventlog.log" } } } SLIDE 34
KONFIGURASJON LOGSTASH ELK Filter (Grok - SUDO logger) bruker@elk $ cat /etc/logstash/conf.d/40-authlog.conf filter { if [type] == "syslog" and [message] =~ /USER\=.*\ \;\ COMMAND\=/ { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:Category}\:\s+%{DATA:TargetUserName}\ \:\.*\;\ USER\=%{DATA:SubjectUserName} \; COMMAND=%{GREEDYDATA:Command}" } } } } Oct 02 11:37:03 testmaskin.bedrift.no sudo: testbruker : TTY=pts/4 ; PWD=/etc ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/auth.log SLIDE 35
KONFIGURASJON LOGSTASH ELK Filter (Grok - SUDO logger) bruker@elk $ cat /etc/logstash/conf.d/40-authlog.conf filter { if [type] == "syslog" and [message] =~ /USER\=.*\ \;\ COMMAND\=/ { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:Category}\:\s+%{DATA:TargetUserName}\ \:\.*\;\ USER\=%{DATA:SubjectUserName} \; COMMAND=%{GREEDYDATA:Command}" } } } } Oct 02 11:37:03 testmaskin.bedrift.no sudo: testbruker : TTY=pts/4 ; PWD=/etc ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/auth.log SLIDE 36
INSTALLASJON SENTRALISERT LOGGING http://nxlog-ce.sourceforge.net Windows Core Remote Desktop msiexec /i "\path\to\nxlog-2.8.1248.msi" Hvis ikke RDP er slått på: $ Enter-PSSession <maskinnavn> $ Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fdenytsconnections Value 0 $ Set-NetFirewallRule RemoteDesktop-UserMode-In-TCP Enabled True SLIDE 37
KONFIGURASJON NXLOG Powershell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf' define ROOT C:\Program Files (x86)\nxlog Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log <Input in> Module im_msvistalog # For windows 2003 and earlier use the following: # Module im_mseventlog </Input> <Output out> Module om_udp Host 192.168.0.1 Port 514 </Output> <Route 1> Path in => out </Route> SLIDE 38
KONFIGURASJON NXLOG Flere Loggkilder på samme server PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. # Default stuff <Input in_eventlog>.. </Input> <Input in_dnslog>.. </Input> <Output out>.. </Output> <Route 1> Path </Route> in_eventlog, in_dnslog => out SLIDE 39
KONFIGURASJON NXLOG Windows Eventlog PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. # Default stuff <Extension xm_json> Module xm_json </Extension> <Input in_eventlog> Module im_msvistalog Exec $EventSubject = $Message;$EventSubject =~ s/\r\n.*//s; </Input> <Output out> Module om_udp Host 1.2.3.4 Port 514 Exec $OSType = "Windows"; Exec $Hostname = hostname_fqdn(); Exec to_json(); </Output> <Route 1> Path </Route> in_eventlog => out SLIDE 40
SØK I KIBANA WINDOWS SECURITY LOGG SLIDE 41
SØK I KIBANA WINDOWS SECURITY LOGG SLIDE 42
SLIDE 43 KONFIGURASJON NXLOG Windows DNS logg PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. <Extension xm_json> Module xm_json </Extension> <Input in_dnslog> Module im_file File "C:/path/to/dns.log" InputType LineBased Exec $Message=$raw_event;$SourceIP=$raw_event;$DNSRecord=$raw_event; Exec $DNSRecord =~ s/^.*\]\s*//s; Exec Exec Exec Exec Exec SavePos ReadFromLast CloseWhenIdle $DNSRecordType = $DNSRecord;$DNSRecordType =~ s/\s.*$//; $DNSRecord =~ s/^\s*\w+\s*\(\d*\)//; $DNSRecord =~ s/\(\d*\)\s*$//;$dnsrecord =~ s/\(\d*\)/./g; $SourceIP =~ s/^.*\s+rcv\s+//;$sourceip =~ s/\s+.*$//; $EventSubject = "DNS lookup entry"; TRUE TRUE TRUE </Input> DNS Log example: 01.01.1970 13:37:00 09A4 PACKET 000000AD0B478590 UDP Rcv 192.168.0.20 \ 3654 Q [0001 D NOERROR] A (4)win8(4)ipv6(9)microsoft(3)com(0)
KONFIGURASJON NXLOG Windows DNS logg (forts) PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. # fortsetter <Output out> Module om_udp Host 1.2.3.4 Port 514 Exec $OSType = "Windows"; Exec $Hostname = hostname_fqdn(); Exec to_json(); </Output> <Route 1> Path </Route> in_eventlog, in_dnslog => out SLIDE 44
SØK I KIBANA DNS LOGG DNS Log example: 01.01.1970 13:37:00 09A4 PACKET 000000AD0B478590 UDP Rcv 192.168.0.20 \ 3654 Q [0001 D NOERROR] A (4)win8(4)ipv6(9)microsoft(3)com(0) SLIDE 45
KONFIGURASJON NXLOG Windows Exchange transaction logg PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. <Extension xm_exchange> Module xm_csv Fields $date-time,$client-ip,$client-hostname,$serverip,$server-hostname,$source-context,$connector-id,$source,$event-id,$internalmessage-id,$message-id,$recipient-address,$recipient-status,$totalbytes,$recipient-count,$related-recipient-address,$reference,$messagesubject,$sender-address,$return-path,$message-info,$directionality,$tenantid,$original-client-ip,$original-server-ip,$custom-data Delimiter ',' </Extension> <Input in_exchange> Module im_file File 'C:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\MessageTracking\MSGTRK????????-*.LOG' SavePos TRUE </Input> Exec Exec Exec if $raw_event =~ /HealthMailbox/ drop(); if $raw_event =~ /^#/ drop(); xm_exchange->parse_csv(); SLIDE 46
KONFIGURASJON NXLOG Windows Exchange transaction logg PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. <Extension xm_exchange> Module xm_csv Fields $date-time,$client-ip,$client-hostname,$serverip,$server-hostname,$source-context,$connector-id,$source,$event-id,$internalmessage-id,$message-id,$recipient-address,$recipient-status,$totalbytes,$recipient-count,$related-recipient-address,$reference,$messagesubject,$sender-address,$return-path,$message-info,$directionality,$tenantid,$original-client-ip,$original-server-ip,$custom-data Delimiter ',' </Extension> <Input in_exchange> Module im_file File 'C:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\MessageTracking\MSGTRK????????-*.LOG' SavePos TRUE Exchange Log example: 2015-09-30T23:00:22.432Z,127.0.0.1,MAILSERVERNAME,127.0.0.1,[127.0.0.1], \ 12AB12AB12AB12AB;250 ok: Message 507876 accepted,mailgw,smtp,send,12345, \ <12345678-1234-1234-1234-123456789abc@MAILSERVERNAME.domain.bedrift.no>, \ hakon.brynildsen@nsm.stat.no,250 recipient <hakon.brynildsen@nsm.stat.no> ok,1234,1,,, \ Password expires Exec in 8 days,systembruker@bedrift.no,systembruker@bedrift.no,2015-09- $raw_event =~ /HealthMailbox/ drop(); 30T23:00:21.247Z; Exec \ if $raw_event =~ /^#/ drop(); SRV=MAILSERVERNAME.domain.bedrift.no:TOTAL=1 SMR=1,Incoming,,,, Exec xm_exchange->parse_csv(); </Input> SLIDE 47
KONFIGURASJON NXLOG Windows Exchange transaction log (forts) PowerShell $ Get-Content 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'.. # fortsetter <Output out_exchange> Module om_udp Host 1.2.3.4 Port 514 Exec $OSType = "Windows"; Exec $Hostname = hostname_fqdn(); Exec $SourceName = 'exchange_msgtrk_log'; Exec to_json(); </Output> <Route exchange> Path in_exchange => out_exchange </Route> SLIDE 48
SØK I KIBANA EXCHANGE TRANSACTION LOGG Exchange Log example: 2015-09-30T23:00:22.432Z,127.0.0.1,MAILSERVERNAME,127.0.0.1,[127.0.0.1], \ 12AB12AB12AB12AB;250 ok: Message 507876 accepted,mailgw,smtp,send,12345, \ <12345678-1234-1234-1234-123456789abc@MAILSERVERNAME.domain.bedrift.no>, \ hakon.brynildsen@nsm.stat.no,250 recipient <hakon.brynildsen@nsm.stat.no> ok,1234,1,,, \ Password expires in 8 days,sysbruker@bedrift.no,sysbruker@bedrift.no,2015-09-30t23:00:21.247z; \ SRV=MAILSERVERNAME.domain.bedrift.no:TOTAL=1 SMR=1,Incoming,,,, SLIDE 49
Å LESE LOGGER EVENTLOG Påloggingsforsøk utenom ordinær arbeidstid Mange påloggingsforsøk i sekvens Feilede påloggingsforsøk (4625) Legge til/fjerne brukere i AD (4720) Grupper (4728 / 4732 / 4756) SLIDE 50
Å LESE LOGGER LINUX Påloggingsforsøk utenom ordinær arbeidstid Mange påloggingsforsøk i sekvens Mange påloggingsforsøk som har feilet SUDO oppslag SLIDE 51
Å LESE LOGGER DNSLOG Zone transfer (AXTR) Feilede DNS oppslag (NXDOMAIN) SLIDE 52
Å LESE LOGGER ANNET VPN logger Router logger Firewall logger DNS logger / Sone replikering Applikasjonslogger Webserver Databaseserver etc SLIDE 53
HVOR GÅ VIDERE SENTRALISERT LOGGING Watcher Elastic plugin (lisensiert) Shield Elastic plugin (lisensiert) Beats Elastic modul ElastAlert Pythonscript av Yelp (github) SLIDE 54
WE LOVE LOGS THE ELASTIC STACK Enkelt Gir oversikt Loggsøking er raskt Alt tilgjengelig i samme vindu Platform uavhengig SLIDE 55
Følg med på @NorCERT Twitter SLIDE 56