[>a256.html>] [<a254.html<] [^a2.html^]
In ogni sistema operativo multiutente c'è la necessità di controllare gli accessi, per mezzo della registrazione degli utenti e della registrazione degli eventi. Nei sistemi Unix un utente che può accedere ha un account: letteralmente si tratta di un conto, o in altri termini un «accredito», o meglio ancora una specie di contratto di utenza, che gli permette di esistere nel sistema in qualità di «utente logico».
La tabella 39.1 elenca i programmi e i file a cui si accenna in questo capitolo.
Tabella 39.1. Riepilogo dei programmi e dei file per la gestione della registrazione degli utenti e del controllo degli accessi.
Il registro del sistema (system log, o anche syslog) è la procedura di registrazione degli eventi importanti all'interno di un cosiddetto file di log, ovvero un file delle registrazioni. Questa procedura è gestita principalmente dal demone syslogd, che viene configurato attraverso /etc/syslog.conf
. Altri programmi o demoni possono aggiungere annotazioni al registro inviando messaggi a syslogd.
Anche se potrebbe sembrare che la conoscenza di questo sistema di registrazione sia uno strumento utile principalmente per chi ha già esperienza di GNU/Linux o dei sistemi Unix in generale, la consultazione dei file delle registrazioni può essere di aiuto al principiante che si trova in difficoltà e non sa quale sia la causa del mancato funzionamento di qualcosa.
syslogd [opzioni]
È il demone che si occupa delle annotazioni nel registrazione del sistema. Di norma viene avviato durante la procedura di avvio del sistema. Utilizza un file di configurazione che di solito è /etc/syslog.conf
. Questo file viene letto nel momento in cui syslogd si avvia e per fare in modo che venga riletto (per esempio dopo una modifica), occorre inviare al processo di syslogd un segnale di aggancio (SIGHUP).
kill -HUP PID_di_syslogd
-f file_di_configurazione
Specifica un file di configurazione diverso da quello predefinito.
-m minuti
Stabilisce l'intervallo espresso in minuti tra i messaggi di marcatura. Il valore predefinito è 20.
-p log_socket
Specifica un socket diverso da quello predefinito che è /dev/log
.
È il file di configurazione utilizzato da syslogd per definire in che modo devono essere gestiti i messaggi da registrare. Se si vogliono apportare modifiche a questo file è necessario fare in modo che venga riletto da syslogd. Per fare questo è possibile mandare a syslogd il segnale SIGHUP:
kill -HUP PID_di_syslogd
Tuttavia, in certi casi, questo segnale può anche provocare la conclusione del funzionamento del programma. Se necessario si può riavviare semplicemente:
#
syslogd
La sintassi per l'utilizzo di questo file di configurazione è relativamente semplice. Le righe vuote e quelle che iniziano con il simbolo # sono ignorate. Le altre sono record composti da due campi: il primo definisce la selezione, il secondo l'azione.
Il campo che definisce la selezione, serve a indicare per quali eventi effettuare un'annotazione attraverso l'azione indicata nel secondo campo. Questo primo campo si divide in due sottocampi, uniti da un punto singolo (.), e questi si riferiscono ai servizi e alle priorità. I servizi sono rappresentati da una serie di parole chiave che rappresentano una possibile origine di messaggi, mentre le priorità sono altre parole chiave che identificano il livello di gravità dell'informazione.
Le parole chiave riferite ai servizi possono essere:
auth;
authpriv;
cron;
daemon;
kern;
lpr;
mail;
news;
syslog;
user;
uucp;
da local0 a local7.
Volendo identificare tutti i servizi si può usare l'asterisco (*), mentre per indicarne un gruppo se ne può inserire un elenco separato da virgole (,).
Le parole chiave riferite alle priorità possono essere quelle seguenti, elencate in ordine di importanza crescente, per cui l'ultima è quella che rappresenta un evento più importante:
debug;
info;
notice;
warning;
err;
crit;
alert;
emerg.
In linea di massima, l'indicazione di una parola chiave che rappresenta una priorità implica l'inclusione dei messaggi che si riferiscono a quel livello, insieme a tutti quelli dei livelli superiori. Per indicare esclusivamente un livello di priorità, occorre fare precedere la parola chiave corrispondente dal simbolo =. Si possono indicare assieme più gruppi di servizi e priorità, in un solo campo, unendoli attraverso un punto e virgola (;). Si possono escludere delle priorità ponendo anteriormente un punto esclamativo (!).
Il secondo campo, quello che definisce l'azione, serve a indicare la destinazione dei messaggi riferiti a un certo gruppo di servizi e priorità, come definito dal primo campo. Può trattarsi di un file o di altro, a seconda del primo carattere utilizzato per identificarlo. Segue l'elenco.
/
Se il primo carattere è una barra obliqua normale, si intende che si tratti dell'indicazione di un percorso assoluto di un file destinatario dei messaggi. Può trattarsi anche di un file di dispositivo opportuno, come quello di una console virtuale.
|
Se il primo carattere è una barra verticale, si intende che la parte restante sia l'indicazione del percorso assoluto di una pipe con nome, ovvero di un file FIFO, generata attraverso mkfifo (63.1.1).
@
Se il primo carattere è il simbolo @, si intente che la parte restante sia l'indicazione di un elaboratore remoto, che ricevendo tali messaggi li inserirà nel proprio sistema di registrazione.
Elenco di utenti
Se il primo carattere non è scelto tra quelli elencati fino a questo punto, si intende che si tratti di un elenco di utenti (separati da virgole) a cui inviare i messaggi sullo schermo del terminale, se questi stanno accedendo in quel momento.
*
Se il primo e unico carattere è un asterisco (*), si intente che i messaggi debbano essere inviati sullo schermo del terminale di tutti gli utenti connessi in quel momento.
È importante osservare che gli stessi messaggi possono essere inviati anche a destinazioni differenti, attraverso più record in cui si definiscono le stesse coppie di servizi e priorità, oppure coppie differenti che però si sovrappongono.
Vedere anche la pagina di manuale syslog.conf(5).
# Salva tutti i messaggi in un file unico: /var/log/syslog *.* /var/log/syslog
Invia tutti i messaggi nel file /var/log/syslog
.
# Invia tutti i messaggi del kernel sulla console kern.* /dev/console
I messaggi del servizio kern, a qualunque livello di priorità appartengano, vengono inviati al dispositivo corrispondente alla console. In pratica vengono scritti sullo schermo della console.
mail.* /var/log/maillog
I messaggi riferiti alla gestione della posta elettronica sono memorizzati nel file /var/log/maillog
.
# Invia tutti i messaggi da warning in su, all'elaboratore dinkel.brot.dg *.warning @dinkel.brot.dg
I messaggi la cui priorità raggiunge o supera il livello warning, vengono inviati all'elaboratore dinkel.brot.dg.
*.* @dinkel.brot.dg *.=debug /var/log/debug *.=info;*.=notice /var/log/messages *.warning /var/log/syslog
Invia tutti i messaggi all'elaboratore dinkel.brot.dg, e inoltre, invia i messaggi debug nel file /var/log/debug
, i messaggi info e notice nel file /var/log/messages
, e infine tutti i messaggi da warning in su nel file /var/log/syslog
.
*.=info;*.=notice /var/log/messages *.warning /var/log/syslog *.=debug;*.=info /dev/tty9 *.=notice;*.=warning /dev/tty10 *.=err;*.=crit /dev/tty11 *.=alert;*.=emerg /dev/tty12
Invia i messaggi info e notice nel file /var/log/messages
, i messaggi da warning in su nel file /var/log/syslog
, quindi suddivide nuovamente i livelli di priorità e li invia a quattro diverse console virtuali, da /dev/tty9
a /dev/tty12
.
Per archiviare i file generati da kerneld, se la propria distribuzione GNU/Linux non gestisce già questo problema, si possono copiare i file delle registrazioni altrove, eventualmente anche comprimendoli, quindi si può azzerare il loro contenuto semplicemente copiandovi sopra il file /dev/null
.
Supponendo di dovere gestire i file /var/log/messages
e /var/log/syslog
, si potrebbe procedere come segue:
#
cat /var/log/messages | gzip -9 > /var/log/messages.1.gz
#
cat /var/log/syslog | gzip -9 > /var/log/syslog.1.gz
#
cp /dev/null /var/log/messages
#
cp /dev/null /var/log/syslog
#
killall -HUP syslogd
Le informazioni che vengono memorizzate nel registro del sistema potrebbero essere delicate, sia per la sicurezza del sistema, sia per i singoli utenti. Per questo, è bene ricordare che i file che compongono il registro del sistema non dovrebbero essere accessibili in lettura agli utenti comuni.
logger [opzioni] [messaggio]
Permette di aggiungere delle annotazioni all'interno del registro del sistema. Se non vengono forniti argomenti, il messaggio da registrare viene atteso dallo standard input. Se si utilizza la tastiera, per concludere è necessario utilizzare il codice di EOF che di norma si ottiene con la combinazione [Ctrl+d].
klogd [opzioni]
È il demone specifico per l'intercettazione e la registrazione dei messaggi del kernel Linux. Di norma viene avviato dalla procedura di inizializzazione del sistema, subito dopo syslogd.
-f file_delle_registrazioni
Specifica un file particolare per le registrazioni, invece di dirigere i messaggi direttamente al demone della gestione del registro del sistema, cioè syslogd.
Il login è la procedura di accesso attraverso la quale un utente, registrato precedentemente, viene riconosciuto e gli viene concesso di utilizzare il sistema. Il concetto è simile a quello di una firma di ingresso. Quando un utente conclude la sua attività con il sistema, esegue un logout. Il concetto del logout è simile a quello di una firma di uscita.
La procedura di accesso è controllata normalmente dal programma login, che si prende cura di verificare la password fornita, prima di consentire l'ingresso dell'utente. Tuttavia, i programmi login non sono uguali in tutte le distribuzioni GNU/Linux, e ognuno può essere stato predisposto per una politica differente. A titolo di esempio, un programma login potrebbe accettare l'accesso da parte di utenti per i quali non sia stata definita una password, mentre un altro potrebbe escluderlo. In queste sezioni si affronta il problema in modo superficiale, cercando di fare riferimento alle consuetudini consolidate; il lettore deve tenere presente che l'unica documentazione certa sul funzionamento di login è quella fornita assieme alla sua distribuzione GNU/Linux: la pagina di manuale login(1).
login [utente]
Permette l'accesso dell'utente al sistema. Di solito non si usa direttamente, anzi, ciò dovrebbe essere impossibile: è compito del programma di gestione del terminale, Getty o simili, di avviarlo dopo aver ottenuto il nominativo-utente.
Ogni utente registrato nel sistema, cioè ogni utente che (teoricamente) può accedere al sistema, ha una directory personale, o directory home, all'interno della quale si trova posizionato al momento dell'accesso. Questa directory contiene dei file riguardanti la configurazione particolare dell'utente a cui appartiene. La directory personale è collocata normalmente in /home/nome_utente/
e questa, se la shell lo consente, viene abbreviata utilizzando il simbolo tilde (~). La directory personale dell'utente root è speciale e dovrebbe trovarsi in /root/
. Durante un accesso normale da parte di un utente qualunque, compreso root, vengono richiesti il nome dell'utente (se non era già stato fornito nella riga di comando) e la password. Quindi vengono visualizzati:
la data e l'ora dell'ultimo accesso;
l'avviso della presenza di posta (se esistono messaggi di posta elettronica non ancora letti);
il messaggio del giorno.
Se si tratta di un utente al quale è associata una password, questa viene richiesta e controllata. Se risulta errata, vengono consentiti un numero limitato di tentativi. Generalmente, gli errori vengono riportati all'interno del registro del sistema. Se l'utente che chiede di accedere non è root, e se esiste il file /etc/nologin
, ne viene visualizzato il contenuto sullo schermo e non viene consentito l'accesso. Ciò serve per impedire l'accesso al sistema, tipicamente quando si intende chiuderlo. Perché l'accesso possa essere effettuato come utente root, occorre che il terminale (TTY) da cui si intende accedere sia elencato all'interno di /etc/securetty
. I tentativi di questo tipo che provengono da terminali non ammessi, vengono annotati all'interno del registro del sistema. Se esiste il file ~/.hushlogin
, viene eseguito un accesso silenzioso, nel senso che vengono disattivati:
il controllo per la presenza di messaggi di posta elettronica;
la visualizzazione della data e dell'ora dell'ultimo accesso effettuato da parte di quell'utente;
la visualizzazione del messaggio del giorno.
Se esiste il file /var/log/lastlog
, viene visualizzata la data e l'ora dell'ultimo accesso e ne viene registrato quello in corso. Al termine della procedura di accesso viene avviata la shell dell'utente. Se all'interno del file /etc/passwd
non è indicata la shell da associare all'utente che accede, viene utilizzato /bin/sh
. Se all'interno del file /etc/passwd
non è indicata la directory personale dell'utente, viene utilizzata la directory radice (/).
È un elenco di utenti, password, directory home (directory personali nel caso si utenti umani), shell e altre informazioni personali utilizzate da finger (100.3.2). La struttura dei record (righe) di questo file è molto semplice:
utente:password:UID:GID:dati_personali:directory_home:shell
Segue la descrizione dei campi.
utente
È il nome utilizzato per identificare l'utente logico che accede al sistema.
password
È la password cifrata. Se questa indicazione manca, l'utente può accedere senza indicare alcuna password. Se questo campo contiene un asterisco (*) l'utente non può accedere al sistema.
UID
È il numero identificativo dell'utente (User ID).
GID
È il numero identificativo del gruppo a cui appartiene l'utente (Group ID).
dati_personali
Di solito, questo campo contiene solo l'indicazione del nominativo completo dell'utente (nome e cognome), ma può contenere anche altre informazioni che di solito sono inserite attraverso chfn (40.2.6).
directory_home
La directory assegnata all'utente.
shell
tizio:724AD9dGbG25k:502:502:Tizio Tizi,,,,:/home/tizio:/bin/bash
L'utente tizio corrisponde al numero UID 502 e al numero GID 502; si chiama Tizio Tizi; la sua directory personale è /home/tizio/
; la sua shell è /bin/bash
. Di questo utente, personalmente, non si conosce niente altro che il nome e il cognome. Il fatto che UID e GID corrispondano dipende da una scelta organizzativa dell'amministratore del sistema.
tizio:*:502:502:Tizio Tizi,,,,:/home/tizio:/bin/bash
Questo esempio mostra una situazione simile a quella precedente, ma l'utente tizio non può accedere, perché al posto della password cifrata appare un asterisco.
Per impedire l'accesso a un utente attraverso la procedura di accesso, è sufficiente modificare parzialmente il campo della password, per esempio con l'aggiunta di un asterisco.
È l'elenco dei gruppi di utenti. La struttura delle righe di questo file è molto semplice.
gruppo:password:GID:lista_di_utenti
Segue la descrizione dei campi.
gruppo
È il nome utilizzato per identificare il gruppo.
password
È la password cifrata. Di solito non viene utilizzata e di conseguenza non viene inserita. Se è presente una password, questa dovrebbe essere richiesta quando un utente tenta di cambiare gruppo attraverso newgrp (39.3.2).
GID
È il numero identificativo del gruppo.
lista_di_utenti
È la lista degli utenti che appartengono al gruppo. Si tratta di un elenco di nomi di utente separati da virgole.
tizio::502:tizio
Si tratta di un caso molto semplice in cui il gruppo tizio non ha alcuna password e a esso appartiene solo un utente omonimo (tizio appunto).
users::100:tizio,caio,semproni
In questo caso, gli utenti tizio, caio e semproni appartengono al gruppo users.
Il file /etc/shadow
appare in quei sistemi in cui è attivata la gestione delle password shadow. Serve a contenere le password cifrate, togliendole dal file /etc/passwd
. Facendo in questo modo, è possibile inibire la maggior parte dei permessi di accesso a questo file, proteggendo le password. Al contrario, non è possibile impedire l'accesso in lettura del file /etc/passwd
che fornisce una quantità di informazioni sugli utenti, indispensabili a molti programmi.
Il problema è descritto nel capitolo 41.
È il file che contiene l'elenco degli accessi in essere nel sistema. Non è un file di testo normale, e per l'estrazione delle informazioni in esso contenute si usano dei programmi di servizio appositi. Tuttavia, è possibile che gli utenti presenti effettivamente nel sistema siano in numero maggiore, e ciò a causa del fatto che non tutti i programmi usano il metodo di registrazione fornito attraverso questo file.
Se questo file non esiste, conviene crearlo manualmente in uno dei due modi seguenti.
#
cp /dev/null /var/run/utmp
#
touch /var/run/utmp
Solitamente, è la procedura di inizializzazione del sistema a prendersi cura di questo file, azzerandolo o ricreandolo, a seconda della necessità.
Il file /var/log/wtmp
ha una struttura analoga a quella di /var/run/utmp
e serve per conservare la registrazione degli accessi e della loro conclusione (login-logout). Questo file non viene creato automaticamente; se manca, la conservazione delle registrazioni all'interno del sistema non viene effettuata. Viene aggiornato da Init e anche dal programma che si occupa di gestire la procedura di accesso al sistema (login).
Il formato di questo file non è quello di un file di testo normale, quindi non è leggibile o stampabile direttamente.
Se questo file non esiste, conviene crearlo manualmente in uno dei due modi seguenti.
#
cp /dev/null /var/log/wtmp
#
touch /var/log/wtmp
Il contenuto di questo file viene visualizzato da login al termine della procedura di accesso, prima dell'avvio della shell associata all'utente. Questo file contiene, o dovrebbe contenere, il cosiddetto messaggio del giorno.
Se esiste questo file, login non accetta nuovi accessi al sistema, e a ogni tentativo visualizza il suo contenuto.
Se si desidera fermare il sistema è possibile creare questo file scrivendoci all'interno il motivo, o una breve spiegazione di quello che sta avvenendo.
Contiene l'elenco dei terminali sicuri, cioè di quelli da cui si permette l'accesso all'utente root. I nomi dei terminali vengono indicati facendo riferimento ai file di dispositivo relativi, senza l'indicazione del prefisso /dev/
. L'esempio seguente mostra un elenco di terminali che comprende la console vera e propria, le sei console virtuali standard, quattro terminali seriali e quattro pseudo-terminali che accedono dalla rete locale oppure dal sistema grafico X.
console tty1 tty2 tty3 tty4 tty5 tty6 ttyS0 ttyS1 ttyS2 ttyS3 ttyp0 ttyp1 ttyp2 ttyp3
Il file corrispondente al nome dell'utente, contenuto in /var/mail/
(oppure in /var/spool/mail/
, a seconda dell'impostazione della distribuzione GNU/Linux), viene usato normalmente per accumulare i messaggi di posta elettronica a lui diretti.
Il programma login, dopo la visualizzazione del messaggio contenuto in /etc/motd
, se trova che c'è posta per l'utente, visualizza un messaggio di avvertimento in tal senso.
Se esiste il file .hushlogin
all'interno della directory personale di un certo utente, quando quell'utente accede, login non visualizza alcun messaggio introduttivo.
Il file /var/log/lastlog
, se esiste, viene utilizzato da login per registrare gli ultimi accessi al sistema e per poter visualizzare la data e l'ora dell'ultimo accesso. Se questo file non esiste, conviene crearlo manualmente in uno dei due modi seguenti.
#
cp /dev/null /var/log/lastlog
#
touch /var/log/lastlog
Alcuni programmi consentono di ottenere i privilegi di un altro utente, come se si ripetesse la procedura di accesso. Questa possibilità rappresenta generalmente un problema di sicurezza. Per mezzo di questi programmi può capitare di riuscire a ottenere i privilegi dell'utente root anche quando si accede da un terminale che non viene considerato sicuro, e pertanto non risulta incluso nell'elenco di /etc/securetty
.
su [opzioni] [utente]
su permette a un utente di diventare temporaneamente un altro, avviando una shell con i privilegi dell'utente indicato (questo vale anche per il gruppo o i gruppi a cui questo appartiene). Se non viene indicato un utente, su sottintende root. Prima di attivare la nuova shell, viene richiesta la password associata all'utente selezionato, a meno che su sia stato eseguito da chi sta già accedendo come utente root.
Per terminare l'attività in veste di questo nuovo utente, basta concludere l'esecuzione della shell con il comando exit.
$
su
Utilizzando su senza argomenti, si intende implicitamente di voler acquisire i privilegi dell'utente root. Per questo viene richiesta la password.
$
su caio
Volendo trasformarsi temporaneamente in un altro utente, basta indicarlo come argomento, come in questo caso. Viene richiesta la password.
#
su tizio
L'utente root può sempre fare quello che vuole, quindi se seleziona un altro utente, perde dei privilegi, e non gli viene richiesta alcuna password.
Il programma su, per poter svolgere il suo compito, deve appartenere all'utente root e avere il bit SUID attivato (SUID-root). È in questo modo che un utente comune riesce a ottenere i privilegi di root o di un altro utente.
su viene usato frequentemente dall'utente root, o da un processo che ha già i privilegi dell'utente root, per diventare temporaneamente un utente comune. In tal caso, dal momento che il processo che avvia su ha già i privilegi di root, non c'è alcuna necessità della presenza del bit SUID attivo.
In generale, dal momento che su è molto importante per agevolare il lavoro dell'amministratore del sistema, se si temono problemi alla sicurezza, si può eliminare il bit SUID, per concedere praticamente il suo utilizzo solo all'utente root.
#
chmod u-s /bin/su
Volendo calcare la mano, si possono togliere anche tutti i permessi per il gruppo proprietario e per gli altri utenti.
#
chmod go-rwx /bin/su
newgrp [gruppo]
Permette di cambiare il gruppo a cui appartiene l'utente. L'utente non cambia, la directory personale nemmeno, cambia solo il GID. Un utente può cambiare gruppo se nel file /etc/group
sono diversi i gruppi a cui può appartenere l'utente. In alternativa, se il gruppo ha una password, l'utente può «entrare» nel gruppo solo se la conosce.
Il problema della gestione dei gruppi, specialmente per ciò che riguarda le password, è descritto meglio nel capitolo 41.
Molti programmi permettono di avere informazioni sugli accessi e di conseguenza anche sugli utenti. In particolare sono importanti quelli che permettono di leggere il contenuto dei file /var/run/utmp
e /var/log/wtmp
il cui formato non è leggibile attraverso l'uso di un semplice cat.
In particolare, per quanto riguarda i programmi che analizzano il contenuto del file /var/log/wtmp
, si può leggere il capitolo 42.
users [file]
Visualizza i nomi degli utenti che accedono attualmente all'elaboratore. Se un utente ha attivato più sessioni in corso, il suo nome apparirà più volte nell'elenco. Se il comando viene avviato senza l'indicazione di un file, i dati visualizzati vengono estratti da /etc/utmp
. Esiste comunque la possibilità di visualizzare attraverso users il contenuto di /etc/wtmp
.
w [opzioni] [utente]
Visualizza i nomi degli utenti che accedono attualmente e varie informazioni sulla loro attività.
Vedere w(1).
who [opzioni] [file] [am i]
Visualizza i nomi degli utenti che accedono attualmente e varie informazioni sulla loro attività. who trae normalmente le sue informazioni dal file /etc/utmp
, se non ne viene indicato un altro negli argomenti. (per esempio /etc/wtmp
).
Vedere who.info oppure who(1).
whoami
Visualizza il nome dell'utente associato con l'attuale UID efficace. È equivalente a id -un.
logname
Emette il nome dell'utente, così come appare dal file /var/run/utmp
.
A titolo di esempio si può immaginare la situazione in cui l'utente tizio sia riuscito a ottenere i privilegi dell'utente root attraverso l'uso di su.
tizio$
su root
Password:
*******
Quello che si dovrebbe ottenere con logname è il nome dell'utente che è stato usato per accedere inizialmente al sistema.
root#
logname
tizioAppunti di informatica libera 2000.07.31 --- Copyright © 2000 Daniele Giacomini -- daniele @ swlibero.org