Debian e il controllo di servizi e demoni: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
=Introduzione=
{{stub}}
Samba e' un diffusissimo software open source ideato nel 1991 da Andrew Tridgell e rilasciato sotto licenza GPL che permette la condivisione di risorse come directory e stampanti tra macchine windows e GNU/Linux (''UNIX''); si avvale sostanzialmente del protocollo SMB (''server message block'') originario microsoft e basato a sua volta sul protocollo  NetBios (''network basic input output system'') sviluppato da IBM nel 1984.


Si sceglie solitamente l'uso di Samba per poter condividere file e stampanti in una rete mista (''macchine GNU/Linux, ms-windows, mac os..''), in modo da sfruttare un unico protocollo e un unico sistema di autenticazione.
Uno dei primi passi da affrontare subito dopo l' installazione della nostra Debian dovrebbe essere quello di accertarsi quali sono i servizi e i demoni che vengono lanciati dal sistema. Questa operazione permette un controllo migliore della sicurezza della nostra macchina ed una minore esposizione a rischi legati ad intrusioni.


=La suite=
In questa breve guida vedremo come controllare i servizi attivi, come eliminare quelli non necessari e come rendere più sicuri quelli che intendiamo utilizzare.
Analizziamo i programmi che otteniamo dall' installazione della suite samba per Debian GNU/Linux:


<pre># apt-get update && apt-get install samba smbfs</pre>
Buona lettura & happy Debian!


In breve:
=Concetti di base=
;'''smbd''': questo demone e' sostanzialmente il cuore di samba; in ascolto sulla 445/tcp, gestisce le autenticazioni e da accesso ai filesystem e allo spooler di stampa.
==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 &egrave; 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.


;'''nmbd''': questo demone in ascolto sulla 139/udp, rende note le risorse condivise tutte le volte che viene interrogato dai client. Per fare un esempio � quel demone che permette la visualizzazione dei serventi samba in Risorse di Rete nei sistemi ms-windows. E' il primo ad avviarsi dei due demoni.
=Strumenti=
GNU/Linux fornisce una nutrita schiera di programmi che ci permettono di interagire con i servizi attivi sulla nostra macchina. Di seguito riporto quelli più usati nell' amministrazione di un sistema Debian.


;'''smbclient''': programma client a riga di comando quasi uguale a ftp (''smbclient trasferisce solo in binary mode''), dotato di diverse funzioni; tra le piu' importanti, quella di listare gli share messi in condivisione dai vari server samba in una rete.
==netstat==


;'''smbmount''' & '''smbumount''': utilizzati per montare/smontare filesystem condivisi.
Netstat è uno dei programmi più utili ed utilizzati: permette di elencare tutta una serie di informazioni utili (socket 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.  


;'''smbpasswd''': strumento per la creazione utenti samba. Un utente samba dovra' essere anche un utente presente sulla macchina.
Ora cerchiamo tutte le connessioni di rete in ascolto (stato LISTEN) sul nostro sistema.


;'''testparm''': strumento per la verifica del file '''/etc/samba/smb.conf.
<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>


;'''nmblookup''':  risolve i nomi host di un domain samba (''NetBIOS name'') in indirizzi ip (es: nmblookup ''nomehost'').
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...


=Configurazione del server=
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.  
==Sezione global==
Editiamo il file '''/etc/samba/smb.conf''':
<pre> 
[global]
    allow hosts = 192.168.1.0/24   
    workgroup = debianizzati
    server string = server@debianizzati.org
    create mask = 0755
</pre>


Con la sezione global all'interno del file smb.conf abbiamo impostato quei parametri che saranno il modello generale di tutte le eventuali sezioni che verranno.
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'''.


Ad esempio se  nella successiva sezione, non specificassimo il parametro '''allow hosts''', verra' preso come riferimento '''192.168.1.0/24'''.
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


Ok, in breve:<br>
<pre>$ cat /etc/hosts |grep localhost.localdomain
'''allow hosts''' = range di ip ai quali e' permesso l'accesso alla risorsa<br>
127.0.0.1 localhost.localdomain localhost debby</pre>
'''workgroup''' = nome del gruppo di lavoro<br>
'''server string''' = stringa che identifica il server<br>
'''browsable''' = rende visibile lo share<br>
'''create mask''' = determina i permessi dei file in condivisione<br>


{{Box|Nota|Per puntare a semplicita' e rapidita' di utilizzo, inseriremo solo pochi parametri essenziali per sezione, nel nostro smb.conf. Tuttavia i parametri previsti per questo file sono veramente tanti. Per una panoramica completa fate riferimento alla page (man5) di [http://www.samba.org/samba/docs/man/smb.conf.5.html Samba].
&Egrave; interessante notare come per alcune porte venga riportato un valore numerico, mentre per altre un valore alfanumerico.
}}


==Condivisione di una directory==
Valore numerico:
Adesso sempre dentro il nostro smb.conf, creiamo la sezione specifica per la risorsa che vogliamo condividere.  In questo esempio condivideremo una directory.
<pre>tcp        0     0 *:5900                  *:*                    LISTEN</pre>
<pre>
Valore alfanumerico:
[shared]
<pre>tcp        0     0 *:netbios-ssn          *:*                    LISTEN</pre>
     comment = Directory Shared
    path = /dir/da/condividere
    browsable = yes
     read only = yes
    public = yes
    create mask = 0755
</pre>


Altri parametri:<br>
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''.
'''comment''' = commento per la directory<br>
'''path''' = percorso della dir condivisa<br>
'''public''' = rende la dir di libero accesso<br>
'''read only''' = setta i files della dir condivisa in sola lettura<br>


==Condivisione di una stampante==
Il file ''services'' è un file testuale che associa un numero di porta numerico alla descrizione alfanumerica del servizio associato alla stessa.
Adesso analizziamo i parametri da aggiungere al file '''smb.conf''' per poter condividere una stampante.
Aggiungiamo alla sezione '''global''':
<pre>
[global]
    printing = [sistema di stampa utilizzato, es: cups, lprng..]
    load printers = yes
</pre>
Creiamo inoltre la sezione '''printers''' che fornira' i parametri di accesso alle nostre stampanti:
<pre>
[printers]
    path = /var/spool/samba
    guest ok = yes
    printable = yes
</pre>
{{Box|Nota|Debian non crea la directory /var/spool/samba. Questa directory e' adibita solo allo spool di stampa, volendo molti la sostituiscono con /tmp. Se decidete di crearla voi, per un corretto funzionamento impostatele i permessi: nobody:nobody con chmod -R 755.
}}


Dopodiche' scriviamo la sezione specifica per la nostra stampante (''es. una camon'').
Se vogliamo vedere a quale porta corrisponda il dato ''netbios-ssn'' dell' esempio precedente, è sufficiente cercarlo all' interno del file services:
<pre>
[camon]
    comment = Camon Printer
    path = /var/spool/samba
    browsable = yes
</pre>


==Condivisione di dispositivi di lettura (CD-ROM, DVD..)==
<pre>$ cat /etc/services |grep netbios-ssn
Poniamo come esempio di avere due pc e che solo uno dei due monti un lettore dvd. Bene, guardiamo come poter  accedere ad un file che risiedesse su un supporto dvd, dalla macchina sprovvista di lettore:
netbios-ssn     139/tcp                        # NETBIOS session service
<pre>
netbios-ssn     139/udp</pre>
[dvd]
    comment = Lettore DVD-R
    preexec = mount /media/cdrom
     postexec = umount /media/cdrom
     path = /media/cdrom
    writable = no
</pre>
Parametri supplementari al nostro smb.conf:<br>
'''preexec''' = permette di impostare un'azione che sara' eseguita una volta connessi alla risorsa<br>
'''postexec''' = in questo caso l'azione sara' eseguita quando la risorsa verra' sconnessa<br>


Al momento che dal client monteremo la risorsa condivisa (con smbmount o smbclient) sul server sentiremo montare il dvd, il quale contenuto sara' a nostra disposizione per trasferire file o, in caso di file audio/video, anche di streaming.  
Nel nostro esempio, dato che la porta era di tipo TCP, il valore cercato è il primo ottenuto.


Bene, a questo punto il file puo' considerarsi sufficientemente configurato per i nostri scopi.
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).


==Autenticazione==
Sarà quindi sufficiente editare il file services ed aggiungere la linea:
Preoccupiamoci ora dell'accesso vero e proprio alle risorse messe in condivisione. Due sono i principali metodi di accesso. Possiamo creare un utente samba con smbpasswd, (''tenendo presente che un utente samba deve anche essere un utente presente sulla macchina'') ed attribuirgli poi una password di nostra scelta:


Creazione utente samba:
<pre>vnc-server      5900/tcp        vnc-server      # TightVNC Server</pre>
<pre>
# smbpasswd -a utente
New SMB password: ****
Retype new SMB password: ****
</pre>


Questi sono user e pass coi quali ci loggheremo nel momento in cui connetteremo le risorse condivise (''smbmount, smbclient'').
A questo punto avremo realizzato l' associazione porta/descrizione:


Se volessimo inoltre consentire l'accesso a tutti gli utenti indistintamente, basterebbe inserire il parametro '''guest ok = yes''' nelle sezioni desiderate. Ad esempio nella sezione shared:
<pre>~# netstat -l |grep tcp
<pre>
[...]
[shared]
tcp        0     0 *:vnc-server            *:*                    LISTEN
     comment = Directory Shared
[...]</pre>
    path = /dir/da/condividere
    browsable = yes
    read only = yes
    public = yes
    create mask = 0755
    guest ok = yes
</pre>


Cosi' facendo potremo loggarci come ospiti digitando solo invio come password.
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.


Bene, riavviamo il server:
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).
<pre>
# /etc/init.d/samba restart
Stopping Samba daemons: nmbd smbd.
Starting Samba daemons: nmbd smbd.
#
</pre>


Adesso testiamo la validita' del file /etc/samba/smb.conf col comando:
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.


<pre>
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'''.
# testparm /etc/samba/smb.conf
Load smb config files from /etc/samba/smb.conf
Processing section "[shared]"
Processing section "[camon]"
Processing section "[dvd]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
</pre>
Premendo enter vedremo il resoconto del nostro file.


=Lato client=
==lsof==
==Smbclient==
Spostiamoci sul client:
<pre># apt-get install smbfs smbclient</pre>


Come detto in precedenza, smbclient e'  un programma client ftp-like, utilizzato per l'accesso a un server samba. Guardiamo i suoi principali flags e le sue principali funzioni invece, una volta dentro al server.
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.


===Principali flags===
Una caratteristica peculiare dei sistemi operativi derivati da Unix (tra i quali appunto GNU/Linux) è che qualsiasi elemento del sistema viene visto come se fosse un file. Abbiamo file veri e propri (ad es.: pippo.txt), abbiamo 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).
(''Usare smbclient --help per uno screen completo''):


;'''smbclient -L ''hostname''''': lista tutti gli share di un determinato host. Ad esempio, dal nostro client facciamo richiesta di listare gli share del server (''come password digitiamo  quella dell'user creato con smbpasswd o solo invio''):
Approfittando di questa caratteristica di GNU/Linux, possiamo investigare in maniera approfondita sui nostri servizi: se per il sistema operativo si tratta di file allora possiamo sapere chi li ha creati e chi li ha aperti.
<pre>
$ smbclient -L SERVER
Password: ****


Domain=[debianizzati] OS=[Unix] Server=[Samba 3.0.14a-Debian]
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 file aperti).


        Sharename      Type      Comment
Dato che le connessioni di rete sono rappresentate da veri e propri file, possiamo usare lsof per ottenere informazioni su di esse.
        ---------      ----      -------
        shared          Disk      Directory Shared
        camon          Disk      Camon Printer
        dvd            Disk      Lettore DVD-R
        IPC$            IPC      IPC Service (server@debianizzati.org)
        ADMIN$          IPC      IPC Service (server@debianizzati.org)


Domain=[debianizzati] OS=[Unix] Server=[Samba 3.0.14a-Debian]
Poniamo il caso di voler ottenere informazioni sul servizio:


        Server              Comment
<pre>tcp        0      0 *:netbios-ssn          *:*                    LISTEN</pre>
        ---------            -------
        SERVER              server@debianizzati.org
        CLIENT              server@debianizzati.org


        Workgroup            Master
Sarà sufficiente utilizzare lsof:
        ---------            -------
        debianizzati        SERVER
</pre>


Come si vede, nella colonna '''Sharename''' sono elencati i nomi degli share settati in smb.conf, quindi, la nostra directory shared,la nostra stampante e il nostro lettore DVD (''le sezioni [global] e [printers]  non sono visibili poiche' sono sezioni di parametri usate dal programma'').
<pre># lsof -i |grep netbios-ssn
Nella colonna '''Server ''' sono invece elencati gli hosts facenti parte del medesimo workgroup.
smbd      4089        root  21u  IPv4  8082      TCP *:netbios-ssn (LISTEN)</pre>
C'e' poi la colonna '''Workgroup''' che visualizza l'host con ruolo di domain master browser nella subnet.


;'''smbclient -U''': Con questo flag possiamo specificare l'username e l'eventule password per il login sulla macchina server.
In questo modo possiamo vedere che il servizio in ascolto sulla porta associata a '''netbios-ssn''' (la porta 139) è controllato dal programma '''smbd'''.


;'''smbclient -A''': Sostanzialmente uguale a -U ma possiamo dargli il path di un file dal quale attingere l'username e la password.
Allo stesso modo possiamo fare con '''www''' e '''smtp''', ecc...


===Accesso al server===
<pre># lsof -i |grep www
<pre>
apache    4342        root  16u  IPv4  8423      TCP *:www (LISTEN)
$ smbclient //SERVER/shared
apache    4349    www-data  16u  IPv4  8423      TCP *:www (LISTEN)
Password: ****
Domain=[SERVER] OS=[Unix] Server=[Samba 3.0.14a-Debian]
smb: \>
</pre>


Adesso siamo dentro al nostro server samba il cui hostname e' SERVER. Sostanzialmente il funzionamento smbclient e' il funzionamento di ftp, ma con in piu' degli utilissimi tools per il down/uploading dei files.
# lsof -i |grep smtp
Alcuni input uguali a quelli di una shell di bash sono: '''ls''', '''cd''', '''rm''', '''rmdir''', '''exit''', coi quali ci sentiremo subito a casa nostra.
exim4    3901 Debian-exim    3u  IPv4  7625      TCP localhost.localdomain:smtp (LISTEN)</pre>
Otteniamo cmq una lista di comandi utili digitando '''help'''.


'''Download di un file con get'''.<br>
==Apt System==
Poniamo come esempio che il contenuto della directory condivisa sia un insieme di files immagine con diverse estensioni e una directory con dentro qualsiasi cosa:
<pre>
smb: \> ls
  .                      D            0  Tue Aug 23 23:57:51 2005
  ..                      D            0  Wed Aug 17 03:05:20 2005
  directory              D            0  Wed Aug 24 12:21:43 2005
  free_kevin.png                    42604  Mon Aug 22 12:19:34 2005
  pokemon.png                      43404  Mon Aug 22 15:15:11 2005
  dorothy_la_may.gif                46134  Mon Aug 21 21:16:00 2005
</pre>


Scarichiamo il file free_kevin.png dalla macchina SERVER alla nostra macchina CLIENT, rinominandolo in kevin.png:
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 patch specifiche, ecc...
<pre>
smb: \> get free_kevin.png  kevin.png
getting file \ free_kevin.png of size 42604 as  kevin.png(1386.8 kb/s) (average 1386.8 kb/s)
</pre>


Il file sara' salvato nella directory dalla quale ci siamo connessi al server. Qualora il file non venisse rinominato manterrebbe il proprio nome.
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.


===Alcune funzioni===
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.
;'''lowercase''': abilita i files ad essere richiamati da get e mget utilizzando solo caratteri minuscoli. E' utile viste le difficolta' spesso trovate negli share msdos (''case insensitive'').
<pre>
es. di abilitazione dei parametri
smb: \> lowercase on
smb: \> prompt on
</pre>
;'''prompt''': Impostando ''' prompt''' su '''on''' prima di ogni trasferimento ci verra' richiesta una conferma.
;'''showconnect''': mostra l' //host/nome_risorsa in uso.
<pre>
smb: \> showconnect
//SERVER/shared
</pre>


;'''stat nomefile''': Stampa a video i permessi di un file e offre in ordine temporale info sugli accessi ad esso:
Continuiamo ad 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'''.
<pre>
smb: \> stat  free_kevin.png
File: \free_kevin.png
Size: 101              Blocks: 8      regular file
Inode: 810      Links: 1
Access: (0644/-rw-r--r--)      Uid: 1000      Gid: 1000
Access: 2005-08-24 00:10:39 +0200
Modify: 2005-08-24 00:10:51 +0200
Change: 2005-08-24 00:10:51 +0200
</pre>


===Mask, mget e recurse===
Ora vedremo cosa sia '''smbd'''. Prima di tutto verifichiamo quale script o programma si preoccupa di lanciare smbd
Con il comando '''mget''' abilitiamo il dowload di tutti i file e directory in maniera ricorsiva. Tuttavia possiamo dare a tale comando un parametro (maschera) utilizzando '''mask''' .
Es. nella nostra directory mettiamo di voler scaricare tutti i file con estensione .png:
<pre>
smb: \> mask *png
smb: \> mget
</pre>
In questo modo mget intendera' scaricare tutti i files con tale estensione presenti nella directory corrente.
Tuttavia con mget e' possibile modificare la maschera on-fly digitando semplicemente:
<pre>
smb: \> mget *png
</pre>
In questo modo la funzione mask, manterra' il suo valore di default che e' '*' (''cioe' tutto'').
La funzione '''recurse on''' attiva lo scanning & downloading (nel caso di una maschera) o il dowloading, accedendo anche a tutte le directory presenti nella dir da cui parte il comando.


==Smbmount & Smbumount==
<pre># lsof |grep smbd |grep txt
Con '''smbmount''' invece montiamo una risorsa in un mountpoint a nostra scelta.
smbd      4089        root  txt      REG        3,3  2805852      34840 /usr/sbin/smbd
Montiamo la risorsa shared col comando:
smbd      4094        root  txt      REG        3,3 2805852      34840 /usr/sbin/smbd</pre>
<pre>$ smbmount //SERVER/shared /path/del/mountpoint</pre>


(''come password digitiamo  quella dell'user creato con smbpasswd o solo invio'')


Cosi' facendo potremmo accedere alla risorsa condivisa, raggiungendo il mountpoint:
Ora vediamo quale pacchetto contiene /usr/sbin/smbd:
<pre>
$ cd /path/del/mountpoint
$ ls
  directory  free_kevin.png  pokemon.png dorothy_la_may.gif
</pre>


=Conclusioni=
<pre># apt-file search /usr/sbin/smbd
Samba e' un software semplicemente straordinario. La sua anima, il file smb.conf e' in perfetto stile Linux; cioe', lo stesso file, puo' divenire enorme e strutturatissimo oppure snello e semplicissimo, a seconda (''e questo e' il vero stile linux'') di quello che un utente vuole.
samba: usr/sbin/smbd
samba-dbg: usr/lib/debug/usr/sbin/smbd</pre>


-------
Controlliamo quale di essi sia presente nel nostro sistema:


Autore: [[Utente:Zmo.zmo|zmo]]
<pre># dpkg -l samba*
[[Categoria:Networking]][[Categoria:Desktop]]
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 09:24, 3 nov 2006

Document-page-setup.png 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 dopo l' installazione della nostra Debian dovrebbe essere quello di accertarsi quali sono i servizi e i demoni che vengono lanciati dal sistema. Questa operazione permette un controllo migliore della sicurezza della nostra macchina ed una minore esposizione a rischi legati ad 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 interagire 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ù utili ed utilizzati: permette di elencare tutta una serie di informazioni utili (socket 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 i quali appunto GNU/Linux) è che qualsiasi elemento del sistema viene visto come se fosse un file. Abbiamo file veri e propri (ad es.: pippo.txt), abbiamo 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 file 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 file aperti).

Dato che le connessioni di rete sono rappresentate da veri e propri file, 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 patch 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 ad 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)