Inetd è un demone (servizio) che ascolta sulle porte specificate nel suo file di configurazione e fa avviare il relativo servizio nel momento in cui viene fatta una richiesta.
Viene chiamato superdemone proprio per questa sua funzione di controllo di altri demoni.
Il vantaggio di usarlo è di ottimizzare le risorse del sistema, avviando il programma che gestisce un determinato servizio solo quando ci sono effettive richieste.
Sebbene possa essere usato per gestire quasi tutti i servizi è consigliabile farlo solo per quelli a basso e occasionale traffico.
/etc/inetd.conf
E' solitamente il suo file di configurazione
/etc/services
E' un file che assegna un nome di servizio alla relativa porta. Viene usato anche da altri programmi.
Spesso inetd si trova abbinato ai tcp wrappers che permettono di introdurre delle access list che regolano quali IP possono accedere a determinati servizi.
Spesso un'installazione standard di Unix lascia il file inetd.conf
con molte porte inutilmente aperte: è consigliabile commentare le relative righe per evitare che inet ascolti su porte non utilizzate e potenzialmente soggette ad intrusioni.
Ogni volta che viene cambiato il suo file di configurazione, va riavviato il servizio.
Inetd è comune su tutti gli Unix, ma su Linux più recenti si utilizza Xinetd, che è una versione più evoluta che introduce nuove funzionalità.
I tcp wrapper (tcpd), sviluppati dall'olandese Wietse Venema, sono un layer software che permette il controllo e il filtro degli accessi a servizi del sistema, tipicamente gestiti con inetd.
In pratica da una logica:
1- client (che esegue una connessione)
2- inetd (che risponde alla connessione e lancia il relativo server)
3- server (che processa la connessione al suo servizio)
si passa ad una configurazione:
1- client 2- inetd 3- tcpd 4- server
in cui i tcpwrappers possono limitare l'accesso al servizio secondo criteri configurabili ed hanno funzionalità anti-spoofing e anti tcp sequence guessing.
La configurazione dei tcp wrappers si fa essenzialmente in due file:
/etc/hosts.allow
Permette di specificare quali servizi permettere e da quali indirizzi IP
/etc/hosts.deny
Permette di specificare come limitare l'accesso a specifici servizi
In alcuni sistemi con Xinetd (es: RedHat) la configurazione dei wrappers viene direttamente inglobata nella configurazione dei singoli servizi.
E' il file di configurazione del superdemone Inetd.
Qui si configurano quali servizi e relative porte vengono resi disponibili sul sistema.
Ogni riga di /etc/inetd.conf corrisponde ad un servizio che viene gestito da inetd.
Se è commentata con un # il servizio non viene avviato e inetd non mette la relativa porta in listening.
Il formato di ogni riga è:
service type protocol wait user server argument
Un esempio di una riga tipica è:
ftp stream tcp nowait root /usr/sbin/in.ftpd -l
Se si vogliono utilizzare i tcpwrapper per limitare l'accesso al servizio la riga sopra diventa:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l
Vediamo nei dettagli le varie voci:
service E' il nome del servizio a cui si riferisce la riga di inetd.conf. La porta a cui è associato viene ottenuta dal file /etc/services
. Di default inetd.conf prevede vari servizi. Alcuni sono attivati, altri commentati. Tipicamente gli unici che si dovrebbero lasciare attivati (se serve) sono ftp e telnet o ssh (se si decide di non far partire il server ssh autnonomamente).
type Specifica il tipo di socket usata per il protocollo indicato. Può essere: stream, dgram, sunrpc_tcp, sunrpc_udp.
protocol Indica il tipo di protocollo: tcp o udp. Si basa sul file /etc/protocols
wait Indica se aspettare o no che il server invocato rilasci la socket prima di rimettersi in listening sulla relativa porta
user L'utente con cui viene lanciato il server. Inetd di suo viene eseguito come root.
server Il path completo del programma da eseguire per gestire la connessione per il servizio specificato
argument Gli argomenti da passare al comando di server lanciato.
Di default inetd permette fino a 40 connessioni al minuto su una specifica porta (è una misura anti attacchi DOS).
Questo può essere un limite per server particolarmente affollati.
Tipicamente un server pop3 con parecchie connessioni può superare questo limite e venire temporaneamente disattivato, lasciando un esplicativo messaggio di errore nei log.
Per impostare, per esempio a 100, il numero massimo di connessioni al minuto inserire una simile riga in inetd.conf:
pop-3 stream tcp nowait.100 root /usr/sbin/tcpd ipop3d
Nelle versioni di Linux più recenti Inetd viene sostituito da un superdemone più versatile e sicuro: Xinetd.
A differenza del precedessore, xinetd:
- Limita o regola l'accesso a determinati servizi sia con un sistema proprio sia inglobando nella sua configurazione i TcpWrappers
- Offre un sistema di logging indipendente da syslog
- Permette di limitare l'accesso ai servizi in determinate ore della giornata
- Supporta il protocollo Ipv6
- Utilizza vari meccanismi che mitigano l'impatto di un attacco DOS.
La configurazione del demone e dei servizi può essere suddivisa in più file (non compatibili con /etc/inetd.conf).
Su RedHat si deve operare su:
/etc/xinetd.conf
File principale di configurazione del demone
/etc/xinetd.d/*
Directory che contiene i singoli file dei servizi offerti da xinetd
E' il file di configurazione del superdemon Xinetd. Ha una sintassi leggermente più complicata e flessibile del suo analogo /etc/inet.conf e può prevedere degli "include" che ne facilitano la gestione.
In particolari su distribuzioni Linux come RedHat si usa inserire per ogni servizio un omonimo file di configurazione nella directory /etc/xinetd.d/
Vediamo un esempio di xinetd.conf leggermente modificato (in versione security paranoia) rispetto a quello standard.
[root@95 al]# cat /etc/xinetd.conf
Si definiscono fra parentesi graffe le proprietà comuni a tutti i servizi (defaults)
defaults
{
Numero di istanze del server evocato. Di default sono infinite
instances = 60
Specifica di usare SYSLOG con facility authpriv per il logging. Può anche essere FILE /path/nomelog
log_type = SYSLOG authpriv
Cosa viene loggato di ogni connessione. Può essere uno o più delle seguenti voci: HOST remoto, PID del server, DURATION della sessione, EXIT status del server, USERID dell'utente remoto (tramite identd - sconsigliato)
log_on_success = HOST PID
Cosa viene loggato di ogni connessione non riuscita (per access list o problemi nel lancio del server): HOST remoto, ATTEMPT registrato, USERID dell'utente remoto (identd), RECORD di ogni dato utile
log_on_failure = HOST RECORD
Limita il numero massimo di connessioni contemporanee per server: il primo numero è il numero di connessioni al secondo, superato il quale il servizio viene temporaneamente disabilitato per il numero di secondo indicato con la seconda cifra. Su server molto
cps = 25 30
Il numero massimo di connessioni da un singolo IP ad un determinato servizio
per_source = 5
}
Specifica la directory che contiente ulteriori file di configurazione (in genere 1 per ogni servizio)
includedir /etc/xinetd.d
Prendiamo un file di esempio di configurazione di un singolo servizio:
cat /etc/xinetd.d/wu-ftp
Definisce il servizio, associa la relativa prota tramite il file /etc/services
service ftp
{
Indica se disattivarlo o farlo funzionare, in questo caso il servizio è attivo
disable = no
Come viene gestito il flusso di dati sulla socket: stream Servizio basato su stream di dati, dgram Servizio basati su datagrammi, raw Servizio che richiede accesso diretto all'IP, seqpacket Sercizio che richiede una trasmissione di datagrammi affidabile
socket_type = stream
Indica se il server lanciato è single-threaded (wait=yes: Xinetd non accetta più connessioni fino a quando il server lanciato muore) o multi-threaded (wait=no: Xinetd continua ad accettare connessioni per il servizio ed invocare nuove istanze del server)
wait = no
L'utente con cui viene lanciato il server
user = root
Il path completo del comando per lanciare il server
server = /usr/sbin/in.ftpd
Gli argomenti eventualmente passati al comando lanciato
server_args = -l -a
Il += indica di aggiungere le impostazioni qui indicate a quelle impostate di default
log_on_success += DURATION
Il livello di priorità del server lanciato
nice = 10
Limita l'accesso al servizio solo dagli IP o reti indicati (Alcune notazioni valide: 10.0.0.0/24, 10.0.0.1, 0.0.0.0 (tutti gli IP)
only_from = 192.168.0.0/24
Esclude l'accesso dagli IP o reti indicati. Insieme a only_from gestire le access list di xinetd
no_access = 192.168.4.0/24
Definisce il range di ore del giorno in cui servizio è attivo. Formato hh.mm-hh.mm (hh da 0 a 23, mm da 0 a 59)
access_times = 0:0-6:30
}
Visualizza rapidamente quali servizi sono attivati e quali disattivati nella configurazione di xinetd.
Le righe dove si trova un disable = no
indicano che il rispettivo servizio è attivato.
grep disable /etc/xinetd.d/*
/etc/xinetd.d/chargen: disable = yes
/etc/xinetd.d/chargen-udp: disable = yes
/etc/xinetd.d/daytime: disable = yes
/etc/xinetd.d/daytime-udp: disable = yes
/etc/xinetd.d/echo: disable = yes
/etc/xinetd.d/echo-udp: disable = yes
/etc/xinetd.d/finger: disable = yes
/etc/xinetd.d/ntalk: disable = yes
/etc/xinetd.d/rexec: disable = yes
/etc/xinetd.d/rlogin: disable = yes
/etc/xinetd.d/rsh: disable = yes
/etc/xinetd.d/rsync: disable = no
/etc/xinetd.d/servers: disable = yes
/etc/xinetd.d/services: disable = yes
/etc/xinetd.d/talk: disable = yes
/etc/xinetd.d/telnet: disable = yes
/etc/xinetd.d/time: disable = yes
/etc/xinetd.d/time-udp: disable = yes
/etc/xinetd.d/wu-ftpd: disable = no