[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

84. 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.

84.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, e questo attraverso inetd 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 tipico caso è dato dal sistema di condivisione dei filesystem in rete, o NFS.

La gestione da parte di inetd permette di ridurre il carico del sistema, avviando solo i servizi necessari nel momento in cui ne viene fatta richiesta, e di introdurre un ulteriore sistema di controllo attraverso un altro programma: tcpd

84.2 Supervisione dei servizi di rete

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 programma tcpd, il quale si occupa prevalentemente di verificare che le richieste dei servizi provengano da indirizzi autorizzati.

84.2.1 # inetd

inetd [<opzioni>] [<file-di-configurazione>]

Si tratta del demone principale per la gestione dei servizi da offrire all'esterno (attraverso la rete). Di solito viene avviato automaticamente dalla procedura di inizializzazione del sistema. Quando è in funzione, si mette in ascolto di un determinato gruppo di porte e quando rivela una comunicazione in una di queste, determina qual è il servizio corrispondente e lo avvia. In sostanza, inetd 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>

84.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 effettuano 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:

  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 (datagram). In tutti gli altri casi, si usa esclusivamente la parola chiave nowait.

    In base alle richieste dei client, 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 completo di avvio del programma che offre il servizio. Se si tratta di un servizio interno a inetd 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
    

84.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 minimo controllo sui servizi principali.

I compiti del TCP wrapper possono essere:

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

84.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 inetd. In pratica, esegue alcuni controlli, si occupa di annotare attraverso il registro di sistema le richieste di esecuzione di questi servizi, e 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).

84.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-client>

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, e quindi 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.

84.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 Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]