Oggi parliamo ancora di #WEBSECURITY, in particolare di Splunk SIEM Apache LogFormat configuration, ovvero di come configurare i logs di Apache affinché siano leggibili da Splunk attraverso l’Universal Forwarder di Splunk che è il processo che invia i logs al server..
Iniziamo col dire che SIEM sta a significare Security Information and Event Management ovvero una tecnologia di sicurezza informatica che fornisce una visione unica e semplificata dei dati, approfondimenti sulle attività di sicurezza e capacità operative in modo da poter rilevare, indagare e rispondere efficacemente alle minacce alla sicurezza.
Uno dei principali prodotti dedicati a SIEM è appunto Splunk; anche se Splunk trova riduttivo definire il proprio prodotto “solo” SIEM. Preferiscono infatti definirla una piattaforma che permette di tenere sotto controllo (observability) tutti i dati aziendali, indipendentemente da dove siano archiviati, ma soprattutto di trasformare i dati in azioni (rendere i dati actionable).
In questo articolo vedremo come configurare i logs di Apache affinché possano essere analizzati con Splunk.
Indice dei contenuti
- Splunk SIEM Apache LogFormat Configurazione
- Configurazione Splunk Universal Forwarder
- Start di Splunk Universal Forwarder su server Apache
- Conclusione
Let’s go!
Splunk SIEM Apache LogFormat Configurazione
Splunk supporta diverse piattaforme di injection dei dati, ma come sappiamo Apache httpd è tra i webserver più utilizzati. Ci concentreremo pertanto su questa tecnologia.
Ma come facciamo a inviare i logs a Splunk? Lo faremo attraverso Splunk Universal Forwarder, che è lo strumento utilizzato per prelevare i logs, utilizza un formato dei logs di tipo json. Ciò significa che dovremo configurare Apache per scrivere i logs in formato JSON.
Per potere abilitare questa tipologia di logs è necessario abilitare il modulo logio_module nel file di configurazione httpd.conf del nostro Apache:
LoadModule logio_module modules/mod_logio.so
ApacheConfigurazione LogFormat Apache per Splunk
A questo punto non ci resta da fare altro, nello stesso file di configurazione di Apache in cui abbiamo abilitato il mod_logio, che preparare il formato del log aggiungendo le seguenti righe di configurazione:
<IfModule logio_module>
LogFormat "time=%{%s}t.%{usec_frac}t, bytes_in=%I, bytes_out=%O, cookie=\"%{Cookie}i\", server=%v, dest_port=%p, http_content_type=\"%{Content-type}i\", http_method=\"%m\", http_referrer=\"%{Referer}i\", http_user_agent=\"%{User-agent}i\", ident=\"%l\", response_time_microseconds=%D, client=%h, status=%>s, uri_path=\"%U\", uri_query=\"%q\", user=\"%u\"" splunk_kv
</IfModule>
ApacheCome potete notare (ultima parola della riga che inizia con LogFormat), abbiamo chiamato, secondo le indicazioni di Splunk, questo formato di log: splunk_kv. Nulla toglie che possiamo chiamarlo come vogliamo.
Particolarmente importante da sottolineare è che il campo cookie=\”%{Cookie}i\” scrive moltissimi dati, e questo potrebbe essere un problema, sopratutto in termini di performance, se il vostro sito web riceve molto traffico. In tal caso, il consiglio che mi sento di darvi, e sempre qualora non ne abbiate assoluto bisogno, è quello di azzerare il campo Cookie, modificando la configurazione come segue:
<IfModule logio_module>
LogFormat "time=%{%s}t.%{usec_frac}t, bytes_in=%I, bytes_out=%O, cookie=\"\", server=%v, dest_port=%p, http_content_type=\"%{Content-type}i\", http_method=\"%m\", http_referrer=\"%{Referer}i\", http_user_agent=\"%{User-agent}i\", ident=\"%l\", response_time_microseconds=%D, client=%h, status=%>s, uri_path=\"%U\", uri_query=\"%q\", user=\"%u\"" splunk_kv
</IfModule>
ApacheA questo punto abbiamo il formato adatto di log che Splunk si aspetta. Non ci resta che scrivere il log secondo il formato appena creato.
Scrittura del log Apache con il LogFormat adatto a Splunk
Come detto, il formato del log necessario a Splunk è pronto. Andiamo ora a creare un nuovo file di log e associamolo al formato appena creato. Dobbiamo ricordarci prima di tutto che il nome che abbiamo assegnato a questo LogFormat è splunk_kv.
Andiamo quindi a editare il file di configurazione del nostro VirtualHost e inseriamo la seguente riga:
<IfModule log_config_module>
CustomLog "/var/log/apache2/iegri.com.log" splunk_kv
</IfModule>
ApacheCome potete vedere non abbiamo fatto altro che creare un nuovo file di log che nel nostro esempio verrà scritto nel path /var/log/apache2/iegri.com.log secondo il formato precedentemente chiamato splunk_kv.
Chiaramente, potete scegliere sia il path che il nome del file che verrà prodotto. Inoltre, qualora abbiate scelto un nome diverso da splunk_kv, dovrete modificare la configurazione, sostituendo splunk_kv, con il nome da voi scelto.
Apache Splunk LogFormat output
Ma cosa dobbiamo aspettarci da quanto appena fatto? Se tutto è stato fatto a dovere, l’output del logfile di Apache per Splunk appena configurato dovrà rispettare il seguente output:
time=###TIME###.000000, bytes_in=###BYTES_IN###, bytes_out=###BYTES_OUT###, cookie="###COOKIE###", server=xxxxxxxx.domain, dest_port=###DEST_PORT###, http_content_type="###HTTP_CONTENT_TYPE###", http_method="###HTTP_METHOD###", http_referrer="###HTTP_REFERRER###", http_user_agent="###HTTP_USER_AGENT###", ident="1", response_time_microseconds=###RESPONSE_TIME_MICROSECONDS###, client=###CLIENT###, status=###STATUS###, uri_path="###URI_PATH###", uri_query="###URI_QUERY###", user="xyz123"
ApacheConfigurazione Splunk Universal Forwarder
Ora che il nostro file di log di Apache è pronto, non ci resta altro da fare che configurare l’Universal Forwarder di Splunk (UF), che è il processo che prende in carico ed elabora i logs.
Prima di tutto dovete eseguire il download dell’Universal Forwarder. L’UF è disponibile sia come pacchetto rpm che come binario. In questo tutorial prenderemo in esame la versione binaria, in quanto può essere copiata in qualunque path della macchina e non ha bisogno di credenziali di root per essere installata.
Nel nostro esempio abbiamo installato splunkforwarder-9.0.0-6818ac46f2ec-Linux-x86_64.tgz nella cartella /dev del nostro file-system. Scompattando il file, verrà creata la cartella splunkforwarder.
A questo punto, nel path in cui abbiamo installato splunkforwarder, dobbiamo andare a recuperare il file inputs.conf, all’interno del quale dobbiamo inserire i riferimenti al file di log di Apache per Splunk precedente creato. Il file dovrebbe essere in etc/apps.
[monitor:///var/log/apache2/iegri.com.log]
index = myindex
sourcetype = apache:access:kv
disabled = 0
ApacheI 3 “/” NON sono un errore. Infatti, nella sezione monitor, dovrete inserire un doppio /, ovvero “//”, e poi il path completo che inizia appunto con un altro /. Da qui i 3 slash iniziali.
Prima di far partire il servizio, assicuratevi che il vostro server Splunk sia raggiungibile. Per capire quale sia il server e per verificarne la raggiungibilità, potete aprire il file output.conf, anch’esso sito in etc/apps. Potete trovarlo andando nella cartella splunkforwarder e lanciando il comando:
find . -name outputs.conf
ShellScriptAll’interno del file troverete la stringa server = 10.x.x.x:PORT. Eseguite un telnet dal vostro Apache verso la macchina indicata nel file output.conf. Per fare un esempio, simuliamo che il nostro server Splunk a cui inviare i logs sia server = 10.10.10.10:5000:
telnet 10.10.10.10 5000
ShellScriptSe dal comando otterrete un output come questo:
Connected to 10.10.10.10.
Escape character is '^]'
ShellScriptallora il vostro server è raggiungibile e potrete far partire l’agent di splunkforwarder.
Start di Splunk Universal Forwarder su server Apache
Quanto fatto finora ci ha permesso di preparare il formato di log di Apache adatto a Splunk e di iniziare scrivere il file di log secondo il formato precedentemente creato. Abbiamo inoltre configurato l’Universal Forwarder di Splunk per andare a recuperare il file di log di Apache che stiamo scrivendo.
A questo punto non ci resta altro da fare che far partire il processo dell’Universal Forwarder di Splunk che ci permetterà di inviare i nostri logs di Apache al server Splunk.
Quindi, andiamo nella cartella in cui abbiamo installato il nostro Universal Forwarder, che ne nostro esempio è in /dev/splunkforwarder e navighiamo nella cartella bin. Siamo quindi in /dev/splunkforwarder/bin da cui possiamo lanciare il comando:
./splunk start
ShellScriptche dovrebbe far partire un processo che si chiama splunkd.
La prima volta che il processo parte, vi chiederà una Username e una Password. Segnatevele :). Il messaggio che apparirà sarà il seguente:
This appears to be your first time running this version of Splunk.
Splunk software must create an administrator account during startup. Otherwise, you cannot log in.
Create credentials for the administrator account.
Characters do not appear on the screen when you type in credentials.
Please enter an administrator username:
Qualche consiglio utile:
- Il processo splunkd può partire anche come daemon. Ciò permette di riavviarlo automaticamente al riavvio del server. Se non avete i privilegi per creare un daemon, chiedete aiuto al vostro supporto.
- Assegnate la variabile $SPLUNK_HOME alla home directory in cui avete scompattato l’Universal Forwarder. Nel nostro caso di esempio avremo export $SPLUNK_HOME = /dev/splunkforwarder
Questo vi permetterà di eseguire lo start tramite il comando $SPLUNK_HOME/bin/splunk start
Splunk SIEM Apache LogFormat – Conclusioni
Arrivati a questo punto il nostro SIEM Splunk è pronto e se tutto è stato fatto “a mestiere”, e se il vostro server è correttamente configurato, dovreste iniziare a poter vedere i vostri logs di Apache nella console Splunk.
Spero che l’articolo vi sia risultato utile, in tal caso, potreste condividerlo 🙂 .
Se avete dei dubbi o se volete condividere il vostro punto di vista, scrivete nei commenti e cercherò di rispondere al più presto.
Se volete restare in contatto, vi lascio anche il link della mia newsletter di LinkedIn.
Principal Web Solutions Architect – Technology & Architecture Manager @ Accenture – Google Cloud Certified – Professional Cloud Architect
Parla di #web, #cloud, #websecurity, #webperformance e #webarchitecture