27.2 Il “Super-Server” inetd

Grazie al contributo di Chern Lee. Aggiornato per FreeBSD 6.1-RELEASE da The FreeBSD Documentation Project.

27.2.1 Uno sguardo d'insieme

inetd(8) viene talvolta definito l'“Internet Super-Server” perchè gestisce le connessioni verso molti servizi. Quando una connessione viene ricevuta da inetd, questo determina per quale programma la connessione sia destinata, esegue quel particolare processo e affida a lui la socket (il programma è invocato con la socket del servizio come descrittore di standard input, output ed error). Eseguire inetd per server dal carico non troppo alto può ridurre il carico complessivo di sistema, rispetto all'esecuzione individuale di ogni demone in modalità stand-alone.

Principalmente, inetd è usato per lanciare altri demoni, ma molti protocolli triviali sono gestiti direttamente, come ad esempio i protocolli chargen, auth, e daytime.

Questa sezione coprirà le basi della configurazione di inetd attraverso le opzioni da linea di comando ed il suo file di configurazione, /etc/inetd.conf.

27.2.2 Impostazioni

inetd viene inizializzato attraverso il sistema rc(8). L'opzione inetd_enable è impostata a NO di default, ma può essere attivata da sysinstall durante l'installazione, a seconda della configurazione scelta dall'utente. Inserendo:

inetd_enable="YES"

o

inetd_enable="NO"

in /etc/rc.conf si abiliterà o meno la partenza di inetd al boot. Il comando:

# /etc/rc.d/inetd rcvar

può essere utilizzato per mostrare le impostazioni attive al momento.

Inoltre, diverse opzioni di linea di comando possono essere passate a inetd attraverso l'opzione inetd_flags.

27.2.3 Opzioni su linea di comando

Come molti server di rete, inetd ha un numero di opzioni che possono essergli passate per modificare il suo comportamento. La lista di tutte le opzioni è:

inetd synopsis:

inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname] [-p filename] [-R rate] [configuration file]

Si possono passare opzioni ad inetd usando l'opzione inetd_flags in /etc/rc.conf. Di default, inetd_flags è impostato a -wW -C 60, il che attiva il TCP wrapping per i servizi di inetd, ed impedisce ad ogni singolo indirizzo IP di richiedere qualsiasi servizio piùdi 60 volte al minuto.

Gli utenti novizi possono notare con piacere che questi parametri di solito non devono essere modificati, anche se bisogna menzionare il fatto che le opzioni di limitazione delle connessioni sono utili solo se ci si accorge di ricevere un numero eccessivo di connessioni. L'intera lista delle opzioni di inetd(8) può essere trovata nel manuale di inetd(8).

-c maximum

Specifica il numero massimo di invocazioni simultanee per ogni servizio; il default è illimitato. Può essere sovrascritto per ogni servizio dal parametro max-child.

-C rate

Specifica un numero massimo di volte in cui un servizio può essere invocato da un singolo indirizzo IP in un minuto; il default è illimitato. Può essere sovrascritto per ogni servizio con il parametro max-connections-per-ip-per-minute.

-R rate

Specifica il numero massimo di volte che un servizio può essere invocato in un minuto; il default è 256. L'impostazione 0 permette un numero illimitato di invocazioni.

-s maximum

Specifica il numero massimo di volte che un servizio può essere invocato per ogni periodo di tempo; il default è illimitato. Può essere sovrascritto per ogni singolo servizio con il parametro max-child-per-ip.

27.2.4 inetd.conf

La configurazione di inetd è fatta attraverso il file /etc/inetd.conf.

Quando viene apportata una modifica a /etc/inetd.conf, si può forzare inetd a rileggere il suo file di configurazione eseguendo il comando:

Esempio 27-1. Ricaricare il file di configurazione di inetd

# /etc/rc.d/inetd reload

Ogni linea del file di configurazione specifica un singolo demone. I commenti nel file sono preceduti da un “#”. Il formato di ogni riga del file /etc/inetd.conf è il seguente:

nome del servizio
tipo della socket
protocollo
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
utente[:gruppo][/classe-di-login]
programma-server
argomenti-del-programma-server

Un esempio di linea per il demone ftpd(8) usando l'IPv4:

ftp     stream  tcp     nowait  root /usr/libexec/ftpd       ftpd -l
nome-del-servizio

È il nome del servizio per il demone. Deve corrispondere ad un servizio elencato in /etc/services. Questo determina su quale porta inetd deve restare in ascolto. Se viene creato un nuovo servizio, deve essere messo prima in /etc/services.

tipo-di-socket

Una a scelta fra stream, dgram, raw, o seqpacket. stream deve essere usata per demoni basati sulla connessione, tipo TCP, mentre dgram è usato per demoni che usano il protocollo di trasporto UDP.

protocollo

Uno dei seguenti:

Protocollo Spiegazione
tcp, tcp4 TCP IPv4
udp, udp4 UDP IPv4
tcp6 TCP IPv6
udp6 UDP IPv6
tcp46 Entrambi TCP IPv4 e v6
udp46 Entrambi UDP IPv4 e v6
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

wait|nowait indica se il demone invocato da inetd è in grado di gestire la sua socket o meno. Il tipo di socket dgram deve usare l'opzione wait, mentre i demoni con socket stream, che sono in genere multi-thread, devono usare nowait. wait in genere fornisce socket multiple ad un singolo demone, mentre nowait lancia un demone figlio per ogni nuova socket.

Il massimo numero di demoni figli che inetd può lanciare si imposta attraverso l'opzione max-child. Se è richiesto un limite di dieci istanze per un particolare demone, un /10 dovrebbe essere inserito dopo l'opzione nowait. Specificando /0 si lascia un numero illimitato di figli.

Oltre all'opzione max-child, possono essere attivate due altre opzioni che limitano il massimo numero di connessioni da un singolo ip verso un particolare demone. max-connections-per-ip-per-minute limita il numero di connessioni da un particolare indirizzo IP per minuto, ad esempio un valore di dieci limiterebbe ogni singolo indirizzo IP a connettersi verso un certo servizio a dieci connessioni al minuto. max-child-per-ip limita il numero di figli che possono essere avviati su richiesta di un singolo indirizzo IP in ogni momento. Queste opzioni sono utili per prevenire eccessivo consumo delle risorse intenzionale o non intenzionale e attacchi Denial of Service (DoS) ad una macchina.

In questo campo, wait o nowait sono obbligatorie. max-child e max-connections-per-ip-per-minute e max-child-per-ip sono opzionali.

Un demone tipo-stream multi-thread senza i limiti max-child o max-connections-per-ip-per-minute dovrebbe essere semplicemente: nowait.

Lo stesso demone con un limite massimo di dieci demoni dovrebbe avere: nowait/10.

In aggiunta, la stessa impostazione con un limite di venti connessioni per IP al minuto ed un limite massimo di dieci demoni figli avrebbe: nowait/10/20.

Queste opzioni sono tutte utilizzate di default nelle impostazioni del demone fingerd(8) come si vede di seguito:

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

Alla fine, un esempio di questo campo con 100 figli in tutto, con un massimo di 5 per singolo indirizzo IP sarebbe: nowait/100/0/5.

user

Questo è lo username sotto il quale un particolare demone dovrebbe girare. Di frequente, i demoni girano come utente root. Per motivi di sicurezza, è normale trovare alcuni server che girano con l'utente daemon, o il meno privilegiato utente nobody.

server-program

Il percorso assoluto del demone che deve essere eseguito quando è ricevuta una connessione . Se il demone è un servizio offerto da inetd internamente, bisogna usare internal.

server-program-arguments

Questa opzione funziona in congiunzione con server-program specificando gli argomenti, cominciando con argv[0], passati al demone al momento dell'invocazione. Se mydaemon -d è la linea di comando, mydaemon -d sarà il valore dell'opzione server-program-arguments. Ancora, se un demone è un servizio interno, usa internal.

27.2.5 Sicurezza

A seconda delle scelte fatte all'installazione, molti servizi di inetd potrebbero essere attivi di default. Se non c'è necessità apparente per un particolare demone, considera di disabilitarlo. Usa un “#” a capo della riga del demone in questione in /etc/inetd.conf, e quindi ricarica la configurazione di inetd. Alcuni demoni, come fingerd, potrebbero non essere assolutamente desiderati, poichè forniscono all'attaccante informazioni che gli potrebbero risultare utili.

Alcuni demoni non sono stati creati coll'obiettivo della sicurezza ed hanno timeout lunghi, o non esistenti. Questo permette ad un attaccante di inviare lentamente connessioni ad un particolare demone, saturando in questo modo le risorse disponibile. Può essere una buona idea impostare le limitazioni max-connections-per-ip-per-minute e max-child o max-child-per-ip su certi demoni se scopri di avere troppe connessioni.

Di default, il TCP wrapping è attivo. Consulta la pagina del manuale di hosts_access(5) per impostare delle restrizioni TCP su certi demoni invocati da inetd.

27.2.6 Miscellanei

daytime, time, echo, discard, chargen, e auth sono tutti servizi interni di inetd.

Il servizio auth fornisce servizi di rete di identificazione ed è configurabile fino ad un certo punto, mentre gli altri possono solo essere accesi o spenti.

Consulta la paigna di manuale di inetd(8) per dettagli più approfonditi.

Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Per domande su FreeBSD, leggi la documentazione prima di contattare <[email protected]>.
Per domande su questa documentazione, invia una e-mail a <[email protected]>.