[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
In ogni sistema operativo multiutente c'è la necessità di controllare gli accessi. 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 95.1 elenca i programmi e i file a cui si accenna in questo capitolo.
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 parola d'ordine 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 parola d'ordine, mentre un altro potrebbe escluderlo. In queste sezioni si affronta il problema in modo superficiale, cercando di fare riferimento alle consuetudini che sembrano 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).
Il programma login 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.
login [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 è già stato fornito nella riga di comando) e la parola d'ordine. 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 parola d'ordine, 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 (/).
Quanto affermato dovrebbe essere sufficiente per capire che la semplice rimozione dell'indicazione della shell o della directory personale da un record del file |
Il file /etc/passwd
è un elenco di utenti, parole d'ordine, directory home (directory personali nel caso di utenti umani), shell e altre informazioni personali utilizzate da Finger (207.3). La struttura dei record (righe) di questo file è molto semplice:
utente:parola_d'ordine_cifrata: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.
parola_d'ordine_cifrata
È la parola d'ordine cifrata. In condizioni normali, se questa indicazione manca, l'utente può accedere senza indicare alcuna parola d'ordine.
Se questo campo contiene un asterisco (*) l'utente non può accedere al sistema. Con questa tecnica è possibile impedire temporaneamente l'accesso, con la possibilità di ripristinarlo successivamente con la stessa parola d'ordine, togliendo semplicemente l'asterisco. |
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 (96.2.6).
directory_home
La directory assegnata all'utente.
shell
Segue la descrizione di alcuni esempi.
|
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.
|
Questo esempio mostra una situazione simile a quella precedente, ma l'utente tizio non può accedere, perché al posto della parola d'ordine cifrata appare un asterisco.
È l'elenco dei gruppi di utenti. La struttura delle righe di questo file è molto semplice.
gruppo:parola_d'ordine_cifrata:gid:lista_di_utenti |
Segue la descrizione dei campi.
gruppo
È il nome utilizzato per identificare il gruppo.
parola_d'ordine_cifrata
È la parola d'ordine cifrata. Di solito non viene utilizzata e di conseguenza non viene inserita. Se è presente una parola d'ordine, questa dovrebbe essere richiesta quando un utente tenta di cambiare gruppo attraverso newgrp (95.2.2).
gid
È il numero identificativo del gruppo.
lista_di_utenti
È la lista degli utenti che appartengono al gruppo, anche se questo non risulta dal file /etc/passwd
. Si tratta di un elenco di nomi di utente separati da virgole.
Segue la descrizione di alcuni esempi.
|
Si tratta di un caso molto semplice in cui il gruppo tizio non ha alcuna parola d'ordine e a esso non appartiene alcun utente aggiuntivo, oltre a quanto già specificato nel file /etc/passwd
.
|
In questo caso, gli utenti tizio, caio e sempronio appartengono al gruppo users.
Il file /etc/shadow
appare in quei sistemi in cui è attivata la gestione delle parole d'ordine oscurate (shadow password). Serve a contenere le parole d'ordine cifrate, togliendole dal file /etc/passwd
. Facendo in questo modo, è possibile inibire la maggior parte dei permessi di accesso a questo file, proteggendo le parole d'ordine. 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 97.
Il file /var/run/utmp
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, a causa del fatto che non tutti i programmi usano il metodo di registrazione fornito attraverso questo file.
Se il file non esiste, conviene crearlo manualmente in uno dei due modi seguenti:
#
cp /dev/null /var/run/utmp
[Invio]
#
touch /var/run/utmp
[Invio]
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
[Invio]
#
touch /var/log/wtmp
[Invio]
Il contenuto del file /etc/motd
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 (Message of the day).
Se esiste il file /etc/nologin
, login non accetta nuovi accessi al sistema, visualizzando il suo contenuto a ogni tentativo.
Se si desidera fermare il sistema è possibile creare questo file scrivendoci all'interno il motivo, o una breve spiegazione di ciò che sta avvenendo.
Il file /etc/securetty
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.
|
A seconda di come è organizzato il sistema di file di dispositivo, può essere necessario modificare di conseguenza questo file.
Il file corrispondente al nome dell'utente, contenuto in /var/mail/
(oppure in /var/spool/mail/
, a seconda dell'impostazione della distribuzione GNU), 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.
La collocazione di questi file che rappresentano le caselle postali degli utenti, dipende dalla configurazione e dalla filosofia del sistema di gestione della posta elettronica. Generalmente si fa affidamento sul fatto che si utilizzi il solito Sendmail, il quale si avvale della directory |
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
[Invio]
#
touch /var/log/lastlog
[Invio]
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, pertanto non risulta incluso nell'elenco di /etc/securetty
.
Il programma su (1) 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 parola d'ordine associata all'utente selezionato, a meno che su sia stato eseguito da chi sta già accedendo come utente root.
su [opzioni] [utente] |
L'opzione più importante di su è data dal trattino singolo (-), con il quale si fa in modo che la nuova shell venga avviata come shell di login. In questo modo, si ha di fronte l'ambiente normale dell'utente che si va a impersonare, come se si facesse un accesso standard.
Per terminare l'attività in veste di questo nuovo utente, basta concludere l'esecuzione della shell con il comando exit. Segue la descrizione di alcuni esempi.
$
su
[Invio]
Utilizzando su senza argomenti, si intende implicitamente di voler acquisire i privilegi dell'utente root. Per questo viene richiesta la parola d'ordine.
$
su caio
[Invio]
Volendo trasformarsi temporaneamente in un altro utente, basta indicarlo come argomento, come in questo caso. Viene richiesta la parola d'ordine.
#
su tizio
[Invio]
L'utente root può sempre fare quello che vuole; pertanto, se seleziona un altro utente perde dei privilegi, così non gli viene richiesta alcuna parola d'ordine.
$
su - caio
[Invio]
Si acquista la personalità dell'utente caio, con tutto l'ambiente normale, senza semplificazioni.
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.
Il programma 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
[Invio]
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
[Invio]
Se si toglie la funzione SUID-root all'eseguibile su, si impedisce agli utenti comuni di elevarsi al livello di utente root. Questo fatto implica che, a meno di disporre di altri programmi che compiano funzioni simili, l'utente root può accedere solo nel modo «normale», pertanto si va così a confermare il rispetto del file |
Il programma newgrp (2) 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 parola d'ordine, l'utente può «entrare» nel gruppo solo se la conosce.
newgrp [gruppo] |
Il problema della gestione dei gruppi, specialmente per ciò che riguarda le parole d'ordine, è descritto meglio nel capitolo 97.
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 99.
Il programma users (3) visualizza i nomi degli utenti che accedono attualmente all'elaboratore. Se un utente ha attivato più sessioni in corso, il suo nome appare 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
.
users [file] |
Il programma w (4) visualizza i nomi degli utenti che accedono attualmente e varie informazioni sulla loro attività; in particolare l'uso della CPU:
w [opzioni] [utente] |
Attraverso le opzioni è possibile controllare in qualche modo le informazioni che vengono visualizzate, mentre se si indica il nome di un utente alla fine della riga di comando, si ottengono informazioni solo su quello. L'esempio seguente mostra cosa si può ottenere con w usato senza argomenti:
$
w
[Invio]
16:50:46 up 15 min, 5 users, load average: 0,12, 0,14, 0,20 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT tizio tty1 - 16:37 10:53 6.88s 6.75s /usr/bin/mc \ |
Come si può osservare, la prima riga che si ottiene è equivalente a quanto genera il programma uptime, descritto nel capitolo 67.
Le colonne identificate dalle sigle JCPU e PCPU indicano il tempo di utilizzo della CPU; nel primo caso si tratta di tutti i processi, ancora attivi, anche se sullo sfondo, mentre nel secondo si tratta esclusivamente del tempo utilizzato dal processo indicato nella colonna finale (WHAT). La colonna IDLE indica il tempo di funzionamento complessivo, anche se inattivo, del processo indicato nella colonna WHAT.(5)
Per l'uso delle opzioni che qui non vengono descritte, si veda la pagina di manuale w(1).
Il programma who (6) 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
).
who [opzioni] [file] [am i] |
Si veda il documento info who, oppure la pagina di manuale who(1).
Il programma pinky (7) visualizza l'elenco degli utenti che utilizzano l'elaboratore, oppure visualizza informazioni dettagliate su utenti particolari. Il suo funzionamento è simile a quello di Finger (207.3):
pinky [opzioni] [utente]... |
Attraverso le opzioni si può controllare la quantità di informazioni che si vogliono ottenere.
|
Segue la descrizione di alcuni esempi.
$
pinky
[Invio]
Login Name TTY Idle When Where tizio pts/125 Sep 21 10:23 host192-116:S.0 tizio pts/126 Sep 21 10:23 host192-116:S.1 |
Mostra l'elenco degli utenti che utilizzano il sistema.
$
pinky -l tizio
[Invio]
Login name: tizio In real life: Tizio Tizi Directory: /home/tizio Shell: /bin/sh |
Mostra le informazioni disponibili sull'utente tizio.
Si veda eventualmente la pagina di manuale pinky(1).
Il programma whoami (8) visualizza il nome dell'utente associato con l'attuale UID efficace. È equivalente a id -un.
whoami |
Il nominativo-utente associato al numero UID efficace è in pratica l'identità con cui si sta lavorando. Per esempio, dopo l'utilizzo di su per diventare utenti caio, il programma whoami restituisce esattamente il nome caio.
Il programma logname (9) emette il nome dell'utente, così come appare dal file /var/run/utmp
.
logname |
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
[Invio]
Password:
*******
[Invio]
Quello che si dovrebbe ottenere con logname è il nome dell'utente che è stato usato per accedere inizialmente al sistema.
root#
logname
[Invio]
tizio |
Il programma groups (10) visualizza i gruppi ai quali l'utente o gli utenti appartengono.
groups [utente...] |
Il risultato è equivalente al comando seguente:
id -Gn [nome_utente] |
Il programma id visualizza il numero UID (User ID) e il numero GID (Group ID) reale ed efficace dell'utente selezionato o di quello corrente. (11)
id [opzioni] [utente] |
|
Usato senza argomenti, id fornisce l'identità dell'utente, il gruppo standard e l'elenco dei gruppi a cui l'utente è aggregato, come si vede dall'esempio seguente:
$
id
[Invio]
uid=1001(tizio) gid=1001(tizio) gruppi=1001(tizio),6(disk),7(lp),\ |
Le opzioni servono in pratica a limitare le informazioni che si desiderano avere; eventualmente si può consultare il documento info id, oppure la pagina di manuale id(1) per maggiori dettagli su questo programma.
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
1) Shadow utilities software libero con licenza speciale
2) Shadow utilities software libero con licenza speciale
3) GNU core utilities GNU GPL
5) Si può verificare facilmente che la colonna IDLE del comando w riporta il tempo di funzionamento complessivo; per farlo basta avviare in un terminale un programma che utilizza intensamente la CPU, come yes quando è ridiretto verso /dev/null
, cronometrando il tempo e controllando ciò che riporta w.
6) GNU core utilities GNU GPL
7) GNU core utilities GNU GPL
8) GNU core utilities GNU GPL
9) GNU core utilities GNU GPL
10) GNU core utilities GNU GPL
11) GNU core utilities GNU GPL
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome controllo_degli_accessi.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]