Previous
Contents
Next
TCP WRAPPER
E` un programma che permette di filtrare e monitorare le richieste verso un
particolare servizio di rete. Questo programma non ha nessuna interazione con
il lato client ed e` del tutto trasparente agli occhi degli utenti. Lo stesso
discorso vale per il lato server, una vaolta che il wrapper ha deciso di
accettare la connessione, passa "la palla" al server che non e` a conoscenza
dell'esistenza di questo filtro. Il wrapper infatti e` attivo solo all'atto
dell'instaurazione della connsessione, una volta accettata o scartata, non
interagisce piu` nella comunicazione.
Questo porta a due grossi vantaggi:
- i wrapper sono indipendenti dall'applicazione (sono utilizzabili con
qualsiasi servizio di rete) e lo stesso programma puo` controllare piu` di un
servizio senza bisogno di nessuna modifica;
- questo filtro, non interagendo ne` con il client ne` con il server, e`
invisibile dall'estermo.
E` possibile utilizzare utilizzare questo piccolo programmino in due modi
diversi:
- metodo semplice: il demone va spostato in un`altra directory, il nome del
file appena spostato va rimpiazzato con una copia del wrapper; in questo modo
non e` necessario toccare nessun file di configurazione;
- metodo avanzato: lasciare il demone dov'e` e modificare il superdemone inetd,
il cui file di configurazione e` /etc/inetd.conf
un esempio di configurazione di questo file potrebbe essere:
finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u
dove finger e` il servizio, stream indica il tipo di socket, tcp il tipo di
protocollo, nowait un flag, nobody il nome dell'utente con il quale gira il
demone, /usr/sbin/tcpd il TCPWRAPPER e in.fingerd e` il demone del serivzio
finger.
Perche` usare un tcpwrapper?
Perche` permette di negare l'accesso ad un particolare servizio, in maniera
uniforme e semplice, e di monitorare tutte le richieste.
Il wrapper manda i suoi log al demone syslogd.
Come controllare gli accessi?
L'accesso puo` essere controllare in base al tipo di servizio, in base all'host
del client, o in base ad una combinazione tra questi. Al verificarsi di una
connessione e` possibile fare eseguire uno script di shell in modo da
registrare al meglio la richiesta oppure per simulare un finto servizio da
utilizare come trappola.
Tramite l'utilizzo di un tcpwrapper, oltre al filtraggio delle connessioni
indesiderate, e` possible prevenire:
- host name spoofing: ci sono applicazioni tipo rsh e rlogin dove il nome del
client gioca un ruolo importante nell'autenticazione; in una piccola rete il
nome dell'host puo` essere ottenuto interrogando la tabella degli hosts
locale, avendo la certezza che il risultato e` attendibile. In una grande
rete e` necessario interrogare un server DNS esterno, la sicurezza del
sistema dipende quindi da un servizio che non e` sotto il nostro controllo;
il wrapper verifica che il risultato di una richiesta ip -> nome
corrisponde a quello di una richiesta nome -> ip, se il test ha successo
allora la connessione viene accettata altrimenti scartata. L'opzione in
compilazione -DPARANOID attiva di default questo test.
Per controllare la vere identita` del client e` possibile utilizzare il
protocollo IDENT.
- host address spoofing: piu` difficile e` idividuare se la macchina che tenta
di connettersi e` effettivamente quella che noi desideriamo o e` un'altra che
vuole farsi spacciarsi per quella da noi autorizzata. Compilando tpcd con
l'opzione -DKILL_IP_OPTIONS il wrapper rifiuta le connessioni con il flasg di
source routing attivato, opzione che ormai e` possibile specificare
anche al kernel.
Come si configura il wrapper?
Il demone tcpd utilizza due file di configurazione /etc/hosts.deny e
/etc/hosts.allow. Se in fase di compilazione non e` specificata l'opzione
-DPROCESS_OPTIONS questi file verranno ignorati.
L'accesso e` garantito se il servizio e/o client corrispondono ad un entry nel
file /hosts.allow, viene negato se c'e` un'occorrenza nel file /etc/hosts.deny,
e se non ha una entry in nessuno dei due file e` garantito.
Li sintassi di questi due file e` molto semplice:
lista_servizi : client [:script di shell da eseguire]
- lista_servizi e` un elenco di nomi di demoni ai quali il filtro deve essere
applicato, per nome si intende l' argv[0] oppure dei caratteri speciali
- client e` un elenco di nomi di client, per nomi si intende un ip, un nome
risolto, un indirizzo di rete oppure un carattere jolly.
- script di shell e` uno script che puo` essere utilizzato per
molgiorare la qualita` dei log oppure per realizzare una piccola trappola.
I caratteri jolly piu` usati, per indicare una lista di servizi, sono ALL e
LOCAL, mentre per indicare una lista di client sono ALL, LOCAL, KNOW, UNKNOW e
PARANOID (che corrisponde all'opzione in compilazione -DPARANOID). Esiste anche
l'opzione EXCEPT il cui significato e` ovvio.
Per avere maggiori informazioni sui caratteri jolly si veda la man pages
hosts_acces(5).
un esempio di file di configurazione puo` essere:
---- /etc/hosts.deny ----
ALL:PARANOID
---- /etc/hosts.allow ---------------
ALL: LOCAL 192.168.91.0/255.255.255.0
tutte le richieste a tutti i servizi provenienti da macchine esterne alla mia
rete locale saranno rifiutate.
Per verificare il corretto funzionamento delle regole del wrapper e` possibile
utilizzare un piccolo programmino chiamato tcpdmatch, mentre per virificare la
correttezza delle regole presenti nel file e` possibile usare tcpdchk.
Eseguire comandi al verificarsi di una connessione
Con tcpd e` possibile tenere sotto controllo eventuali connsessioni inderiderate grazie a dei piccoli script di shell scritti inseriti nell'apposito file di configurazione /etc/hosts.allow
Utilizzando una sittassi del genere:
daemon_list: client_list : shell_command
daemon_list: client_list : spawn shell_command
al verificarsi di una connessione verso un particolare servizio da un host determinato, verra` automaticamente seguito lo script "shell_command", permettendoci cosi` di ottenere il piu` informazioni possibili sull'host remoto che sta tentando di attaccarci. Ad esempio si possono lanciare programmini appositi che controllano il tipo di sistema del client, i dati dell'utente che tenta la connessione e cosi` via.
L'utilizzo di una "forma" rispetto all'altra dipende dalla versione di tcpd che si sta
utilizzando.
Se volessi essere avvisato da una mail ad ogni connessione telnet posso utilizzare un
comando simile a questo:
in.telnetd : ALL@ALL : spawn ( /bin/mail -s "telnet connection from: %a %u" lory ) &
con questa riga di comando ricevero` una mail ad ogni connessione telnet; i campi %a e %u indicano rispettivamente l'indirizzo del client e l'eventuale nome dell'utente che tenta di collegarsi.
La lista completa dei parametri e` contenuta nella manpages hosts_access(5)
Per suggerimenti, correzioni & co. scrivete a questo indirizzo: lorenzo.martignoni@technologist.com
Previous
Contents
Next