Autenticazione dell'utente
La
necessità di fornire un metodo di identificazione all'interno
di un sistema computerizzato è nata con la diffusione dei
primi sistemi multiutenti (Unix, anni '60). In pratica, un utente che
vuole entrare nel sistema deve dimostrare di essere autorizzato
all'accesso prima di poter usufruire dei servizi disponibili. A
seconda della politica adottata, il meccanismo di autenticazione può
essere impiegato per vari scopi: si parte dalla semplice
personalizzazione del sistema per ogni utente, fino alla protezione
totale dei dati dell'utente sia da persone esterne che dagli stessi
altri fruitori del sistema. Un esempio di sistema del primo caso ci è
dato da Windows 9x, dove i file degli altri utenti sono semplicemente
impostati con attributo nascosto all'avvio; alla seconda
categoria appartiene giustamente il sistema operativo Linux che,
grazie alla sua modularità unita alla filosofia open source,
consente di implementare agevolmente anche tecniche relativamente
recenti come l'impiego delle smart card.
L'obiettivo
di questa sezione è di illustrare le basi dell'autenticazione
all'interno del sistema operativo Linux, in modo che le successive
sezioni, dedicate esclusivamente all'autenticazione via smart card,
risultino più chiare anche a coloro che non conoscono
approfonditamente il sistema del pinguino.
Autenticazione sotto Unix/Linux
Lo
schema generale per l'autenticazione in Unix è il seguente:
l'utente (o l'amministratore di sistema) decidono, in fase di
creazione dell'account, un identificativo (login) ed una
parola chiave (password). Per ogni richiesta successiva di
accesso, l'utente deve fornire la coppia login-password
corretta; il sistema verifica che a quel determinato identificativo
corrisponde quella parola chiave: in caso affermativo l'utente ha
accesso, altrimenti viene rifiutato.
Le
varianti a questo schema riguardano soprattutto il modo in cui il
sistema mantiene in memoria il database delle password. I due
meccanismi più comuni sotto Unix sono:
Memorizzazione cifrata in un file di pubblico accesso (/etc/passwd): ad ogni utente corrisponde una riga del file, dove viene conservata una copia della password in forma cifrata. Quando il sistema riceve una richiesta d'accesso, la password in entrata viene cifrata e confrontata con quella contenuta nel file corrispondente alla login dell'utente richiedente. Il confronto è positivo se i due valori sono identici. Il metodo di cifratura varia a seconda della versione o distribuzione del sistema operativo, ma in generale la scelta ricade tra la cifratura simmetrica del Data Encription Standard (DES) e la funzione hash Message Digest 5 (MD5). Il file passwd non contiene solo le coppie login-password cifrata, ma anche informazioni ulteriori sull'utente (UID, GID, nome anagrafico) e sulla configurazione del sistema all'avvio (cartella home, shell iniziale).
Memorizzazione cifrata in un file nascosto (/etc/shadow): questo sistema impiega una coppia di file: passwd non conterrà più le password cifrate, ma queste verranno scritte all'interno del file shadow. Il file passwd mantiene al suo interno i dati satellite relativi all'utente, ma nel suo campo password saranno presenti altri dati; due sono le possibili scelte: o indirizzi da usare all'interno di shadow (evitando quindi di riportare i login corrispondenti) oppure dei valori casuali, rendendo inutili eventuali attacchi al file passwd. Poiché questa soluzione incrementa la sicurezza, l'uso del file shadow risulta sempre più frequente rispetto alla soluzione base.
Poiché
il file passwd contiene informazioni sull'utente, il suo
accesso in lettura deve essere disponibile per qualunque processo;
questo è un ulteriore motivo per cui si predilige memorizzare
le password nel file shadow, protetto anche in lettura oltre
che in scrittura.
La
verifica da parte del sistema avviene dando la password ricevuta in
input all'algoritmo di cifratura utilizzato: mentre MD5 calcola il
valore hash per effettuare il confronto, l'uso del DES è
decisamente più complesso. In primo luogo,
la password viene sottoposta ad un processo di padding-troncatura, al
fine di avere una stringa di esattamente otto byte; in seguito, la
password funge da chiave di cifratura di un DES modificato, con input
la stringa nulla (64 bit posti a zero) ed iterato 25 volte, ogni
volta prendendo in input l'output dell'iterazione precedente. La
modifica del DES, effettuata tramite l'immissione del valore salt,
garantisce l'unicità della password cifrata anche se la
password in chiaro è la stessa.
La
gestione dell'algoritmo di cifratura delle parole d'ordine è a
carico della funzione crypt().
Nelle distribuzioni GNU/Linux in cui si può usare l'algoritmo
MD5 dovrebbe essere possibile scegliere questo o l'algoritmo
precedente, attraverso un file di configurazione (/etc/login.defs
).
Se la propria distribuzione non sembra predisposta per la cifratura
MD5, è meglio non fare esperimenti: è importante che
ogni componente del sistema di autenticazione e di gestione delle
parole d'ordine sia aggiornato correttamente.
Questo
sistema di autenticazione basato sulla conservazione di una parola
d'ordine cifrata, ha una debolezza fondamentale: conoscendo la
stringa cifrata e l'algoritmo che la genera, si può
determinare la parola d'ordine originale per tentativi; un sistema
che consente l'utilizzo di parole d'ordine con un massimo di otto
caratteri è molto debole ai giorni nostri, perché tutte
le combinazioni possibili possono essere provate in tempi brevi,
anche con un elaboratore di potenza media. In particolare, questo
metodo è molto vulnerabile agli attacchi a dizionario, visto
che spesso gli utenti scelgono parole di uso comune o personali
difficili da dimenticare ma anche facili
da catalogare.
Comandi e file supplementari
I nuovi utenti possono essere aggiunti solo da parte dell'utente root, ma poi possono essere loro stessi a cambiare alcuni elementi della loro registrazione. Il più importante è naturalmente la parola d'ordine.
Il
programma in questione può avere due nomi alternativi: adduser
o useradd.
Questo permette all'utente root
di aggiungere un nuovo utente all'interno del file /etc/passwd
,
assegnandogli un UID, un GID, una parola d'ordine, una shell, creando
anche la sua directory personale. Per
convenzione, il programma (o script che sia) inserisce
automaticamente nella directory personale alcuni file di
configurazione standard contenuti nella directory /etc/skel/
.
Di conseguenza, basta porre all'interno di questa directory i file e
le directory che si vogliono riprodurre nella directory personale di
ogni nuovo utente. Per mantenere la compatibilità con alcuni
vecchi programmi, il nome dell'utente non deve superare gli otto
caratteri. Inoltre, è opportuno limitarsi all'uso di lettere
non accentate e di numeri; qualunque altro simbolo, compresi i segni
di punteggiatura, potrebbero creare problemi di vario tipo.
La
directory /etc/skel/
viene utilizzata normalmente come directory personale tipica per i
nuovi utenti. In pratica, quando si aggiunge un nuovo utente e gli si
prepara la sua directory personale, viene copiato all'interno di
questa il contenuto di /etc/skel/
.
Il nome skel
sta per skeleton,
cioè scheletro; in effetti, rappresenta lo scheletro di una
nuova directory personale. È molto
importante la preparazione di questa directory, in modo che ogni
nuovo utente trovi subito una serie di file di configurazione,
necessari a utilizzare le shell previste nel sistema ed eventualmente
altri programmi essenziali.
Permette
di cambiare la parola d'ordine registrata all'interno di
(oppure all'interno di /etc/passwd
).
Solo l'utente root
può cambiare la parola d'ordine di un altro utente. Gli utenti
comuni (tutti escluso root)
devono utilizzare una parola d'ordine non troppo breve composta sia
da maiuscole che minuscole o simboli diversi. Alcune parole d'ordine
simili al nome utilizzato per identificare l'utente, non sono valide.
Se non si dispone di un mezzo per l'inserimento
di un nuovo utente, come quello fornito da adduser,
è possibile aggiungere manualmente un record all'interno del
file /etc/shadow
senza l'indicazione della parola d'ordine che poi potrà essere
specificata attraverso passwd./etc/passwd
Il comando chsh
Permette
di cambiare la shell predefinita all'interno del file /etc/passwd
.
È possibile indicare solo una shell esistente e possibilmente
elencata all'interno di /etc/shells
.
Se la nuova shell non viene indicata tra gli argomenti, questa viene
richiesta subito dopo l'avvio di chsh.
Per conferma, viene richiesta anche la ripetizione della parola
d'ordine.
Il file /etc/shells
Il
file /etc/shells
contiene semplicemente un elenco di shell valide, cioè di
quelle che sono esistenti e possono essere utilizzate. Segue un
esempio di questo file.
/bin/sh /bin/bash /bin/tcsh /bin/csh /bin/ash /bin/zsh
È
molto importante che questo file sia preparato con cura e contenga
solo le shell per le quali il sistema è predisposto. Ciò
significa, quanto meno, che deve esistere una configurazione
generalizzata per ognuna di queste e che nella directory /etc/skel/
devono essere stati predisposti tutti i file di configurazione
personalizzabili che sono necessari. Quindi, un file /etc/shells
con un semplice elenco di tutte le shell disponibili non è
sufficiente.
Il comando chfn
Consente
di modificare le informazioni personali registrate all'interno del
file /etc/passwd
.
Si tratta in pratica del nome e cognome dell'utente, del numero
dell'ufficio, del telefono dell'ufficio e del telefono di casa. Se
non vengono specificate opzioni, i dati vengono inseriti in maniera
interattiva; se non viene specificato l'utente, si intende quello che
ha eseguito il comando. Solo l'utente root
può cambiare le informazioni di un altro utente.
Le
informazioni indicate nel quinto capo dei record del file
/etc/passwd
, sono strutturate solo in modo
convenzionale, senza che esista una necessità effettiva.
I comandi id e groups
Il
comando id visualizza il numero UID (User
ID) e il numero GID (Group
ID) reale ed efficace
dell'utente selezionato o di quello corrente, mentre groups
visualizza i gruppi ai quali l'utente o gli
utenti appartengono; il suo risultato è equivalente al comando
id
-Gn .
Utenti e gruppi importanti
Osservando
il file /etc/passwd
si possono notare diversi utenti fittizi standard che hanno degli
scopi particolari. Si tratta di utenti
di sistema,
nel senso che servono al corretto funzionamento del sistema
operativo.
root:dxdFf9MvQ3s:0:0:root:/root:/bin/bash bin:*:1:1:bin:/bin: daemon:*:2:2:daemon:/sbin: adm:*:3:4:adm:/var/adm: lp:*:4:7:lp:/var/spool/lpd: sync:*:5:0:sync:/sbin:/bin/sync shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown halt:*:7:0:halt:/sbin:/sbin/halt mail:*:8:12:mail:/var/mail: news:*:9:13:news:/var/spool/news: uucp:*:10:14:uucp:/var/spool/uucp: operator:*:11:0:operator:/root: games:*:12:100:games:/usr/games: gopher:*:13:30:gopher:/usr/lib/gopher-data: ftp:*:14:50:FTP User:/home/ftp: nobody:*:99:99:Nobody:/:
Di
conseguenza, anche /etc/group
contiene l'indicazione di gruppi particolari (gruppi di sistema).
root::0:root bin::1:root,bin,daemon daemon::2:root,bin,daemon sys::3:root,bin,adm adm::4:root,adm,daemon tty::5: disk::6:root lp::7:daemon,lp mem::8: kmem::9: wheel::10:root mail::12:mail news::13:news uucp::14:uucp man::15: games::20: gopher::30: dip::40: ftp::50: nobody::99: users::100:
I
campi delle parole d'ordine di questi utenti speciali (tutti tranne
root)
hanno un asterisco che di fatto impedisce qualunque accesso. Le
varie distribuzioni GNU/Linux si distinguono spesso nella quantità
e nell'organizzazione degli utenti e dei gruppi fittizi.
In
questo caso, in particolare, l'utente fittizio nobody
ha il numero UID 99, come definito nella distribuzione Red Hat. In
generale, questo utente potrebbe avere il numero -1, che applicandosi
a un intero positivo rappresenta in pratica il numero più alto
gestibile di UID, altre volte potrebbe essere il numero -2. Il numero
massimo di UID dipende dalle caratteristiche del filesystem e dalle
librerie utilizzate.
Segue
la descrizione di alcuni di questi utenti e gruppi.
root
L'utente root è l'amministratore del sistema: ogni sistema Unix ha un utente root. L'utente root ha sempre il numero UID pari a zero.
bin
L'utente bin non esiste nella realtà. Si tratta di un nome fittizio definito per assegnare ai file eseguibili (binary) un proprietario diverso dall'utente root. Di solito, con GNU/Linux, questi eseguibili appartengono al gruppo bin, mentre l'utente proprietario resta root.
tty
Di solito, al gruppo tty appartengono i file di dispositivo utilizzabili come canali per la connessione di un terminale.
disk
Di solito, al gruppo disk appartengono i file di dispositivo che si riferiscono a unità a dischi, compresi i CD-ROM.
floppy
Di solito, al gruppo floppy appartengono i file di dispositivo che si riferiscono alle unità a dischetti.
nobody
L'utente
nobody
corrisponde in linea di massima a un utente generico, non
identificato, senza privilegi particolari. Viene usato in
particolare per evitare che un utente root
possa accedere a un filesystem di rete (NFS) mantenendo i suoi
privilegi: quando ciò accade, l'elaboratore che offre il
servizio NFS lo tratta come utente nobody.
In
generale, nobody
non deve essere utilizzabile per l'accesso umano. A seconda della
distribuzione GNU/Linux che si utilizza, il gruppo abbinato a questo
utente potrebbe chiamarsi nobody,
oppure anche nogroup.
L'eliminazione di un utente dal sistema non è gestibile attraverso un programma di servizio standard di uso generale: la particolare distribuzione GNU/Linux può fornire degli strumenti adatti, oppure si deve agire manualmente. In questa sezione si descrive come si può intervenire manualmente. Fondamentalmente si tratta di agire su due punti:
l'eliminazione
dell'utente dai file /etc/passwd
e /etc/group
(ed eventualmente anche da /etc/shadow
);
l'eliminazione dei file appartenenti a quell'utente.
I file di un utente possono trovarsi ovunque gli sia stato consentito di scriverli. In particolare:
la
directory delle caselle postali (/var/mail/
o in certi casi /var/spool/mail/
,
a meno che questa non sia già inserita direttamente nelle
directory personale);
la
directory /var/spool/cron/crontabs/
e /var/spool/cron/atjobs/
per eventuali applicazioni a esecuzione pianificata.
Per elencare tutti i file appartenenti a un certo utente, è possibile usare il programma find in uno dei modi seguenti:
find / -uid numero_utente -print
find / -user utente -print