Debian e il controllo di servizi e demoni: differenze tra le versioni
mNessun oggetto della modifica |
mNessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
{{stub}} | |||
Uno dei primi passi da affrontare subito l' installazione della nostra Debian dovrebbe essere quello di accertarsi di quali servizi e demoni vengono lanciati dal sistema. Questa operazione permette un controllo migliore della sicurezza della nostra macchina ed una minore esposizione a rischi legati a intrusioni. | |||
In questa breve guida vedremo come controllare i servizi attivi, come eliminare quelli non necessari e come rendere più sicuri quelli che intendiamo utilizzare. | |||
Buona lettura & happy debian! | |||
=== | =Concetti di base= | ||
==Servizi & Demoni== | |||
In un sistema operativo si definisce "servizio" (o anche "demone") un processo in background che gira autonomamente, senza intervento da parte dell' utente, o comunque con una interazione ridotta al minimo. Un esempio di servizo è il server web Apache: il server viene controllato dal demone "httpd" che gira in background, resta in ascolto sulla porta indicata e serve le pagine richieste. | |||
= | =Strumenti= | ||
GNU/Linux fornisce una nutrita schiera di programmi che ci permettono di intergire con i servizi attivi sulla nostra macchina. Di seguito riporto quelli più usati nell' amministrazione di un sistema Debian. | |||
=== | ==netstat== | ||
Netstat è uno dei programmi più utilizzati ed utili: permette di elencare tutta una serie di informazioni utili (sockets aperti, routing tables, processi, ecc...). Per il nostro scopo utilizzeremo netstat per ottenere un elenco di tutte le connessioni di rete aperte sulla nostra macchina. Ottenere queste informazioni è il primo passo per conoscere nel dettaglio cosa succede all' interno del nostro sistema operativo. | |||
Ora cerchiamo tutte le connessioni di rete in ascolto (stato LISTEN) sul nostro sistema. | |||
<pre># netstat -l |grep tcp | |||
* | tcp 0 0 *:netbios-ssn *:* LISTEN | ||
* | tcp 0 0 *:5900 *:* LISTEN | ||
* | tcp 0 0 *:www *:* LISTEN | ||
* | tcp 0 0 *:sieve *:* LISTEN | ||
tcp 0 0 *:ssh *:* LISTEN | |||
tcp 0 0 localhost.localdom:8118 *:* LISTEN | |||
tcp 0 0 *:ipp *:* LISTEN | |||
tcp 0 0 localhost.localdom:smtp *:* LISTEN | |||
tcp 0 0 *:microsoft-ds *:* LISTEN</pre> | |||
Ho scelto di limitare l' output alle sole connessioni in attesa di connessione. Potete anche provare ad utilizzare i comandi '''netstat -a''', '''netstat -l''', '''netstat -l |grep tcp''', ecc... | |||
Le colonne da prendere in esame sono (in questo esempio) la terza e la quarta. La terza colonna riporta l' accoppiata indirizzo+porta su cui è un ascolto il servizio. | |||
Se osserviamo la prima linea dell' output, la terza colonna indica come coppia indirizzo+porta il testo '''*:netbios-ssn''': questo significa che è attivo un servizio in ascolto per qualsiasi (*) indirizzo di rete configurato sulla macchina e che questo servizio è associato alla porta '''netbios-ssn'''. | |||
* | |||
Nelle altre righe possiamo notare che, nella colonna degli indirizzi, oltre al "*" (che indica ''qualsiasi indirizzo'') compare anche ''localhost.localdomain''. Netstat tenta di risolvere gli indirizzi ip e reperisce questo hostname dal file '''/etc/hosts''', per cui localhost.localdomain corrisponde (nel mio esempio) all' indirizzo dell' interfaccia di loopback (127.0.0.1), come possiamo verificare con un semplice | |||
* | |||
<pre>$ cat /etc/hosts |grep localhost.localdomain | |||
127.0.0.1 localhost.localdomain localhost debby</pre> | |||
È interessante notare come per alcune porte venga riportato un valore numerico, mentre per altre un valore alfanumerico. | |||
Valore numerico: | |||
* | <pre>tcp 0 0 *:5900 *:* LISTEN</pre> | ||
Valore alfanumerico: | |||
<pre>tcp 0 0 *:netbios-ssn *:* LISTEN</pre> | |||
Questo comportamento di netstat è presto spiegato: quando il programma rileva un servizio in ascolto su una porta (ad esempio la porta 5900), cerca una corrispondenza con la stessa all' interno del file ''/etc/services''. | |||
Il file ''services'' è un file testuale che associa un numero di porta numerico alla descrizione alfanumerica del servizio associato alla stessa. | |||
Se vogliamo vedere a quale porta corrisponda il dato ''netbios-ssn'' dell' esempio precedente, è sufficiente cercarlo all' interno del file services: | |||
<pre>$ cat /etc/services |grep netbios-ssn | |||
netbios-ssn 139/tcp # NETBIOS session service | |||
netbios-ssn 139/udp</pre> | |||
Nel nostro esempio, dato che la porta era di tipo TCP, il valore cercato è il primo ottenuto. | |||
Agendo sul file services possiamo quindi assegnare un valore descrittivo alle porte riportate solo con il valore numerico. Ad esempio tornando alla porta 5900, probabilmente vorremo associarla al servizio ad essa associata (vnc). | |||
Sarà quindi sufficiente editare il file services ed aggiungere la linea: | |||
<pre>vnc-server 5900/tcp vnc-server # TightVNC Server</pre> | |||
A questo punto avremo realizzato l' associazione porta/descrizione: | |||
* [ | <pre>~# netstat -l |grep tcp | ||
[...] | |||
tcp 0 0 *:vnc-server *:* LISTEN | |||
[...]</pre> | |||
Per quanto riguarda la quarta colonna, nell' esempio precedente possiamo vedere che il valore è identico per tutti i servizi e cioè '''*:*'''. Questo significa che il servizio è pronto a ricevere connessioni da qualsiasi indirizzo ip e da qualsiasi porta ad esso associata. | |||
* | |||
Notiamo a questo punto che alcuni dei servizi avviati sono in ascolto su qualsiasi indirizzo ip configurato sulla nostra macchina (*), mentre alcuni sono legati (si dice anche binding) all' indirizzo ''localhost.localdomain'' che abbiamo visto prima corrispondere all' indirizzo di loopback (127.0.0.1). | |||
* '' | |||
Quando un servizio è in ascolto unicamente sull' interfaccia di loopback significa che sarà raggiungibile unicamente attraverso quell' interfaccia. Questo ci garantisce che l'unico host in grado di contattare il servizio è la stessa macchina che lo ha in esecuzione. | |||
Nell' esempio di prima i servizi raggiungibili unicamente dall' interfaccia di loopback sono '''smtp''' e '''8118'''. Come impareremo a verificare più tardi, si tratta rispettivamente del server di posta '''exim''' e del proxy '''privoxy'''. | |||
=== | ==lsof== | ||
Se con '''netstat''' siamo in grado di monitorare quali servizi sono in ascolto sulla nostra macchina, è anche indispensabile sapere quale programma abbia lanciato e controlli ogni singolo servizio. | |||
Una caratteristica peculiare dei sistemi operativi derivati da Unix (tra cui appunto GNU/Linux) è che qualsiasi elemnto del sistema viene visto come se fosse un file. Abbiamo files veri e propri (ad es.: pippo.txt), abbiamo i dispositivi hardware (si trovano in /dev, e sono rappresentati da file veri e propri) ed abbiamo le connessioni di rete (anche queste sono veri e propri file). | |||
Approfittando di questa caratteristica di GNU/Linux, possiamo investigare in maniera approfondita sui nostri servizi: se per il sistema operativo si tratta di files allora possiamo sapere chi li ha creati e chi li ha aperti. | |||
= | Lo strumento principe per questo scopo è '''lsof'''. Come per la maggior parte dei comandi GNU, lsof è una abbreviazione (in questo caso ricorsiva!) della descrizione del comando: lsof = '''LS O'''pen '''F'''iles, cioè '''L'''i'''S'''t '''O'''pen '''F'''iles (elenca i files aperti). | ||
Dato che le connessioni di rete sono rappresentate da veri e propri files, possiamo usare lsof per ottenere informazioni su di esse. | |||
Poniamo il caso di voler ottenere informazioni sul servizio: | |||
* | <pre>tcp 0 0 *:netbios-ssn *:* LISTEN</pre> | ||
* | |||
* | |||
Sarà sufficiente utilizzare lsof: | |||
<pre># lsof -i |grep netbios-ssn | |||
* | smbd 4089 root 21u IPv4 8082 TCP *:netbios-ssn (LISTEN)</pre> | ||
In questo modo possiamo vedere che il servizio in ascolto sulla porta associata a '''netbios-ssn''' (la porta 139) è controllato dal programma '''smbd'''. | |||
== | Allo stesso modo possiamo fare con '''www''' e '''smtp''', ecc... | ||
* [[ | |||
<pre># lsof -i |grep www | |||
apache 4342 root 16u IPv4 8423 TCP *:www (LISTEN) | |||
apache 4349 www-data 16u IPv4 8423 TCP *:www (LISTEN) | |||
# lsof -i |grep smtp | |||
exim4 3901 Debian-exim 3u IPv4 7625 TCP localhost.localdomain:smtp (LISTEN)</pre> | |||
==Apt System== | |||
Ora che sappiamo quale programma controlla un determinato servizio, abbiamo la possibilità di risalire a quale pacchetto Debian lo contiene per - eventualmente - rimuoverlo, oppure ottenere versioni più aggiornate, ricompilarlo con patches specifiche, ecc... | |||
Il sistema più semplice ed allo stesso più potente per individuare quale pacchetto Debian contiene un file, consiste nell' utilizzare il programma '''apt-file'''. Per l' installazione e l' utilizzo di apt-file, vi rimando all' ottima guida [[Apt-file: ricerca all'interno dei pacchetti]], scritta da MaXeR. | |||
Nel contesto a noi necessario utilizzeremo la funzione di ricerca di apt-file per risalire a quale pacchetto contiene il programma che lancia un particolare demone. | |||
Continuiamo a utilizzare come esempio il servizio in ascolto sulla porta '''netbios-ssn'''. Per adesso siamo riusciti a risalire al fatto che il servizio netbios-ssn corrisponde alla porta 139 e che è controllato da '''smbd'''. | |||
Ora vedremo cosa sia '''smbd'''. Prima di tutto verifichiamo quale script o programma si preoccupa di lanciare smbd | |||
<pre># lsof |grep smbd |grep txt | |||
smbd 4089 root txt REG 3,3 2805852 34840 /usr/sbin/smbd | |||
smbd 4094 root txt REG 3,3 2805852 34840 /usr/sbin/smbd</pre> | |||
Ora vediamo quale pacchetto contiene /usr/sbin/smbd: | |||
<pre># apt-file search /usr/sbin/smbd | |||
samba: usr/sbin/smbd | |||
samba-dbg: usr/lib/debug/usr/sbin/smbd</pre> | |||
Controlliamo quale di essi sia presente nel nostro sistema: | |||
<pre># dpkg -l samba* | |||
Desiderato=sconosciUto/Installato/Rimosso/P:eliminato/H:bloccato | |||
| Stato=Non/Installato/file Config./U:spacchett./conf. Fallita/H:inst.parzial. | |||
|/ Err?=(nessuno)/H:bloc./necess.Reinst./X=entrambi (Stato,Err: maiusc.=grave) | |||
||/ Nome Versione Descrizione | |||
+++-==============-==============-============================================ | |||
ii samba 3.0.14a-6 a LanManager-like file and printer server fo | |||
un samba-client <non definita> (descrizione non disponibile) | |||
ii samba-common 3.0.14a-6 Samba common files used by both the server a | |||
un samba-doc <non definita> (descrizione non disponibile)</pre> | |||
---- | |||
[[Utente:Keltik|Keltik]] 05:26, Giu 23, 2005 (EDT) | |||
[[Categoria:Sistema]] | |||
[[Categoria:Networking]] |
Versione delle 20:32, 1 apr 2006
Attenzione: questo articolo è ancora incompleto e in fase di scrittura da parte del suo autore.
Sentitevi liberi di contribuire, proponendo modifiche alla guida tramite l'apposita pagina di discussione, in modo da non interferire con il lavoro portato avanti sulla voce. Per altre informazioni si rimanda al template. |
Uno dei primi passi da affrontare subito l' installazione della nostra Debian dovrebbe essere quello di accertarsi di quali servizi e demoni vengono lanciati dal sistema. Questa operazione permette un controllo migliore della sicurezza della nostra macchina ed una minore esposizione a rischi legati a intrusioni.
In questa breve guida vedremo come controllare i servizi attivi, come eliminare quelli non necessari e come rendere più sicuri quelli che intendiamo utilizzare.
Buona lettura & happy debian!
Concetti di base
Servizi & Demoni
In un sistema operativo si definisce "servizio" (o anche "demone") un processo in background che gira autonomamente, senza intervento da parte dell' utente, o comunque con una interazione ridotta al minimo. Un esempio di servizo è il server web Apache: il server viene controllato dal demone "httpd" che gira in background, resta in ascolto sulla porta indicata e serve le pagine richieste.
Strumenti
GNU/Linux fornisce una nutrita schiera di programmi che ci permettono di intergire con i servizi attivi sulla nostra macchina. Di seguito riporto quelli più usati nell' amministrazione di un sistema Debian.
netstat
Netstat è uno dei programmi più utilizzati ed utili: permette di elencare tutta una serie di informazioni utili (sockets aperti, routing tables, processi, ecc...). Per il nostro scopo utilizzeremo netstat per ottenere un elenco di tutte le connessioni di rete aperte sulla nostra macchina. Ottenere queste informazioni è il primo passo per conoscere nel dettaglio cosa succede all' interno del nostro sistema operativo.
Ora cerchiamo tutte le connessioni di rete in ascolto (stato LISTEN) sul nostro sistema.
# netstat -l |grep tcp tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:5900 *:* LISTEN tcp 0 0 *:www *:* LISTEN tcp 0 0 *:sieve *:* LISTEN tcp 0 0 *:ssh *:* LISTEN tcp 0 0 localhost.localdom:8118 *:* LISTEN tcp 0 0 *:ipp *:* LISTEN tcp 0 0 localhost.localdom:smtp *:* LISTEN tcp 0 0 *:microsoft-ds *:* LISTEN
Ho scelto di limitare l' output alle sole connessioni in attesa di connessione. Potete anche provare ad utilizzare i comandi netstat -a, netstat -l, netstat -l |grep tcp, ecc...
Le colonne da prendere in esame sono (in questo esempio) la terza e la quarta. La terza colonna riporta l' accoppiata indirizzo+porta su cui è un ascolto il servizio.
Se osserviamo la prima linea dell' output, la terza colonna indica come coppia indirizzo+porta il testo *:netbios-ssn: questo significa che è attivo un servizio in ascolto per qualsiasi (*) indirizzo di rete configurato sulla macchina e che questo servizio è associato alla porta netbios-ssn.
Nelle altre righe possiamo notare che, nella colonna degli indirizzi, oltre al "*" (che indica qualsiasi indirizzo) compare anche localhost.localdomain. Netstat tenta di risolvere gli indirizzi ip e reperisce questo hostname dal file /etc/hosts, per cui localhost.localdomain corrisponde (nel mio esempio) all' indirizzo dell' interfaccia di loopback (127.0.0.1), come possiamo verificare con un semplice
$ cat /etc/hosts |grep localhost.localdomain 127.0.0.1 localhost.localdomain localhost debby
È interessante notare come per alcune porte venga riportato un valore numerico, mentre per altre un valore alfanumerico.
Valore numerico:
tcp 0 0 *:5900 *:* LISTEN
Valore alfanumerico:
tcp 0 0 *:netbios-ssn *:* LISTEN
Questo comportamento di netstat è presto spiegato: quando il programma rileva un servizio in ascolto su una porta (ad esempio la porta 5900), cerca una corrispondenza con la stessa all' interno del file /etc/services.
Il file services è un file testuale che associa un numero di porta numerico alla descrizione alfanumerica del servizio associato alla stessa.
Se vogliamo vedere a quale porta corrisponda il dato netbios-ssn dell' esempio precedente, è sufficiente cercarlo all' interno del file services:
$ cat /etc/services |grep netbios-ssn netbios-ssn 139/tcp # NETBIOS session service netbios-ssn 139/udp
Nel nostro esempio, dato che la porta era di tipo TCP, il valore cercato è il primo ottenuto.
Agendo sul file services possiamo quindi assegnare un valore descrittivo alle porte riportate solo con il valore numerico. Ad esempio tornando alla porta 5900, probabilmente vorremo associarla al servizio ad essa associata (vnc).
Sarà quindi sufficiente editare il file services ed aggiungere la linea:
vnc-server 5900/tcp vnc-server # TightVNC Server
A questo punto avremo realizzato l' associazione porta/descrizione:
~# netstat -l |grep tcp [...] tcp 0 0 *:vnc-server *:* LISTEN [...]
Per quanto riguarda la quarta colonna, nell' esempio precedente possiamo vedere che il valore è identico per tutti i servizi e cioè *:*. Questo significa che il servizio è pronto a ricevere connessioni da qualsiasi indirizzo ip e da qualsiasi porta ad esso associata.
Notiamo a questo punto che alcuni dei servizi avviati sono in ascolto su qualsiasi indirizzo ip configurato sulla nostra macchina (*), mentre alcuni sono legati (si dice anche binding) all' indirizzo localhost.localdomain che abbiamo visto prima corrispondere all' indirizzo di loopback (127.0.0.1).
Quando un servizio è in ascolto unicamente sull' interfaccia di loopback significa che sarà raggiungibile unicamente attraverso quell' interfaccia. Questo ci garantisce che l'unico host in grado di contattare il servizio è la stessa macchina che lo ha in esecuzione.
Nell' esempio di prima i servizi raggiungibili unicamente dall' interfaccia di loopback sono smtp e 8118. Come impareremo a verificare più tardi, si tratta rispettivamente del server di posta exim e del proxy privoxy.
lsof
Se con netstat siamo in grado di monitorare quali servizi sono in ascolto sulla nostra macchina, è anche indispensabile sapere quale programma abbia lanciato e controlli ogni singolo servizio.
Una caratteristica peculiare dei sistemi operativi derivati da Unix (tra cui appunto GNU/Linux) è che qualsiasi elemnto del sistema viene visto come se fosse un file. Abbiamo files veri e propri (ad es.: pippo.txt), abbiamo i dispositivi hardware (si trovano in /dev, e sono rappresentati da file veri e propri) ed abbiamo le connessioni di rete (anche queste sono veri e propri file).
Approfittando di questa caratteristica di GNU/Linux, possiamo investigare in maniera approfondita sui nostri servizi: se per il sistema operativo si tratta di files allora possiamo sapere chi li ha creati e chi li ha aperti.
Lo strumento principe per questo scopo è lsof. Come per la maggior parte dei comandi GNU, lsof è una abbreviazione (in questo caso ricorsiva!) della descrizione del comando: lsof = LS Open Files, cioè LiSt Open Files (elenca i files aperti).
Dato che le connessioni di rete sono rappresentate da veri e propri files, possiamo usare lsof per ottenere informazioni su di esse.
Poniamo il caso di voler ottenere informazioni sul servizio:
tcp 0 0 *:netbios-ssn *:* LISTEN
Sarà sufficiente utilizzare lsof:
# lsof -i |grep netbios-ssn smbd 4089 root 21u IPv4 8082 TCP *:netbios-ssn (LISTEN)
In questo modo possiamo vedere che il servizio in ascolto sulla porta associata a netbios-ssn (la porta 139) è controllato dal programma smbd.
Allo stesso modo possiamo fare con www e smtp, ecc...
# lsof -i |grep www apache 4342 root 16u IPv4 8423 TCP *:www (LISTEN) apache 4349 www-data 16u IPv4 8423 TCP *:www (LISTEN) # lsof -i |grep smtp exim4 3901 Debian-exim 3u IPv4 7625 TCP localhost.localdomain:smtp (LISTEN)
Apt System
Ora che sappiamo quale programma controlla un determinato servizio, abbiamo la possibilità di risalire a quale pacchetto Debian lo contiene per - eventualmente - rimuoverlo, oppure ottenere versioni più aggiornate, ricompilarlo con patches specifiche, ecc...
Il sistema più semplice ed allo stesso più potente per individuare quale pacchetto Debian contiene un file, consiste nell' utilizzare il programma apt-file. Per l' installazione e l' utilizzo di apt-file, vi rimando all' ottima guida Apt-file: ricerca all'interno dei pacchetti, scritta da MaXeR.
Nel contesto a noi necessario utilizzeremo la funzione di ricerca di apt-file per risalire a quale pacchetto contiene il programma che lancia un particolare demone.
Continuiamo a utilizzare come esempio il servizio in ascolto sulla porta netbios-ssn. Per adesso siamo riusciti a risalire al fatto che il servizio netbios-ssn corrisponde alla porta 139 e che è controllato da smbd.
Ora vedremo cosa sia smbd. Prima di tutto verifichiamo quale script o programma si preoccupa di lanciare smbd
# lsof |grep smbd |grep txt smbd 4089 root txt REG 3,3 2805852 34840 /usr/sbin/smbd smbd 4094 root txt REG 3,3 2805852 34840 /usr/sbin/smbd
Ora vediamo quale pacchetto contiene /usr/sbin/smbd:
# apt-file search /usr/sbin/smbd samba: usr/sbin/smbd samba-dbg: usr/lib/debug/usr/sbin/smbd
Controlliamo quale di essi sia presente nel nostro sistema:
# dpkg -l samba* Desiderato=sconosciUto/Installato/Rimosso/P:eliminato/H:bloccato | Stato=Non/Installato/file Config./U:spacchett./conf. Fallita/H:inst.parzial. |/ Err?=(nessuno)/H:bloc./necess.Reinst./X=entrambi (Stato,Err: maiusc.=grave) ||/ Nome Versione Descrizione +++-==============-==============-============================================ ii samba 3.0.14a-6 a LanManager-like file and printer server fo un samba-client <non definita> (descrizione non disponibile) ii samba-common 3.0.14a-6 Samba common files used by both the server a un samba-doc <non definita> (descrizione non disponibile)
Keltik 05:26, Giu 23, 2005 (EDT)