==============================================================================
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--------------------[ previous ]---[ index ]---[ next ]---------------------

------------------[ iNSTALLARE E C0NFiGURARE i TCP WRAPPERS ]-----------------
---------------------------------[ Pr3DaToR ]---------------------------------
 
Consumo: 3 Marlboro Rosse Standard ("Il fumo provoca il cancro")
         2 BigFruit al limone 
         
Saluti: SMaster (...per la sua pazienza!)
 
Musica ascoltata: Turn the Page - Metallica (Garage, Inc. 1998)
                  So What - Metallica (Garage, Inc. 1998)
                  Bleed - Soulfly (Soulfly, 1998)

- Introduzione -
La funzione dei tcp wrappers e' quella di monitorare e filtrare le richieste
di accesso a vari servizi di rete come SYSTAT, FINGER, TELNET, FTP, RLOGIN,
EXEC, TFTP, ecc. Essi, inoltre, permettono di negare o consentire l'accesso di
determinati host a determinati servizi (secondo i file di regole che vedremo
piu' avanti), di verificare che il client risponda alle specifiche RFC931, ma
soprattutto che tale client non cerchi di impersonare l'host address o l'host
name di altri client. Tale caratteristica e' particolarmente importante nei
sistemi che utilizzano servizi come RSH o RLOGIN dove l'hostname del client ha
un ruolo fondamentale nel processo di autenticazione. A tale proposito i
wrapper, oltre ad effettuare un lookup del client per ottenerne l'IP,
effettuano anche una richiesta ad un secondo DNS per verificare che a tale
IP corrisponda effettivamente quel client. Se il wrapper rileva delle
differenze, o se la risposta del secondo DNS non e' disponibile, l'accesso
viene rifiutato. Se sul vostro sistema i wrappers sono stati compilati con
l'opzione -DPARANOID, viene sempre effettuata tale verifica, altrimenti viene
semplicemente eseguito un lookup del client. Per quanto riguarda l'host
address spoofing, e' compito del kernel, se opportunamente compilato,
rifiutare le richieste di connessione da parte di IP numerici. Se il vostro
kernel non esegue tale operazione, potete sempre compilare i wrappers con
l'opzione -DKILL_IP_OPTIONS.
Se non temete lo spoofing, potete invece compilare i wrappers con
-DHOSTS_ACCESS consentendo solo semplici controlli o sull'host o sul servizio
richiesto (oppure una combinazione di entrambi).
Tengo a precisare che l'utilizzo dei tcp wrappers e' invisibile dall'esterno
ed inoltre essi non intervengono, se non nella fase iniziale, nelle
comunicazioni tra client e server: i wrappers sono necessari solo all'avvio
dei demoni (ftpd, telnetd, fingerd, ecc.) richiesti da inted.
Le uniche limitazioni dei tcp wrappers riguardano gli attacchi con la tecnica
della predizione dei numeri di sequenza (sequence number guessing) e, meno
importante, l'utilizzo dei servizi RPC che appaiono in inetd.conf come rpc/tcp
come ad esempio rexd (ma fidatevi, non e' una grossa perdita).
Bene, prima di passare alla configurazione vera e propria dei tcp wrappers
assicuratevi che essi siano installati sul vostro sistema. Nelle distribuzioni
piu' recenti di Linux essi sono gia' compilati (con -DPARANOID!!) e installati
per cui potete passare direttamente alla loro configurazione). Controllate
quindi con find se nel vostro sistema e' presente il file tcpd (solitamente si
trova in /usr/sbin). Se non l'avete vi consiglio di aggiornare il vostro
intero sistema :), altrimenti scaricatevi i tcp wrappers 7.6 da:
ftp.cert.org/pub/tools/tcp_wrappers/tcp_wrappers_7.6.tar.gz
Assicuratevi che dopo l'installazione dei wrappers sia tcpd che tutti i file
da esso utilizzati abbiano un permesso 755 o 555 .
Proseguiamo ora con il verificare che il nostro /etc/inted.conf appaia
come segue:

ftp	stream	tcp	nowait	root	/usr/sbin/tcpd	wu.ftpd -l -i -a
telnet	stream  tcp     nowait  root    /usr/sbin/tcpd	in.telnetd
finger	stream	tcp	nowait	nobody	/usr/sbin/tcpd	in.fingerd -w
systat	stream	tcp	nowait	nobody	/usr/sbin/tcpd	/bin/ps	-auwwx
netstat	stream	tcp	nowait	root	/usr/sbin/tcpd	/bin/netstat	-a  

Ho riportato solo alcune linee d'esempio, l'importante e' notare che, nei
sistemi con i tcp wrappers, i demoni vengono eseguiti mediante tcpd. Quindi
tutti i servizi, ad esclusione di quelli identificati come internal (echo,
daytime, time, ecc.) devono essere preceduti da /usr/sbin/tcpd.
Anche per i demoni che hanno un pathname (percorso) arbitrario potete
aggiungere il loro percorso in questo modo:

telnet  stream  tcp  nowait  root /usr/sbin/tcpd /usr/local/in.telnetd 

Se avete apportato delle modifiche all'inted.conf ricordate che dovete farlo
"ripartire" se volete che tali modifiche abbiano effetto
( " ps -ax | grep inetd " per sapere il pid e " kill -HUP [pid] " ).
Editate ora il vostro /etc/syslog.conf per decidere dove andranno scritti, e
con quale criterio, i log prodotti dai wrappers. Un esempio potrebbe essere:

*.=info;*.=notice				/usr/adm/messages
*.=debug					/usr/adm/debug
*.err						/usr/adm/syslog

Questo significa che tutti i log con priorita' info e notice verranno
memorizzati in /usr/adm/messages, mentre i log con priorita' debug saranno
scritti in /usr/adm/debug infine i log con priorita' err li troviamo in
/usr/adm/syslog.
La sintassi della configurazione dei log e' quindi: classe.priorita logfile
Priorita' possono essere debug, info, notice, emerg, err, ecc... mentre per
classi si intendono kern, auth, lpr, ecc... Altri esempi di syslog.conf:

mail.debug /var/log/syslog 

Questo significa che tutti i log della classe mail con priorita' debug
(o superiore) verranno scritti in /var/log/syslog.
Se avete dei problemi con i file di log e non funzionano come vi aspettate,
usate syslogd -d per vedere cosa accade realmente.
Vi ricordo, a titolo informativo :) la locazione standard dei file di log di
alcuni os *nix:

aix - /var/adm/messages
dunix - /var/adm/syslog.dated/[DATA]/mail.log
hpux9&10 - /usr/spool/mqueue/syslog
irix - /var/adm/SYSLOG 
linux - /var/adm/messages 
solaris - /var/log/syslog 
sunos - /var/log/syslog

Siamo giunti ora nella fase piu' importante della configurazione dei wrappers.
Prima di proseguire nella modifica dei due file interessati, e piu'
precisamente /etc/hosts.allow e /etc/hosts.deny, sappiate che esistono,
sostanzialemte, due modi per controllare l'accesso al vostro sistema.
Il primo prevede di negare, per default, l'accesso a chiunque e consentire
l'uso di determinati servizi a determinati host agendo unicamente su
/etc/hosts.allow (mostly closed). Questo risulta essere un metodo
particolarmente sicuro se intendete consentire l'accesso al vostro sistema
solo ai vostri amici o a persone fidate. Se, al contrario, volete gestire un
sistema aperto a tutti (ad esempio un servizio ftp) potete consentire per
dafault l'accesso a qualsiasi host e negarlo a particolari host, agendo
unicamente su /etc/hosts.deny (mostly opened). Personalmente preferisco il
primo metodo, in quanto mi consente di controllare meglio chi rovista nel mio
filesystem ed essere sicuro che non fara' danni o scherzi stupidi come un
rm -r /* :). Quindi modificate il file /etc/hosts.deny in modo che appaia solo
questa entry (tutte le altre righe potete commentarle con un #):

ALL:ALL

In questo modo abbiamo negato, come detto prima, per default qualsiasi accesso
a qualsiasi servizio.
Vediamo, finalmente, come creare le "regole" di accesso al nostro sistema.
Supponiamo di avere un /etc/hosts.allow come il seguente:

in.fingerd: ALL : banners /usr/local/etc/banners/ : spawn (echo "Access from
%u@%h using %d." | sendmail root) : DENY
in.telnetd: .lamers.edu : DENY
ALL: .arcanet.it EXCEPT lamer.arcanet.it

Nella prima linea il servizio in.fingerd viene negato (DENY) a tutti (ALL) gli
host e ogni richiesta a questo servzio comporta l'invio di una email al root.
Inoltre, ad ogni tentativo di accesso, viene presentato all'utente del client
il banner specificato.
Nella seconda entry il servizio di telnet e' negato solamente a tutti gli
host che terminano con .lamers.edu.
Nell'utima entry tutti i servizi sono consentiti agli host che terminano con
.arcanet.it ECCETTO lamer.arcanet.it.
Avrete gia' dedotto che la sintassi delle entry in hosts.allow e' la seguente:

service: hostname: banners(opzionale) : options

"service" identifica, chiaramente, il servzio in questione (in.fingerd,
in.telnetd, in.ftpd ... dipende da cio' che appare nel vostro inetd.conf).
"hostname" permette di specificare il nome dell'host interessato. Si possono
inoltre utilizzare le wildcard come ALL (tutti), LOCAL (hostname dove non
appare nessun punto), UNKNOW (host sconosciuti), KNOW e PARANOID (host a cui
l'address non corrisponde): EXCEPT non e' considerato come wildcard ma
semplicemente come "operatore".
"banners" specifica quale banner (messaggio) visualizzare ad un client che
richiede un determinato servizio.
Infine "options" permette di eseguire dei comandi da shell come, ad esempio,
spedire una mail al root. E' possibile, inoltre, porre al termine di tale
comando la famosa & che permette di porre in background il processo o il
comando dichiarato. Inoltre i wrappers mettono a disposizione delle variabili
che iniziano con % (come avete visto nell'esempio) chiamate "espansioni",
alcune possono essere:
%a fornisce l'host address
%c fornisce maggiori informazioni sul client
%d nome del processo
%u username del client
Per maggiori dettagli vi consiglio, inoltre, di dare un'okkiata a
man hosts_access(5) .
Infine, dopo aver configurato i nostri /etc/hosts.allow e /etc/hosts.deny,
vediamo di creare i file contenenti i banners, cioe' i messaggi che
appariranno al client. Essi possono essere messaggi di "benvenuto" o messaggi
di "rifiuto" (dipende dalle regole che avete stabilito :))
A tale proposito create, se necessario, la directory /usr/local/etc/banners
nella quale creerete i vostri banners, ognuno per ogni diverso servzio:

/usr/local/etc/banners/in.telnetd   per il telnet
/usr/local/etc/banners/in.ftpd      per l'ftp

OK, siamo giunti al termine della configurazione dei tcp wrappers.
Ora dovete solamente controllare se il vostro hosts.allow e' formalmente
corretto, usate a tale scopo il comando tcpdchk il quale provvedera' a
notificarvi se ha trovato degli errori e se volete simulare l'utilizzo dei
wrapper utilizzate tcpdmatch.
Per il momento questo e' tutto... cosa ci sara' la prossima volta? Bho!

                                                         Pr3DaToR


--------------------[ previous ]---[ index ]---[ next ]---------------------
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
==============================================================================