Gestione degli utenti
Da Hacknowledge.
La caratteristica principale dei sistemi Unix è stata quella, fin dalla loro nascita, di essere sistemi multiutente, ovvero sistemi che garantiscono gli strumenti software necessari per gestire un sistema i cui elementi e relativi permessi sono condivisi da più utenti.
Indice |
[modifica] Login
La prima cosa che deve fare un sistema multiutente è garantire il login sul sistema (ovvero l'ingresso al sistema) ad ogni utente registrato con i suoi dati (username e password). Per fare ciò i sistemi Unix, una volta che il processo init ha terminato l'avvio dei servizi di sistema, avvia il processo getty, dedicato alla lettura dello username inserito dall'utente. Per la password viene poi avviato un altro processo, login. Questi processi vanno a prendere le informazioni sui dati degli utenti generalmente da due file speciali: /etc/passwd e /etc/shadow (su vecchi sistemi o sistemi Unix embedded può essere presente solo il primo). All'interno di questi file sono presenti i dati degli utenti registrati sul sistema. Il file passwd ha al suo interno un utente per ogni riga, con le informazioni salvate in questo modo:
username:password_criptata:userID:groupID:gruppi:home:shell
Generalmente però la password (criptata dalla funzione POSIX crypt() basata su una combinazione degli algoritmi DES e MD5) non è mai salvata in questo file, che essendo accessibile in lettura a tutti potrebbe essere vista ed eventualmente decriptata da tutti. La password viene invece salvata nel file shadow, che ha una struttura identica a quella di passwd se non per il fatto che è leggibile e scrivibile solo dall'amministratore del sistema e al suo interno ha anche l'hash della password. Ecco ad esempio una tipica riga salvata all'interno di passwd:
root:x:0:0::/root:/bin/bash
Si noti che al posto della password viene messa una x, che indica che l'hash della password non è lì ma in shadow. Ed ecco la riga corrispondente in shadow:
root:$1$1lB1PqfC$4GRSPEecc.ecc.ecc./:13831:0:::::
Ed ecco che lì c'è anche l'hash della password.
Quello che fa il processo login è prendere i dati inseriti dall'utente e confrontarli con quelli salvati in questo file. Innanzitutto controlla se lo username inserito esiste, e in secondo luogo cripta lei stessa attraverso la crypt la password inserita dall'utente, e confronta l'hash così ottenuto con quello salvato in modo da consentire il login sul sistema o meno.
È possibile, una volta ottenuto l'hash di una password di un utente sul sistema, risalire alla password originale attraverso un attacco di brute force o dizionario. Il tool principale per questi attacchi sugli hash degli utenti dei sistemi Unix è John the Ripper.
[modifica] Aggiunta di nuovi utenti
L'aggiunta di un nuovo utente al sistema può essere effettuata aggiungendo manualmente i dati dell'utente in /etc/passwd ed /etc/shadow. In alternativa, si può ricorrere all'utility adduser che consente l'inserimento di un utente in modo interattivo e scrive i dati automaticamente su questi due file. La rimozione di un utente si può invece effettuare con il comando userdel.
[modifica] User space e kernel space
Altra cosa fondamentale che viene compiuta non appena il processo di login ha autenticato un utente è l'allocazione per questo utente di uno spazio in memoria, detto user space, all'interno del quale verranno eseguiti i suoi processi e andranno a finire i suoi dati statici e dinamici. Questo perché i sistemi Unix hanno sempre cercato di non compromettere la stabilità dei loro sistemi in base a ciò che avviene nei processi avviati dall'utente, e quindi abbiamo moduli e processi attivi in kernel space (codice di sistema e processi vitali per il sistema stesso) e, al di sopra di questo, uno user space con i processi avviati dall'utente finale e lo spazio di memoria ad esso dedicati.
[modifica] Permessi
La gestione degli utenti sui sistemi Unix è sufficientemente avanzata da garantire una versatile gestione dei permessi su file e directory (si ricorda che Windows dal canto suo è arrivato ad una gestione davvero multiutente del sistema operativo con almeno 20 anni di ritardo rispetto ai sistemi Unix). Ogni file (e quindi anche directory, dispositivi, link, processi ecc., tutti riconducibili a file sui sistemi Unix) ha un suo proprietario, identificato dallo User ID, e dal gruppo di appartenenza, identificato dal suo Group ID. È possibile cambiare il proprietario di un file tramite il comando chown:
chown nuovo_utente file
e allo stesso tempo cambiare il gruppo di appartenenza tramite il comando chgrp:
chgrp nuovo_gruppo file
I permessi di un file vengono invece generalmente visti in funzione di 3 parametri:
- Permessi dell'utente proprietario
- Permessi del gruppo proprietario
- Permessi degli altri utenti
e i permessi possono essere fondamentalmente di 3 tipi:
- Lettura (r)
- Scrittura (w)
- Esecuzione (o, nel caso delle directory, navigabilità) (x)
Possiamo quindi fare uno schemino nel seguente modo:
U G O r w x r w x r w x
in modo da coprire tutte le possibili combinazioni di permessi su un file. Possiamo settare a 1 un permesso consentito (es. diritto di scrittura su file per l'utente proprietario) e a 0 un permesso non consentito (es. diritto di esecuzione del file per un qualsiasi altro utente). Esempio pratico:
U G O r w x r w x r w x 1 1 0 1 0 0 0 0 0
I permessi così settati identificano un file leggibile e scrivibile dal proprietario, solo leggibile dal gruppo proprietario e non accessibile ad altri. I sistemi Unix visualizzano i permessi su file in questo modo. Per comodità, si usa convertire la notazione sopra in ottale in modo che sia di più facile memorizzazione. Ad esempio, la scrittura di sopra diventerebbe 0640 in ottale. Se l'utente proprietario avesse avuto anche i privilegi di esecuzione allora il primo numero sarebbe diventato 111, e la notazione ottale corrispondente 0740. Per cambiare i permessi di un file si usa il comando chmod proprio con questa notazione. Esempio:
chmod 0644 file
Un'alternativa è quella di usare invece della notazione ottale la seguente notazione relativa:
ugoa(+-)rwx
ovvero aggiungere o rimuovere i permessi di lettura, scrittura o esecuzione su un file per l'utente, il gruppo, gli altri utenti o tutti. Esempio:
chmod ug+rw file
Questo comando rende il file scrivibile e leggibile dall'utente e dal gruppo proprietari.

