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.
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.
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).
Specifica il numero massimo di invocazioni simultanee per ogni servizio; il default è
illimitato. Può essere sovrascritto per ogni servizio dal parametro max-child
.
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
.
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.
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
.
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:
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
È 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.
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.
Uno dei seguenti:
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.
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.
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
.
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
.
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.
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]>.