This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

Il Super-Server inetd

24.2 Il “Super-Server” inetd

Grazie al contributo di Chern Lee.

24.2.1 Uno sguardo d'insieme

inetd(8) viene 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 una sola istanza di inetd riduce 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.

24.2.2 Impostazioni

inetd viene inizializzato attraverso il sistema /etc/rc.conf. L'opzione inetd_enable è impostata a NO di default, ma viene spesso attivata da sysinstall con la politica di sicurezza media. Inserendo:

inetd_enable="YES"
o
inetd_enable="NO"
in /etc/rc.conf si abilita o meno la partenza di inetd al boot.

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

24.2.3 Opzioni su linea di comando

inetd synopsis:

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

-d

Attiva il debugging.

-l

Attiva il tracciamento delle connessioni avvenute con successo.

-w

Attiva il wrapping TCP per i servizi esterni (attivo di default).

-W

Attiva il wrapping TCP per i servizi interni che sono incorporati in inetd (attivo di default).

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

-a

Specifica un indirizzo IP al quale effettuare il bind. In alternativa, può essere specificato un hostname, nel qual caso l'indirizzo IPv4 o IPv6 che corrisponde a quell'hostname è usata. Di solito viene specificato un hostname quando inetd è eseguito all'interno di una jail(8), in questo caso l'hostname corrisponde all'ambiente jail(8).

Quando si specifica l'hostname e si opta per entrambi i bindings IPv4 ed IPv6, è richiesta una linea di configurazione per ogni protocollo appropriato per ogni servizio in /etc/inetd.conf. Per esempio, un servizio basata sul TCP necessita di due entry, una che usa tcp4 come protocollo e l'altra che usa tcp6.

-p

Specifica un altro file in cui salvare il l'ID di processo.

Queste opzioni possono essere passate ad inetd usando l'opzione inetd_flags nel file /etc/rc.conf. Di default, inetd_flags è impostata a -wW, il che attiva il TCP wrapping per i servizi interni ed esterni di inetd. Per i novizi, questi parametri di solito non necessitano di essere modificati o inseriti in /etc/rc.conf.

Nota: Un servizio esterno è un demone all'esterno di inetd, che viene invocato quando una connessione è ricevuta per lui. D'altro canto, un servizio interno è un servizio che inetd ha l'opzione di offrire lui stesso.

24.2.4 inetd.conf

La configurazione di inetd è controllata 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 inviando un segnale HangUP al processo inetd come mostrato di seguito:

Esempio 24-1. Inviare ad inetd un segnale HangUP

# kill -HUP `cat
/var/run/inetd.pid`

Ogni linea del file di configurazione specifica un singolo demone. I commenti nel file sono preceduti da un “#”. Il formato di /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 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]]

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.

Oltre all'opzione max-child, un'altra opzione che limita il massimo numero di connessioni da un singolo ip verso un particolare demone può essere attivata. max-connections-per-ip-per-minute fa esattamente questo. Un valore di dieci in questo caso dovrebbe limitare ogni singolo indirizzo IP che cerca di connettersi ad un particolare servizio dieci volte al minuto. Questo è utile per prevenire 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 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, come si vede di seguito:

finger stream  tcp     nowait/3/10 nobody
/usr/libexec/fingerd fingerd -s
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.

24.2.5 Sicurezza

A seconda del profilo di sicurezza scelto all'installazione, molti demoni di inetd potrebbero essere attivi di default. Se non c'è necessità apparente per un particolare demone, disabilitalo! Usa un “#” in cima alla riga del demone in questione in /etc/inetd.conf, e invia un segnale hangup ad inetd. Alcuni demoni, come fingerd, potrebbero non essere assolutamente desiderati, poichè forniscono all'attaccante troppe informazioni.

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 su certi demoni.

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.

24.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 (ident, identd) , ed è configurabile fino ad un certo punto.

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 <questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a <doc@FreeBSD.org>.