[successivo] [precedente] [inizio] [fine] [indice generale] [licenze] [indice analitico] [tomo] [parte]


Capitolo 97.   Organizzazione e controllo dei servizi di rete

I servizi di rete vengono attivati all'avvio di GNU/Linux attraverso la procedura di inizializzazione del sistema (Init), dopo che sono stati assegnati gli indirizzi alle interfacce di rete e dopo che gli instradamenti sono stati definiti.

97.1   Avvio

I demoni in grado di fornire servizi di rete ricadono in due possibili categorie:

Nel primo caso, si tratta di programmi avviati normalmente che si occupano si ascoltare su una certa porta e di provvedere da soli ai controlli necessari contro gli accessi indesiderati. Nel secondo, si tratta di programmi che vengono avviati nel momento in cui ne esiste effettivamente l'esigenza attraverso il supervisore Inet, che è il programma che si occupa di ascoltare su tutte le porte dei servizi che controlla.

Il primo modo è preferibile quando non è possibile attendere l'avvio di un programma ogni volta che si presenta una richiesta: il caso tipico è dato dal sistema di condivisione dei file system in rete, o NFS.

La gestione da parte del supervisore Inet permette di ridurre il carico del sistema, avviando solo i servizi necessari nel momento in cui ne viene fatta richiesta, introducendo un sistema di controllo ulteriore attraverso un altro programma: il TCP wrapper, ovvero il programma tcpd.

97.2   Supervisione dei servizi di rete

Inet, ovvero il demone inetd è il supervisore dei servizi di rete. La supervisione si articola in due parti:

La presenza di questo meccanismo che si applica alla maggior parte dei servizi di rete (cioè tutti quelli che non sono autonomi) permette di inserire un ulteriore controllo attraverso il TCP wrapper, ovvero il programma tcpd, il quale si occupa prevalentemente di verificare che le richieste dei servizi provengano da indirizzi autorizzati.

97.2.1   # inetd

inetd [opzioni] [file_di_configurazione]

Il supervisore Inet si compone in pratica del demone inetd, per la gestione dei servizi da offrire all'esterno (attraverso la rete). Di solito, il demone viene avviato automaticamente dalla procedura di inizializzazione del sistema. Quando è in funzione, si mette in ascolto di un gruppo di porte determinato; quando rivela una comunicazione in una di queste, determina qual è il servizio corrispondente e lo avvia. In sostanza, il supervisore Inet demanda ad altri demoni la gestione dei servizi richiesti specificatamente. inetd, una volta avviato, legge il contenuto del suo file di configurazione che, se non viene nominato espressamente, è /etc/inetd.conf. inetd rilegge la configurazione quando riceve un segnale di aggancio, SIGHUP:

kill -HUP  numero_del_PID_di_inetd

97.2.2   /etc/inetd.conf

Si tratta del file di configurazione utilizzato dal demone inetd. In particolare sono indicati i demoni per la gestione di servizi di rete specifici. In molti casi, l'avvio di questi demoni è controllato da tcpd. Se si fanno modifiche a questo file e si vuole che abbiano effetto, è necessario inviare a inetd un segnale SIGHUP:

kill -HUP  PID_di_inetd

Sotto viene mostrato il contenuto tipico di questo file, così come appare nelle distribuzioni GNU/Linux più comuni. La prima cosa da osservare è che il simbolo #, posto all'inizio di una riga, introduce un commento; inoltre, le righe bianche e quelle vuote vengono ignorate. Tutte le altre righe vengono interpretate come direttive di dichiarazione di un servizio particolare.

#
# inetd.conf    This file describes the services that will be available
#               through the INETD TCP/IP super server.  To re-configure
#               the running INETD process, edit this file, then send the
#               INETD process a SIGHUP signal.
#
# Version:      @(#)/etc/inetd.conf     3.10    05/27/93
#
# Authors:      Original taken from BSD UNIX 4.3/TAHOE.
#               Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
#
# Modified for Debian Linux by Ian A. Murdock <imurdock@shell.portal.com>
#
# Modified for RHS Linux by Marc Ewing <marc@redhat.com>
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
# Echo, discard, daytime, and chargen are used primarily for testing.
#
# To re-read this file after changes, just do a 'killall -HUP inetd'
#
#echo   stream  tcp     nowait  root    internal
#echo   dgram   udp     wait    root    internal
#discard        stream  tcp     nowait  root    internal
#discard        dgram   udp     wait    root    internal
#daytime        stream  tcp     nowait  root    internal
#daytime        dgram   udp     wait    root    internal
#chargen        stream  tcp     nowait  root    internal
#chargen        dgram   udp     wait    root    internal
#
# These are standard services.
#
ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd -l -a
telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
gopher  stream  tcp     nowait  root    /usr/sbin/tcpd  gn

# do not uncomment smtp unless you *really* know what you are doing.
# smtp is handled by the sendmail daemon now, not smtpd.  It does NOT
# run from here, it is started at boot time from /etc/rc.d/rc#.d.
#smtp   stream  tcp     nowait  root    /usr/bin/smtpd  smtpd
#nntp   stream  tcp     nowait  root    /usr/sbin/tcpd  in.nntpd
#
# Shell, login, exec and talk are BSD protocols.
#
shell   stream  tcp     nowait  root    /usr/sbin/tcpd  in.rshd
login   stream  tcp     nowait  root    /usr/sbin/tcpd  in.rlogind
#exec   stream  tcp     nowait  root    /usr/sbin/tcpd  in.rexecd

talk    dgram   udp     wait    root    /usr/sbin/tcpd  in.talkd
ntalk   dgram   udp     wait    root    /usr/sbin/tcpd  in.ntalkd
#dtalk  stream  tcp     wait    nobody  /usr/sbin/tcpd  in.dtalkd
#
# Pop and imap mail services et al
#
pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop2d
pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d
imap    stream  tcp     nowait  root    /usr/sbin/tcpd  imapd
#
# The Internet UUCP service.
#
#uucp   stream  tcp     nowait  uucp    /usr/sbin/tcpd  /usr/lib/uucp/uucico    -l
#
# Tftp service is provided primarily for booting.  Most sites
# run this only on machines acting as "boot servers." Do not uncomment
# this unless you *need* it.  
#
#tftp   dgram   udp     wait    root    /usr/sbin/tcpd  in.tftpd
#bootps dgram   udp     wait    root    /usr/sbin/tcpd  bootpd
#
# Finger, systat and netstat give out user information which may be
# valuable to potential "system crackers."  Many sites choose to disable 
# some or all of these services to improve security.
#
# cfinger is for GNU finger, which is currently not in use in RHS Linux
#
finger  stream  tcp     nowait  root    /usr/sbin/tcpd  in.fingerd
#cfinger stream tcp     nowait  root    /usr/sbin/tcpd  in.cfingerd
#systat stream  tcp     nowait  guest   /usr/sbin/tcpd  /bin/ps -auwwx
#netstat        stream  tcp     nowait  guest   /usr/sbin/tcpd  /bin/netstat    -f inet
#
# Time service is used for clock syncronization.
#
time    stream  tcp     nowait  nobody  /usr/sbin/tcpd  in.timed
time    dgram   udp     wait    nobody  /usr/sbin/tcpd  in.timed
#
# Authentication
#
auth   stream  tcp     nowait    nobody    /usr/sbin/in.identd in.identd -l -e -o
#
# End of inetd.conf

Per l'utente medio di GNU/Linux non è necessario approfondire la sintassi di queste direttive. Il file di configurazione predefinito è già sufficiente così com'è.

Le direttive di questo file sono dei record, corrispondenti in pratica alle righe, suddivisi in campi distinti attraverso spaziature orizzontali (spazi o tabulazioni). L'ultimo campo può contenere anche spazi.

servizio[/ versione]tipo_socket   protocollo{wait|nowait}[. max]utente[. gruppo]programma_del_servizio   programma_e_argomenti
  1. servizio[/ versione]
    

    Il primo campo serve a indicare il servizio. Normalmente si fa riferimento a una porta indicata per nome, secondo quanto definito dal file /etc/services. Se si indica un numero, si fa riferimento direttamente a quel numero di porta.

    Eventualmente può essere indicato un servizio RPC, e in tal caso si utilizza un nome secondo quanto riportato nel file /etc/rpc, seguito eventualmente da un barra obliqua e dal numero di versione.

  2. tipo_socket

    Definisce il tipo di socket attraverso diverse parole chiave:

    • stream

    • dgram   datagramma

    • raw

    • rdm   reliably delivered message

    • seqpacket   sequenced packet socket

  3. protocollo

    Serve a determinare il tipo di protocollo, utilizzando una parola chiave che si ottiene dal file /etc/protocols. Si tratta prevalentemente di tcp e udp. Nel caso si vogliano gestire protocolli RPC, questi si indicano come rpc/tcp e rpc/udp.

  4. {wait|nowait}[. max]
    

    Le parole chiave wait e nowait servono a definire il comportamento di un servizio, quando si utilizza il tipo di socket dgram (datagramma). In tutti gli altri casi, si usa esclusivamente la parola chiave nowait.

    In base alle richieste dei clienti, inetd può avviare un certo numero (anche elevato) di copie di processi di uno stesso servizio. Il limite predefinito è di 40 ogni minuto (60 secondi), è può essere modificato aggiungendo alla parola chiave wait o nowait un'estensione composta da un punto seguito da un numero: il numero massimo di copie per minuto.

  5. utente[. gruppo]
    

    Serve a definire l'utente, ed eventualmente il gruppo, in nome del quale avviare il servizio. inetd viene avviato dalla procedura di inizializzazione del sistema, con i privilegi dell'utente root. Di conseguenza, può cambiare l'utente e il gruppo proprietari dei processi che avvia, in modo da dare loro i privilegi strettamente necessari al compimento delle loro funzioni.

  6. programma_del_servizio

    Definisce il percorso assoluto di avvio del programma che offre il servizio. Se si tratta di un servizio interno al supervisore Inet stesso, si utilizza la parola chiave internal e l'ultimo campo non viene indicato.

  7. programma_e_argomenti

    L'ultimo campo è anomalo, in quanto consente l'utilizzo degli spazi come parte dell'informazione in esso contenuta. Si tratta degli argomenti del programma che offre il servizio, dove il primo deve corrispondere al nome del programma stesso; in pratica quello che nel linguaggio C è contenuto in argv[0]. Si osservi l'esempio seguente:

    finger  stream  tcp  nowait  nobody  /usr/sbin/in.fingerd  in.fingerd

97.3   TCP wrapper

L'avvio di alcuni servizi può essere controllato utilmente da un sistema di registrazione e verifica, definito TCP wrapper. Si tratta di un programma che esegue una serie di controlli, e in base a questi decide se avviare o meno il servizio corrispondente.

Il TCP wrapper non è indispensabile, ma il suo utilizzo è diventato una consuetudine, per poter avere almeno un controllo minimo sui servizi principali.

I compiti del TCP wrapper possono essere:

Il programma che si usa per questo è tcpd; in queste sezioni ne viene mostrato solo l'uso elementare, adatto all'amministratore improvvisato. Per un approfondimento delle sue potenzialità, si può consultare il capitolo 235 e anche la documentazione originale: tcpd(8) e hosts_access(5).

97.3.1   # tcpd

Si tratta di un programma intermedio per il controllo dei servizi TCP/IP, di solito quelli che si trovano già sotto la supervisione di Inet. È conosciuto in particolare come TCP wrapper. In pratica, esegue alcuni controlli, si occupa di annotare attraverso il registro di sistema le richieste di esecuzione di questi servizi, infine avvia i programmi demone competenti.

Lo scopo più importante di questo demone è quello di controllare che le richieste di utilizzo dei vari servizi offerti attraverso la rete provengano da nodi autorizzati. Questa selezione avviene attraverso l'analisi della coppia di file /etc/hosts.allow e /etc/hosts.deny. In pratica, quando tcpd rileva un tentativo di accesso, verifica che l'indirizzo del chiamante sia incluso nell'elenco di /etc/hosts.allow. Se è così non esegue altri controlli e permette l'accesso, altrimenti verifica che questo non sia incluso nell'elenco di /etc/hosts.deny (se entrambi i file mancano o sono vuoti, sono consentiti tutti gli accessi).

97.3.2   /etc/hosts.allow

Viene utilizzato da tcpd per determinare se il nodo che richiede uno dei servizi di rete dell'elaboratore locale ha diritto di accedere.

Se il file è vuoto, o manca, sono consentiti tutti gli accessi; se sono presenti delle direttive, viene verificata la corrispondenza del nodo a queste direttive. Alla prima corrispondenza trovata, la ricerca termina, ignorando anche il file /etc/hosts.deny. È importante ribadire che se un nodo non corrisponde ad alcuna delle direttive del file /etc/hosts.allow, questo significa solo che questo accesso è consentito, a meno che venga poi impedito da quanto contenuto nel file /etc/hosts.deny.

In generale, le righe che iniziano con il simbolo # sono ignorate, in qualità di commenti; le righe bianche e quelle vuote sono ignorate ugualmente. Le direttive occupano normalmente una riga, a meno che terminino con il simbolo \ (subito prima del codice di interruzione di riga) che rappresenta una continuazione nella riga successiva.

La sintassi valida per le direttive varia a seconda di come è stato compilato il programma tcpd. Il minimo che dovrebbe essere sempre valido corrisponde allo schema seguente:

elenco_di_demoni  :  elenco_di_clienti

Alla sinistra dei due punti si elencano i programmi demone il cui utilizzo si vuole concedere ai nodi elencati alla destra. Gli elementi appartenenti a un elenco possono essere separati con una virgola o uno spazio.

È consentito l'uso di speciali nomi jolly e altri simboli che facilitano l'indicazione di gruppi di nomi.

Elementi
. indirizzo

L'indirizzo di un nodo che inizia con un punto indica in realtà tutti gli indirizzi che finiscono con quel suffisso. Se si utilizzano nomi di dominio invece di indirizzi numerici, si fa riferimento a un intero dominio. Per esempio, .brot.dg rappresenta tutti i nodi del dominio brot.dg.

indirizzo .

L'indirizzo di un nodo che finisce con un punto indica in realtà tutti gli indirizzi che iniziano con quel prefisso. Se si utilizzano indirizzi IP numerici, si fa riferimento a una rete intera. Per esempio, 192.168. rappresenta tutti i nodi della rete 192.168.0.0.

@ dominio_NIS

Il nome di un dominio NIS viene indicato con il prefisso @, e rappresenta tutti i nodi che appartengono a tale dominio.

indirizzo_IP / maschera_IP

Rappresenta gli indirizzi che si ottengono eseguendo l'AND tra indirizzo e maschera. Per esempio, 192.168.72.0/255.255.254.0 rappresenta tutti gli indirizzi a partire da 192.168.72.0 a 192.168.73.255.

ALL

È un jolly che rappresenta tutto. Se si trova alla sinistra dei due punti indica tutti i demoni dei servizi, se si trova alla destra rappresenta tutti i nodi.

LOCAL

È un jolly che indica tutti gli elaboratori locali, intendendosi con questo quelli rappresentabili senza alcun punto.

UNKNOWN

È un jolly che rappresenta tutti i nodi il cui nome o indirizzo risulta sconosciuto. Se si vuole usare questo modello, occorre considerare che i nodi potrebbero risultare sconosciuti anche a causa di un'interruzione temporanea del servizio DNS.

KNOWN

È un jolly che rappresenta tutti i nodi il cui nome o indirizzo risulta conosciuto. Se si vuole usare questo modello, occorre considerare che i nodi potrebbero risultare sconosciuti anche a causa di un'interruzione temporanea del servizio DNS.

PARANOID

È un jolly che corrisponde ai nodi il cui nome non corrisponde all'indirizzo. In pratica, si vuole che tcpd, attraverso il DNS, determini l'indirizzo in base al nome, quindi si vuole ancora che trasformi il nome in indirizzo (indirizzo --> nome --> indirizzo); se non c'è corrispondenza tra gli indirizzi ottenuti, il nodo rientra in questa categoria.

EXCEPT

È un operatore che può essere utilizzato all'interno di un elenco di nomi per escluderne i successivi.

Esempi
ALL : ALL

Consente l'utilizzo di qualsiasi servizio da parte di qualsiasi nodo.

ALL : ALL EXCEPT .mehl.dg

Consente l'utilizzo di qualsiasi servizio da parte di qualsiasi nodo a eccezione di quelli il cui dominio è mehl.dg.

ALL : .brot.dg

Consente l'utilizzo di qualsiasi servizio da parte dei nodi appartenenti al dominio brot.dg.

ALL : .brot.dg EXCEPT caino.brot.dg

Consente l'utilizzo di qualsiasi servizio da parte dei nodi appartenenti al dominio brot.dg, a esclusione di caino.brot.dg.

ALL : 192.168.

Consente l'utilizzo di qualsiasi servizio da parte dei nodi appartenenti alla sottorete 192.168.0.0.

in.fingerd : LOCAL
ALL : ALL

L'ordine in cui appaiono le direttive è importante. In questo caso, le richieste per il servizio Finger (rappresentato dal demone in.fingerd), vengono accettate solo se provengono da indirizzi locali. Tutti gli altri servizi sono permessi da qualunque origine.

Per un controllo più facile degli accessi, conviene indicare all'interno del file /etc/hosts.deny soltanto ALL : ALL in modo da impedire tutti gli accessi che non siano consentiti esplicitamente da /etc/hosts.allow.

97.3.3   /etc/hosts.deny

tcpd verifica la corrispondenza tra il nodo che tenta la connessione e le direttive del file /etc/hosts.allow; se questo non combacia con alcuna di queste, viene verificata la corrispondenza con le direttive del file /etc/hosts.deny. Se esiste una direttiva che gli corrisponde, l'accesso viene rifiutato.

La sintassi utilizzata in questo file è la stessa già descritta per /etc/hosts.allow, con gli stessi jolly e gli stessi significati di corrispondenza.

Per questioni di sicurezza, è conveniente indicare all'interno di questo file solo la riga seguente:

ALL : ALL

In questo modo si impedisce qualsiasi accesso che non sia stato concesso espressamente da parte di /etc/hosts.allow.

Appunti di informatica libera 2001.01.30 --- Copyright © 2000-2001 Daniele Giacomini --  daniele @ swlibero.org

Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome organizzazione_e_controllo_dei_servizi_di_rete.html

[successivo] [precedente] [inizio] [fine] [indice generale] [licenze] [indice analitico] [tomo] [parte]