2.7.2 inetd e xinetd
Esiste anche un altro metodo di avvio automatico dei daemon, attraverso l’utilizzo del
daemon inetd (Internet services daemon) o derivato. Tale daemon, detto anche
super daemon, è stato pensato principalmente per l’avvio automatico dei daemon
relativi ai servizi di rete: anziché lanciare in esecuzione i daemon relativi a tali servizi
all’avvio del sistema, viene lanciato soltanto inetd che rimane in attesa sulle varie
porte di
eventuali richieste di uno dei servizi elencati nel file di configurazione /etc/inetd.conf. Non
appena arriva una richiesta di un servizio, inetd lancia in esecuzione il daemon relativo. In
questo modo è possibile risparmiare risorse di sistema piuttosto che avere processi che
consumano risorse e non vengono utilizzati per gran parte del tempo che il sistema rimane
acceso.
Le informazioni riportate in questa sezione presuppongono una conoscenza dei
processi e dei protocolli di rete. Si raccomanda pertanto di leggere i cap. 7 e 16
prima di proseguire con la lettura di questa sezione.
|
Generalmente le distribuzioni di GNU/Linux forniscono un comando che estende le
funzionalità di inetd, xinetd (extended inetd) (man page xinetd(8)).
____________________________________________________________________
Comando: xinetd
Path: /usr/sbin/xinetd
SINTASSI
# xinetd [option]
DESCRIZIONE
-
option indica la modalità di funzionamento di xinetd. Può assumere i segueni
valori:
-
-d abilita la modalità di debug;
-
-syslog syslog_facility
imposta la facility relativa al system log
secondo quanto specificato da syslog_facility;
-
-filelog logfile
indica di redirigere il log degli eventi di xinetd nel file logfile;
-
-f config_file
indica il file di configurazione da considerare secondo quanto
specificato da config_file (default /etc/xinetd.conf);
-
-pidfile pid_file
indica di scrivere nel file pid_file il PID del processo lanciato;
-
-stayalive
indica di rimanere in esecuzione anche se nel file di configurazione
non è stato specificato nessun servizio;
-
-limit proc_limit
imposta il numero massimo di processi che xinetd può lanciare
secondo quanto specificato da proc_limit;
-
-logprocs limit
imposta il numero massimo di daemon che possono essere lanciati in
esecuzione per ogni utente, secondo quanto specificato da limit;
-
-version
visualizza la versione di xinetd;
-
-inetd_compat
indica di considerare anche il file di configurazione /etc/inetd.conf
subito dopo /etc/xinetd.conf;
-
-cc interval
indica di controllare un controllo periodico del proprio stato ogni
interval secondi;
Il processo xinetd effettua le operazioni elencate in corrsipondenza dei seguenti
segnali.
-
SIGHUP rilegge il file di configurazione e termina l’esecuzione dei daemon relativi a
servizi non più attivi (secondo quanto specificato nel file di configurazione).
-
SIGQUIT
termina la sua esecuzione.
-
SIGTERM
termina l’esecuzione di tutti i daemon prima di terminare anche la sua
esecuzione.
-
SIGUSR1
scrive il suo stato interno (dump) nel file /var/run/xinetd.dump.
-
SIGIOT controlla la consistenza delle sue strutture dati, visualizzando quindi un
messaggio relativo.
________________________________________________________________________
Il file di configurazione di xinetd (/etc/xinetd.conf) è un file di testo che indica i
servizi gestiti da xinetd. Contiene delle sezioni, ognuna delle quali identifica un servizio, con
la seguente sintassi:
service service_name
{
attribute assign_op [value] [value] [...]
[...]
}
dove
-
service_name
è l’indicazione di un servizio gestito da xinetd;
-
attribute
indica un attributo relativo al servizio service_name. Gli attributi possibili sono
di seguito elencati
-
id identifica univocamente un servizio (se non indicato tale attributo ha lo
stesso valore di service_name);
-
type indica il tipo di servizio, secondo quanto specificato da value, che può
assumere i seguenti valori
-
RPC servizio RPC (Remote Procedure Call);
-
INTERNAL
servizio fornito direttamente da xinetd;
-
TCPMUX/TCPMUXPLUS
servizio avviabile per mezzo della porta TCPMUX (v. RFC 1078);
-
UNLISTED
servizio il cui daemon non si trova nella nomenclatura standard del
filesystem (es. /etc/rpc per i servizi RPC, /etc/services per i
servizi non RPC);
-
flags indica il tipo di gestione del servizio da parte di xinetd, secondo quanto
specificato da value, che può assumere i seguenti valori
-
INTERCEPT
intercetta i pacchetti per verificare che provengano da indirizzi
conosciuti;
-
NORETRY
non effettua nessun tentativo di rilancio nel caso in cui si verifichi
un errore di lancio in esecuzione del daemon che gestisce il servizio;
-
IDONLY
accetta le connessioni soltanto se il mittente identifica l’utente;
-
NAMEINARGS
fa considerare al daemon da lanciare in esecuzione il primo
argomento dell’attributo server_args come primo argomento della
riga di comando;
-
NODELAY
imposta il flag TCP_NODELAY del socket relativo al servizio (se si tratta
di un servizio TCP);
-
KEEPALIVE
imposta il flag SO_KEEPALIVE del socket relativo al servizio (se si
tratta di un servizio TCP);
-
NOLIBWRAP
disabilita le chiamate alla libreria tcp-wrap per determinare l’accesso
al servizio;
-
SENSOR
rimpiazza l’attivazione del servizio con un’apposita routine che
rileva gli accessi alla specifica porta ed inserisce gli indirizzi IP dei
mittenti nell’elenco globale degli indirizzi indesiderati (no_access
list). I pacchetti successivi che arrivano dagli indirizzi IP in tale
elenco saranno scartati, finché non sarà passato il tempo specificato
dall’attributo deny_time;
-
IPv4
indica che il servizio deve gestire il protocollo IPv4;
-
IPv6
indica che il servizio deve gestire il protocollo IPv6;
-
disable
indica se il servizio è disabilitato (yes) o meno (no);
-
socket_type
indica il tipo di socket utilizzato dal servizio, secondo quanto specificato da
value, che può assumere i seguenti valori
-
stream
servizio basato su stream;
-
dgram
servizio basato su datagram;
-
raw servizio che accede direttamente a livello IP;
-
seqpacket
servizio che richiede una trasmissione affidabile dei datagram;
-
protocol
indica il protocollo utilizzato dal servizio (il nome del protocollo
deve essere elencato nel file /etc/protocols);
-
wait indica se il servizio è di tipo single-threaded (yes) o multi-threaded (no). Nel
caso di servizio single-threaded, xinetd avvierà il daemon alla prima richiesta
del servizio ed ulteriori richieste non verranno gestite (finché il daemon non
terminerà la sua esecuzione). Nel caso di servizio multi-threaded ogni richiesta
del servizio farà lanciare in esecuzione un’istanza del daemon relativo (ad
sempio, se arrivano 3 richieste dello stesso servizio una dopo l’altra,
viene lanciato in esecuzione 3 volte il relativo daemon) (v. anche
instances);
-
user indica lo username dell’utente che deve lanciare in esecuzione il daemon (lo
username deve essere elencato nel file /etc/passwd);
-
group indica il groupname del gruppo che deve lanciare in esecuzione il daemon (il
groupname deve essere elencato nel file /etc/group);
-
instances
indica il numero di daemon che possono essere in esecuzione contemporaneamente
per un servizio. Se non si desidera indicare un limite si può assegnare a tale
attributo il valore UNLIMITED (default);
-
nice indica la priorità di esecuzione del daemon (v. man page nice(3));
-
server indica il daemon da lanciare in esecuzione per la gestione del servizio;
-
server_args
indica gli argomenti da passare al daemon sulla riga di comando, tranne il
nome del comando (daemon) che è nell’attributo server;
-
only_from
indica un elenco di indirizzi IP per i quali è disponibile il servizio.
L’indicazione degli indirizzi IP può essere effettuata tramite la decimal dotted
notation con l’utilizzo del network prefix, il nome di una rete (contenuto nel
file /etc/networks), il nome di un interfaccia (contenuto nel file /etc/hosts o
raggiungibile per mezzo di un DNS);
-
no_access
indica un elenco di indirizzi IP per i quali non è disponibile il servizio.
L’indicazione degli indirizzi IP può essere effettuata nello stesso modo indicato
per l’attributo only_from. La disponibilità del servizio per un determinata
macchina viene decisa dall’indirizzo IP più stringente tra quelli elencati negli
attributi only_from e no_access ;
-
access_time
indica gli intervalli di tempo in cui il servizio deve essere disponibile. Questi
sono espressi nella forma hour:min-hour:min, dove hour e min sono
rispettivamente l’ora ed il minuto che identificano gli estremi di un
intervallo;
-
log_type
specifica in che modo tracciare il servizio, secondo quanto specificato da value,
che può assumere i seguenti valori
-
SYSLOG facility [level]
i messaggi di diagnostica vengono inviati al system log relativamente
alla facility indicata (v. sez. 6.9);
-
FILE filename [soft_limit [hard_limit]]
i messaggi di diagnostica vengono registrati nel file filename (che
se non esiste viene creato). Nel caso in cui il soft_limit venga
superato, xinetd registrerà un evento (nel system log),mentre se
viene superato l’hard_limit xinetd non scriverà più messaggi di
diagnostica relativamente al servizio considerato;
-
log_on_success
indica le informazioni da registrare quando un daemon viene lanciato in
esecuzione e quando esso termina, secondo quanto specificato da value, che può
assumere i seguenti valori
-
PID registra il PID (Process IDentifier)
del daemon;
-
HOST
registra l’indirizzo IP della macchina remota;
-
USERID
registra lo user id dell’utente remoto secondo quanto descritto nella
RFC 1413;
-
EXIT
registra l’exit status del daemon o il segnale di terminazione ad esso
inviato;
-
DURATION
registra la durata della sessione del servizio;
-
log_on_failure
indica le informazioni da registrare quando un daemon non può essere lanciato
in esecuzione, secondo quanto specificato da value, che può assumere i seguenti
valori
-
HOST
registra l’indirizzo IP della macchina remota;
-
USERID
registra lo user id dell’utente remoto secondo quanto descritto nella
RFC 1413;
-
ATTEMPT
registra il fatto che il tentativo di lancio in esecuzione del daemon
non è andato a buon fine;
-
rpc_version
indica la versione della RPC del servizio che può essere un numero o un
intervallo di valori (first_num-last_num);
-
rpc_number
indica il numero del servizio RPC (non in elenco);
-
env imposta le variabili di ambiente elencate (nella forma name=value) prima di
lanciare in esecuzione il daemon;
-
passenv
indica le variabili di ambiente di inetd da pasare al daemon prima di lanciarlo
in esecuzione;
-
port indica il numero della porta relativa al protocollo di livello trasporto (TCP o
UDP) utilizzato dal daemon;
-
redirect
indica di redirigere il servizio ad un altro indirizzo IP. Quando xinetd riceve
la richiesta del servizio, esso crea un processo che stabilisce una
connessione con l’indirizzo IP e la porta specificata e gli inoltra i
pacchetti ricevuti. L’indicazione del destinatario della redirezione
della comunicazione avviene per mezzo della sintassi (IP_address)
(port);
-
bind | interface
indica di collegare il servizio ad una specifica interfaccia di rete presente sulla
macchina. Questo può essere fatto con la sintassi (interface_IP_address);
-
banner indica di visualizzare il contenuto di un file sul monitor del sistema remoto
quando viene stabilita una connessione con il servizio;
-
banner_success
indica di visualizzare il contenuto di un file sul monitor del sistema remoto
quando l’accesso al servizio è consentito;
-
banner_fail
indica di visualizzare il contenuto di un file sul monitor del sistema remoto
quando l’accesso al servizio non è consentito;
-
per_source
indica il numero massimo di istanze (o UNLIMITED) del daemon per ogni
indirizzo IP remoto;
-
cps indica il limite al numero di connessioni da sistemi remoti nell’unità di tempo.
Prende due argomenti: il primo indica il numero massimo di connessioni al
secondo, mentre il secondo indica il numero di secondi di attesa prima di
riabilitare il servizio (nel caso in cui il numero di connessioni al secondo superi
il valore specificato dal primo argomento il servizio viene disabilitato e
riabilitato dopo il numero di secondi specificato dal secondo argomento)
(default 50 10);
-
max_load
indica il carico massimo (carico medio per minuto) oltre il quale xinetd non
accetta più connessioni. Questo è espresso da un valore in virgola
mobile;
-
groups indica se il daemon deve essere eseguito tenendo
conto del gruppo a cui appartiene il relativo effective
UID
(yes) o meno (no);
-
umask imposta l’umask
ereditata dal daemon, espressa per mezzo di un numero ottale. Se non viene
specificata, i daemon avranno tutti la umask relativa al momento
nel quale è stato lanciato in esecuzione xinetd in OR con il valore
228;
-
enabled
indica l’elenco dei servizi da abilitare (nel caso in cui un servizio sia stato
indicato come disabilitato - servizio disable o attributo DISABLE - il
servizio non viene considerato neanche se indicato nell’elenco di questo
attributo);
-
include
indica di utilizzare il file specificato di seguito come file di configurazione di
xinetd;
-
includedir
indica di utilizzare tutti i file contenuti nella directory specificata di seguito
(tranne quelli il cui nome contiene un punto ‘.’ o finisce con il carattere tilde
‘~’), come file di configurazione di xinetd;
-
rlimit_as
indica il limite massimo dello spazio di indirizzamento per il processo relativo
al daemon che gestisce il servizio (in byte, ma possono essere utilizzati i
simboli ‘K’ - kibi - e ‘M’ - mebi - o ‘UNLIMITED’ - illimitato);
-
rlimit_cpu
indica il limite massimo dei secondi di CPU che il processo relativo al daemon
che gestisce il servizio può utilizzare (può essere utilizzato anche il simbolo
‘UNLIMITED’ - illimitato);
-
rlimit_data
indica il limite massimo dei byte utilizzabili per la gestione dei dati relativi
al processo (può essere utilizzato anche il simbolo ‘UNLIMITED’ -
illimitato);
-
rlimit_rss
indica il limite massimo della parte di memoria riservata per la parte residente
del processo (che non deve risentire dello swapping) (in byte, ma può essere
utilizzato anche il simbolo ‘UNLIMITED’ - illimitato);
-
rlimit_stack
indica il limite massimo dello stack del processo (in byte, ma può essere
utilizzato anche il simbolo ‘UNLIMITED’ - illimitato);
-
deny_time
indica l’intervallo di tempo, in minuti che deve intercorrere tra due accessi
consecutivi allo stesso servizio, nel caso in cui si riesca a scavalcare il SENSOR
(possono essere utilizzati anche i simboli ‘FOREVER’ - l’accesso è
consentito soltanto una volta - e ‘NEVER’ - traccia l’indirizzo IP del
mittente);
-
assign_op
è un operatore di assegnamento, e può essere = (specifica l’unico valore dell’attributo),
+= (aggiunge un valore all’attributo) o -= (rimuove un valore dall’attributo). gli
attributi only_from, no_access, log_on_success, log_on_failure e passenv supportano
tutti i tipi di operatori, l’operatore env non supporta l’operatore -= e tutti gli altri
suportano soltanto l’operatore =;
Non è necessario specificare tutti gli attributi per ogni servizio, ma quelli necessari (per
ogni tipologia di servizio) sono riportati nella tab. 2.6.
| Tabella 2.6: | Attributi necessari per i servizi avviati da xinetd. |
|
Il file di configurazione può anche contenere una sezione defaults che indica gli attributi di
default per tutti i servizi che non li specificano.
defaults
{
attribute = value [value] [...]
[...]
}
Alcuni attributi (log_on_success, log_on_failure, only_from, no_access, passenv, disabled,
enabled) hanno un effetto cumulativo ed ogni volta che vengono specificati accumulano il
valore a quello precedente, cioè per essi, l’operatore = equivale a +=.
Un esempio del contenuto del file di configurazione di xinet è riportato di seguito
defaults
{
log_type = FILE /var/log/servicelog
log_on_success = PID
log_on_failure = HOST RECORD
only_from = 128.138.193.0 128.138.204.0
only_from = 128.138.252.1
instances = 10
disabled = rstatd
}
#
# Note 1: the protocol attribute is not required
# Note 2: the instances attribute overrides the default
#
service login
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/etc/in.rlogind
instances = UNLIMITED
}
#
# Note 1: the instances attribute overrides the default
# Note 2: the log_on_success flags are augmented
#
service shell
{
socket_type = stream
wait = no
user = root
instances = UNLIMITED
server = /usr/etc/in.rshd
log_on_success += HOST RECORD
}
service ftp
{
socket_type = stream
wait = no
nice = 10
user = root
server = /usr/etc/in.ftpd
server_args = -l
instances = 4
log_on_success += DURATION HOST USERID
access_times = 2:00-9:00 12:00-24:00
}
# Limit telnet sessions to 8 Mbytes of memory and a total
# 20 CPU seconds for child processes.
service telnet
{
socket_type = stream
wait = no
nice = 10
user = root
server = /usr/etc/in.telnetd
rlimit_as = 8M
rlimit_cpu = 20
}
#
# This entry and the next one specify internal services. Since
# this is the same service using a different socket type, the
# id attribute is used to uniquely identify each entry
#
service echo
{
id = echo-stream
type = INTERNAL
socket_type = stream
user = root
wait = no
}
service echo
{
id = echo-dgram
type = INTERNAL
socket_type = dgram
user = root
wait = no
}
service servers
{
type = INTERNAL UNLISTED
protocol = tcp
port = 9099
socket_type = stream
wait = no
}
#
# Sample RPC service
#
service rstatd
{
type = RPC
socket_type = dgram
protocol = udp
server = /usr/etc/rpc.rstatd
wait = yes
user = root
rpc_version = 2-4
env = LD_LIBRARY_PATH=/etc/securelib
}
#
# Sample unlisted service
#
service unlisted
{
type = UNLISTED
socket_type = stream
protocol = tcp
wait = no
server = /home/user/some_server
port = 20020
}
Per ogni servizio può essere specificato un grado di tracciamento (log) quando il
relativo daemon serve le richieste. xinetd genera dei messaggi di log con la seguente
sintassi
entry: service_id data
dove
-
entry è costituito da uno dei seguenti elementi
-
START indica l’avvio di un daemon. Il relativo messaggio di log ha la seguente
sintassi
START: service_id [pid=num] [from=IP_address]
-
EXIT indica la terminazione di un daemon. Il relativo messaggio di log ha la
seguente sintassi
EXIT: service_id [type=num] [pid=num] [duration=num(sec)]
dove type può essere status, seguito dal relativo exit status, o signal, seguito
dal valore numerico del segnale che ha provocato la terminazione.
-
FAIL indica un tentativo di avvio di un daemon non andato a buon fine. Il relativo
messaggio di log ha la seguente sintassi
FAIL: service_id reason [from=IP_address]
dove reason può assumere i seguenti valori
-
fork indica che un determinato numero di tentativi di chiamata alla
system call fork non è andato a buon fine (il numero di tentativi
è configurabile);
-
time il controllo sul tempo non è andato a buon fine;
-
address
il controllo relativo all’indirizzonon è andato a buon fine;
-
service_limit
indica che è stato oltrepassato il numero massimo di istanze del
daemon;
-
process_limit
indica che è stato oltrepassato il numero di processi figli (creati
con fork);
-
DATA indica un tentativo di avvio di un daemon non andato a buon fine, se il
daemon supporta l’opzione RECORD. Il relativo messaggio di log ha la seguente
sintassi
DATA: service_id data
dove data può assumere, dipendentemente dal servizio, i valori di seguito
riportati
-
login
remote_user=remote_username local_user=local_username tty=tty
-
exec
remote_user=remote_username verify=status command=command
dove status può essere ok (la password è stata riconosciuta), failed (la
password non è stata riconosciuta) e baduser (lo username non è stato
riconosciuto);
-
shell
remote_user=remote_username local_user=local_username command=command
-
finger
string
dove string è la stringa ricevuta o una riga vuota;
-
USERID indica che è utilizzata l’opzione USERID. Il relativo messaggio di log ha la
seguente sintassi
USERID: service_id text
dove text è la risposta dell’identificazione da parte del richiedente il
servizio;
-
NOID indica che è stata utilizzata sia l’opzione USERID, che il flag IDONLY ed il
richiedente non si è identificato. Il relativo messaggio di log ha la seguente
sintassi
NOID: service_id IP_address reason
-
service_id
è l’identificativo del daemon per il quale è stato scritto il messaggio nel
log;
-
data dati relativi al messaggio di log, dipendenti dal tipo di segnalazione che il messaggio
stesso rappresenta;