Soluzione Open source per la gestione dei LOG

Navigation:  Reparto Hardware e Sistemi > Operativo > Linux > Creazione Log Server >

Soluzione Open source per la gestione dei LOG

Previous pageReturn to chapter overviewNext page

Soluzione open source per gestione dei log

 

Premesse burocratiche e considerazioni tecniche generali

 

Secondo la legge, l’amministratore di sistema è la figura professionale finalizzata alla gestione e alla manutenzione di un sistema informatico o di sue componenti. Ai fini del provvedimento vengono considerati tali gli amministratori di database, gli amministratori di reti e di apparati di sicurezza e gli amministratori di sistemi software complessi.

 

La registrazione degli accessi al sistema informatico da parte degli amministratori di sistema devono essere conservate almeno 6 mesi e devono avere caratteristiche di completezza, inalterabilità e possibilità di verifica della loro integrità adeguate al raggiungimento dello scopo di

verifica per cui sono richieste.

 

Contenuto Access Log: devono includere account utilizzato, data e ora dell'evento (timestamp), descrizione dell'evento (sistema di elaborazione o software utilizzato, se si tratti di un evento di log-in, di log-out, ecc.). Non occorre tenere traccia delle attività interattive.

 

Da quanto richiesto dalla legge, per garantire integrità, è necessario garantire sicurezza in tutto il data path del sistema, non solo nel layer di trasporto o in quello di memorizzazione. La raccolta deve perciò avvenire necessariamente in real time (tramite syscall, handles, modifiche di bassissimo livello). Il protocollo di trasporto dovrebbe anch'esso essere affidabile (idealmente con controllo di sequenza anche a livello applicativo; TCP non lo ha) e sicuro (autenticazione e validazione del mittente).

 

L'amministratore di sistema ha, per definizione, il controllo completo sui sistemi amministrati; è perciò pressoché impossibile essere certi di poter controllare tutte le sue attività.

In ogni caso, come minimo, il sistema che si vuole costruire per la conservazione dei log deve/dovrebbe essere al di fuori di qualsiasi possibilità d'intervento da parte degli amministratori.

In ogni caso, come è logico che sia, se non mi posso fidare del mio amministratore di sistema, i problemi lato sicurezza applicativa sono bel maggiori del soddisfare i requisiti richiesti dal garante.

 

Gestione utenze amministrative

 

Se gli amministratori di sistema sono più di uno, è bene innanzitutto notare che le operazioni di amministrazione non possono essere effettuate tutte tramite il generico utente Administrator o root, ma devono poter essere effettuate dagli utenti appositamente designati e tracciati.

Analogamente, anche per l'accesso ai database bisognerebbe istituire regole ben precise, con credenziali d'accesso per manutenzione diverse da quelle impiegate in esercizio.

 

Lato linux, dunque, in presenza di più amministratori l’account root non può più essere impiegato da più persone, quindi si devono necessariamente usare gli super users da assegnare a tutti gli amministratori di sistema.

La gestione è fortunatamente semplice; creato un generico gruppo “amministratori”, basta fare

 

useradd -G amministratori -m -s /bin/bash nomeamministratore

passwd nomeamministratore

 

Nel file /etc/ssh/sshd_config si aggiunge

 

AllowUsers nomeamministratore

 

E poi, tramite visudo, si crea la semplicissima policy:

 

%amministratori  ALL=(ALL)       ALL

 

In questo modo gli amministratori dovranno loggarsi con il loro account ed usare il comando sudo per scalare i privilegi.

 

Fatto questo è possibile modificare la password di root e “metterla in cassaforte” senza la necessità di comunicarla agli amministratori, che non dovranno mai né impiegarla né conoscerla.

 

Analogamente, su sistemi Windows è necessario prevedere l’impiego di utenti personali per i vari amministratori di sistema ed inibire l’utilizzo dell’utente “Administrator” per le normali operazioni amministrative (ovvero, cambiargli la password predefinita e non comunicarla agli amministratori).

 

Il log degli accessi amministrativi va registrato non solo per i server ma anche per i sistemi client se su queste macchine si gestiscono dati personali. Per fare questo le macchine client è bene che abbiamo Windows in versione Professional (nb: bisognerebbe vedere se il tool Snare di cui parleremo in seguito funziona anche sulle versioni Home… va provato, non trovo informazioni in merito ma non credo giacché è presumibile che poggi sullo stesso layer del gestore eventi).

 

Centralizzazione automatica dei log Linux e Windows

 

Il nostro obiettivo è avere una macchina dedicata (virtuale o fisica) che abbia funzionalità di logserver, in grado di servire sia sistemi Windows che sistemi Linux.

 

Il progetto si basa sui seguenti componenti:

-il demone rsyslogd per i sistemi Linux, ove possibile;

-il demone syslogd per i sistemi Linux vecchissimi che non supportano rsyslogd;

-il tool Snare per Sistemi Windows; è un demone rsyslogd-like sviluppato per i sistemi MS.

-il demone stunnel per creare, se lo si desidera, un tunnel protetto verso il logserver.

 

NB: Quis custodiet ipsos custodes? Come misura ulteriore, la macchina log server può non essere resa accessibile agli amministratori di sistema, ma solo ad esempio al titolare del trattamento dei dati.

 

Gestione log su Linux

 

Il risultato da raggiungere è costruire una gestione dei log centrale basata sul seguente schema logico: Logclient –> Demone di logging locale à demone di logging remoto à archivio log centralizzato sul logserver.

 

In particolare, per i sistemi Unix, i processi utenti scrivono su /dev/log, mentre le routine del kernel su /dev/klog; tramite rsyslogd (o anche il più vecchio syslogd, con qualche limite) è possibile reindirizzare i log (o parte di essi tramite un filtro con template) e salvarli in locale o inviarlo via rete ad una terza parte.

 

Partiamo dal più vecchio tool Syslog; Syslogd lavora in remoto con UPD alla porta 514; ha un funzionamento di tipo best effort. Non è in grado di cifrare i dati, ha un sistema di filtering scarsissimo e non bufferizza.

 

Il demone syslogd riceve i messaggi relativi agli eventi e confronta gli stessi con quanto presente

in /etc/syslog.conf; ad esempio, una regola elementare è

 

mail.info        /var/log/maillog

mail.*                /var/log/verbosemaillog

*.* |                /var/log/useless.log

kern.debug        root

*.*;                authpriv.none /myProgram

Local0.*        @192.168.0.1

 

Di default syslogd lavora solo in locale; per abilitarlo a lavorare in remoto occorre passargli uno switch (SYSLOGD_OPTIONS="-r -m 0" → /etc/sysconfig/syslog)

 

Per sopperire alle mancanze di syslogd nel 2004 è stato sviluppato rsyslogd come estensione di syslogd; rsyslogd supporta i template, i formati, i filtri, supporta TCP, supporta RELP, è in grado di bufferizzare e lavorare in modalità asincrona (posticipare invio dei log se la macchina è carica di lavoro); rsyslogd in particolare può lavorare in parallelo a stunnel per gestire la RELP.

 

Per la creazione di un sistema centralizzato di gestione dei log (sia per Linux che per Windows) occorre creare una macchina (Linux) che faccia le funzioni di logserver. Su questa macchina e su tutte gli altri server linux da controllare (che chiameremo logclient) occorre installare rsyslogd e, se non risolto automaticamente come dipendenza, rsyslogd-relp; rsyslog in realtà ha già da tempo preso il posto di syslog nelle distribuzioni moderne, ma è comunque un pacchetto disponibile anche per le più vecchie.

 

 

Configurazione rsyslogd lato client

 

Installato rsyslogd sui client (se non presente), occorre modificare il file /etc/rsyslog.conf inserendo quanto segue nella sezione MODULES

 

# abilitare il supporto per RELP, UNIX socket e klog

$ModLoad omrelp

$ModLoad imuxsock

$ModLoad imklog

 

E quanto segue nella sezione RULES

 

# inviamo i soli log che ci interessano al logserver sulla porta (TCP) 2514

auth.*;authpriv.*;local1.* :omrelp:IPDELSERVERLOG:2514;RSYSLOG_ForwardFormat

 

Sulle eventuali macchine legaci che non supportassero rsyslogd prevederemo l’invio dei log senza RELP tramite UPD alla porta 514 in modalità best effort; non è purtroppo possibile fare di meglio.

 

Per queste macchine, sul file /etc/ssyslog.conf bisogna modificare la riga

 

auth, authpriv.* /var/log/auth.log e farla diventare

 

auth, authpriv.* @IPDELLOGSERVER

 

 

 

 

Configurazione rsyslogd lato logserver

 

Sul log server nel file /etc/sysconfig/rsyslog è bene sostituire SYSLOGD_OPTIONS=”-m 0″ con SYSLOGD_OPTIONS=”-m 0 -r” (è il flag abilitativo alle connessioni remote; per molte distribuzioni è facoltativo e il flag –r viene aggiunto in automatico in caso di server di destinazione non localhost nei file rsyslogd.conf e syslogd.conf).

 

Il file /etc/rsyslogd.conf occorre abilitare l’UPD server sulla 514 e abilitare l’imuxsock e l’imrelp (sui client, giustamente, si avvia l’omrelp in output):

 

$ModLoad imudp

$UDPServerRun 514

$ModLoad imrelp

$InputRELPServerRun 9999

$ModLoad imuxsock

$ModLoad imklog

 

Nel file /etc/rsyslog.conf si può creare un template per organizzare in maniera comoda i log per mese/giorno/host di origine:

 

$template DynAuth, “/var/log/REGISTRAZIONI/%$MONTH%/%$DAY%/%FROMHOST%.log”

 

local1.*,user.*,auth.*,authpriv.*,kern.* ?DynAuth

 

$EscapeControlCharactersOnReceive off

 

%msg:::space-cc%

 

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

 

authpriv.*                                              /var/log/secure

 

mail.*                                                  -/var/log/maillog

 

cron.*                                                  /var/log/cron

 

*.emerg                                                 *

 

uucp,news.crit                                          /var/log/spooler

 

local7.*                                                /var/log/boot.log

 

local3.*                                                /var/log/varie.log

 

 

Configurazione lato macchine Windows

 

Sulle macchine Windows, si può impiegare per prelevare i log un tool chiamato Snare Agent for Windows; è un pacchetto open source che installa un servizio per il log degli eventi su windows ed è amministrabile tramite una pagina web. E’ possibile anche scegliere se permettere o meno l’accesso remoto alla pagina di configurazione del servizio, che si fa via browser su localhost:6161. Utente e password di default sono snare/snare.

 

La configurazione da impostare per avere il log remoto è sulla pagina network. Basta impostare  Destination Snare Server address con l’indirizzo IP del server di log e come destination port la 514. Attivare Enable Syslog Header e selezionare come syslog facility auth, con livello notice.

 

In questo modo, in /var/log/auth.log verranno registrati login, logout ed errori di login delle macchine configurate.

 

Gli eventi vengono identificati tramite un ID Event che è 528 per il login,538 per il logout; la variabile “Type” ha valore 2 per accesso locale e valore 3 per accesso effettuato via rete.

 

Inalterabilità dei log

 

La non alterabilità è la parte più complessa, dato che perlomeno teoricamente qualsiasi algoritmo crittografico può essere violato; la garanzia di non modificabilità in questo senso non è MAI ottenibile.

 

Abbiamo due termini da considerare:

 

-Per cercare di “validare” i log raccolti e proteggerli da modifiche, può essere sufficiente l’idea di fare partire, ogni X ore, sul logserver, un cron che crei un md5 di tutti i file di log, in modo da poter verificare, a posteriori, un tentativo di illegittima modifica dei file di log.

-Per prevenire la modificabilità dei log mentre questi vengono prelevati dai singoli sistemi, occorre impiegare un tunnel di invio cifrato dei log via stunnel, possibile solo per client linux con rsyslogd. Notare che questa strada non mi garantisce l’inalterabilità dei log quando sono sul logserver (che, come detto, è improponibile); stiamo parlando di una opzione integrativa al punto precedente.

 

Validazione con MD5

 

Per la validazione, posso creare uno shell script semplicissimo di calcolo degli hash da mettere in /etc/cron.daily/ (o dove meglio credo)

 

#!/bin/bash

TMP=`/bin/date –date=’1 days ago’ +%m/%d`

FILE_NAME=”MD5-`/bin/date –date=’1 days ago’ +%m-%d`.md5″

DEST_DIR01=”/var/log/REGISTRAZIONI”

DEST_DIR=”$DEST_DIR01/$TMP/”

MD5_DIR=”/var/log/REGISTRAZIONI/HASH/”

cd $MD5_DIR

find  $DEST_DIR  -type f -exec md5sum {} \;  > $FILE_NAME

 

A questo punto posso far creare un tar.gz e salvare per farne un backup con le modalità da me ritenute più consone.

 

Tunnel protetto per per il prelievo dei log ^_^

 

 

Il punto due si basa sulla creazione di un tunnel locale su client e server tra rsyslog e stunnel; lo schema di comunicazione da creare è questo:

 

- Il logclient via rsyslog fa il send dei dati (a 127.0.0.1 su 60514)

- stunnel sullo stesso client accetta la richiesta locale e richiede la connessione al logserver via stunnel alla porta 60000

- il server accetta la richiesta dello stunnell del client e via rete si trasferiscono i dati

- i dati vengono passati a rsyslog (127:0.0.1 su 60001).

 

Setup stunnel sui singoli client

 

Bisogna installare stunnel, quindi: editare /etc/default/stunnel4 per farlo partire automaticamente tramite il parametro ENABLED=1

 

Bisogna editare il file /etc/stunnel/stunnel.conf nel seguente modo:

 

- commentare la riga cert = xxxxx

- rimuovere il commento per client = yes

- commentare  le sezioni [pop3s], [ssmtp], [imaps]

- aggiungere le seguenti informazioni:

 

[rsyslog]

accept = 127.0.0.1:60514

connect = IPDELLOGSERVER:60000

 

Fare quindi ripartire il servizio: /etc/init.d/stunnel4 restart

 

Test: verificare che netstat -aln restituisca 127.0.0.1:60514.

 

Setup stunnel sul logserver

 

Installare stunnel e editare /etc/default/stunnel4 per far partire automaticamente il servizio col falg

ENABLED=1

 

Editare il file etc/stunnel/stunnel.conf nel seguente modo:

 

- commentare  le sezioni [pop3s] [ssmtp] e [imaps]

- cambiare cert=/etc/stunnel/mail.pem in cert=/etc/stunnel/stunnel.pem

- aggiungere la seguente sezione:

 

[ssyslog]

accept = 60000

connect = 127.0.0.1:60001

 

Dobbiamo ora creare il file /etc/stunnel/stunnel.pem tramite il comando

 

openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout /etc/stunnel/stunnel.pem

 

Restartare stunnel e verificare che netstat -aln restituisca 0.0.0.0:60001 e 0.0.0.0:60000

 

Configurare relp per stunnel sui client

Occorre installare rsyslog e modificare il file /etc/rsyslog.conf aggiungendo quanto segue alla sezione MODULES:

 

$ModLoad omrelp

 

In /etc/rsyslog.conf aggiungere alla sezione “RULES":

 

auth.*;authpriv.*;local1.* :omrelp:127.0.0.1:60514

 

e restartare rsyslog.

 

Abilitare relp per stunnel sul logserver

 

Modificare /etc/rsyslog.conf e aggiungere nella sezione "MODULES" :

 

$ModLoad imrelp.so

$InputRELPServerRun 60001

 

La sezione RULES di /etc/rsyslog.conf è la stessa vista in precedenza per il trasferimento dati via tcp senza stunnel.

 

Restartare rsyslog /etc/init.d/rsyslog restart

 

Gestione log di servizi aggiuntivi aggiuntivi

 

Abilitare il logging su Oracle 9i

 

mkdir /var/log/oracle/

chown -R oracle:dba /var/log/oracle/

SHOW PARAMETER audit

ALTER SYSTEM SET audit_trail=OS SCOPE=SPFILE;

ALTER SYSTEM SET audit_sys_operations=TRUE SCOPE=SPFILE;

ALTER SYSTEM SET audit_file_dest=”/var/log/oracle” SCOPE=SPFILE;

AUDIT SESSION;

SHUTDOWN IMMEDIATE

startup

 

Occorre poi creare un cron sul logserver che filtra solo i login/logout e prelevi i risultati; non è possibile inviare i log a un remote syslog.

 

Abilitare il logging su Postgres

 

Bisogna modificare /usr/local/pgsql/data/postgresql.conf come segue:

 

log_destination = ‘syslog’

 

syslog_facility = ‘LOCAL1′

syslog_ident = ‘postgres’

log_connections = true

log_disconnections = true

log_duration = true

log_hostname = true

 

Abilitare il logging su MySql

 

Dato che mysql non supporta la scrittura di log su syslog si può risolvere nel seguente modo:

nel file /etc/my.cnf

 

nella sezione [mysqld] aggiungere

 

log=/var/log/mysql.log

 

Poi lanciare all’avvio il seguente comando:

 

tail -f /var/log/mysql.log | egrep –line-buffered ‘Connect|Quit’ | logger -p LOCAL1.info -t mysql &

 

e lo si salva nell’ rc.local e lo si mette anche nella sezione postrotate del logrotate in

 

/etc/logrotate.d/mysql-log-rotate

 

Abilitare il logging su Exchange

 

Per abilitare il logging sel mailserver:

Gestore sistema Exchange à Gruppi amministrativi à <nome> à server à NomeServer à tasto dx sul server à registrazione Diagnostica à MSExchangeIS à private o cassetta postale à Accessi = minima; Controllo accessi = minima (oppure logons=minima e access control = minima)

 

Poi su Snare: Creo un nuovo oggetto: à Identify the high level event = Any event(s) àEvent ID Search Term = 1009,1016,1013,1029 à General Search Term = * àSelect the User Match Type = Include à User Search Term = *admin* à Identify the event types to be captured = Success Audit + Failure Audit à Identify the event logs = Security  + Application àSelect the Alert Level = Critical