Autorizzazioni e deleghe

Loris Tissino

20 luglio 2009

Permessi sui file

Un primo importante livello di autorizzazioni è quello impostato con i permessi sui file e le directory (rwx: read, write, execute), in abbinamento all'utente proprietario, al gruppo proprietario, agli "altri" (ugo: user, group, others).

Un secondo livello è impostabile con i bit SUID e SGID, che consentono, come visto, di far eseguire programmi con i permessi del proprietario (o del gruppo proprietario) del file eseguibile.

Privilegi utente

Nei sistemi Debian/Ubuntu è possibile impostare privilegi particolari per gli utenti di un sistema desktop facendo appartenere o meno questi ultimi a determinati gruppi:

$ groups alice
studenti plugdev lpadmin
Proprietà dell'account

Proprietà dell'account

Corrispondenza tra privilegi e gruppi

Nei sistemi Debian/Ubuntu i privilegi corrispondono all'appartenenza ai gruppi indicati qui di seguito.

Su

Il programma su (switch user) consente di "impersonare" un altro utente, aprendo una shell o eseguendo un determinato comando, a patto di conoscerne la password (a meno di non essere root, che può impersonare chiunque anche senza conoscerne la password).

In assenza di indicazione, viene impersonato l'utente root, per cui erroneamente a volte il nome del programma viene considerato con il significato di super user.

Con l'opzione -l la shell viene aperta con le impostazioni dell'utente "impersonato":

$ pwd
/tmp
$ su
Password: 
# pwd
/tmp
# exit

$ su -l
Password: 
# pwd
/root

Su -c

Tramite il programma su è possibile eseguire un comando per conto di un altro utente:

# whoami
root
# su -l loris -c whoami
loris

Sudo

Il programma sudo (switch user and do) consente ad un utente di esercitare una delega (cioè di eseguire un programma che non potrebbe altrimenti eseguire) predisposta per lui da root.

I vantaggi:

Nella configurazione standard, per esercitare una delega l'utente deve digitare la propria password (in modo da evitare il problema del "terminale lasciato aperto").

Il file /etc/sudoers

Il file contenente le "deleghe" è /etc/sudoers. È consigliabile modificare tale file con il comando visudo (che effettua dei controlli al momento del salvataggio).

Un esempio di contenuto potrebbe essere il seguente, con si autorizzano gli utenti del gruppo contab ad eseguire il comando /bin/cat per visualizzare il file /tmp/rootfile.txt.

# Host alias specification
Host_Alias SCHOOL=biegacz,geeky

# User alias specification

# Cmnd alias specification
Cmnd_Alias TMPVIEW = /bin/cat /tmp/rootfile.txt

# User privilege specification
root    ALL=(ALL) ALL

# Members of the admin group may gain root privileges
%admin    ALL=(ALL) ALL
%contab   SCHOOL=(ALL) TMPVIEW

Si veda sudoers(5) per esempi approfonditi.

Esercizio delle deleghe

Un utente può sapere di quali deleghe dispone con il comando sudo -l ed esercitarne una con il comando sudo:

$ cat /tmp/rootfile.txt 
cat: /tmp/rootfile.txt: Permission denied

$ sudo cat /tmp/rootfile.txt
[sudo] password for john: 
[...]
[Contents of the file...]

$ sudo -l
User john may run the following commands on this host:
    (ALL) /bin/cat /tmp/rootfile.txt

Esecuzione di comandi a nome di altri utenti

Può essere comodo (o necessario) eseguire comandi impersonando altri utenti, reali o di sistema.

$ sudo -u www-data whoami
www-data
$ sudo -u alice whoami
alice
$ sudo -u alice touch /tmp/file_di_alice.txt
$ ls -l /tmp/file_di_alice.txt
-rw-r--r-- 1 alice        studenti   0 2009-07-20 06:04 file_di_alice.txt

Sulla base di questo si possono predisporre degli script che testano i permessi degli utenti:

$ sudo -u alice touch /tmp/prova.txt && \
  echo 'alice riesce a scrivere in /tmp' || \
  echo 'alice non riesce a scrivere in /tmp'
alice riesce a scrivere in /tmp

$ sudo -u alice touch /etc/prova.txt && \
  echo 'alice riesce a scrivere in /etc' || \
  echo 'alice non riesce a scrivere in /etc'
touch: cannot touch `/etc/prova.txt': Permission denied
alice non riesce a scrivere in /etc

Registrazione delle operazioni basate su delega

Il file /var/log/auth.log contiene informazioni su chi e quando ha esercitato una delega:

Jul  8 15:14:30 biegacz sudo:  john : TTY=ttyp5 ; PWD=/tmp ; USER=root ; COMMAND=/bin/cat /tmp/rootfile.txt

Sudo e ridirezione dell'output

Se si vuole scrivere in una directory in cui non si hanno permessi di scrittura si può sfruttare sudo, ma non con il classico meccanismo dello standard output.

Ad esempio, immaginiamo di dover scrivere un file con data e ora corrente nella directory /root:

$ date > /root/operazioni.txt   # manca il permesso di scrittura
bash: /root/operazioni.txt: Permission denied

$ sudo date > /root/operazioni.txt  # non va bene...
bash: /root/operazioni.txt: Permission denied

$ date | sudo tee /root/operazioni.txt >/dev/null  # bingo!

In alternativa, si potrebbe usare dd, con il bonus di poter accodare i dati (modalità append):

$ date | sudo dd of=/root/operazioni.txt conv=notrunc oflag=append 2>/dev/null

Fakeroot

Può capitare che alcuni programmi richiedano permessi di root per svolgere alcune operazioni legate alla manipolazione dei file. L'esempio tipico è quello di un utente che vuole creare un archivio compresso contenente dei file che devono risultare dell'utente root quando (sulla macchina in cui) viene decompresso.

La soluzione è di usare il programma fakeroot, che lavora sostituendo provvisoriamente le librerie usate per le funzioni di manipolazione dei file. Naturalmente nessun permesso reale viene acquisito. Si veda come esempio la seguente sessione:

charlie$ whoami        # verifico di essere l'utente charlie
charlie
charlie$ ls -l bashrc  # nella directory corrente ho un file di mia proprietà
-rw-r--r-- 1 charlie studenti 93 2009-07-21 07:22 bashrc
charlie$ fakeroot      # divento root (ma è una finzione)
root# whoami           # sembra vero, cambia anche il prompt :-)
root
root# ls -l bashrc     # il file sembra diventato di root
-rw-r--r-- 1 root root 93 2009-07-21 07:22 bashrc
root# tar czf bashrc.tgz bashrc    # creo un archivio con tar
root# touch /root/qualcosa   # provo a fare qualcos'altro come root, ma fallisco
touch: cannot touch `/root/qualcosa': Permission denied
root# exit             # termino il lavoro come finto root
charlie$ tar tvzf bashrc.tgz   # verifico i permessi all'interno del file tar 
-rw-r--r-- root/root        93 2009-07-21 07:22 bashrc

Attributi ext2

I filesystem di tipo ext2 e successivi permettono di imporre attributi speciali ai file mediante il comando chattr.

In particolare, possono rivelarsi utili:

Gli attributi possono essere visualizzati con il comando lsattr:

$ sudo chattr +i documento 
$ lsattr documento 
----i-------------- documento
$ mv documento documento2
mv: cannot move `documento' to `documento2': Operation not permitted

Access Control List

Se una partizione è innestata (mounted) con l'opzione acl, su di essa è possibile operare usando delle access control list per consentire di specificare in maniera più granulare quali utenti (o quali gruppi) possono accedere (in lettura, scrittura e/o esecuzione) su determinati file o directory.

Ad esempio, supponiamo che Alice abbia il file documento.txt, al momento leggibile solo da lei:

alice$ ls -l documento.txt 
-rw------- 1 alice studenti 68 2009-07-20 09:27 documento.txt
alice$ cat documento.txt
Questo è un documento di Alice.
Ma anche Bob deve poterlo leggere.

Alice può aggiungere il permesso di lettura per Bob con il programma setfacl:

alice$ setfacl -m user:bob:r documento.txt 
alice$ ls -l documento.txt
-rw-r-----+ 1 alice studenti 68 2009-07-20 09:27 documento.txt

Bob potrà quindi leggere il documento:

bob$ cat documento.txt 
Questo è un documento di Alice.
Ma anche Bob deve poterlo leggere.

Visualizzare le ACL

Per visualizzare le ACL impostate, si usa il programma getfacl:

alice$ getfacl documento.txt 
# file: documento.txt
# owner: alice
# group: studenti
user::rw-
user:bob:r--
group::---
mask::r--
other::---

Può essere comoda anche una visione tabulare:

alice$ getfacl --tabular documento.txt 
# file: documento.txt
USER   alice     rw-     
user   bob       r--     
GROUP  studenti  r--     
mask             r--     
other            r--     

ACL e permessi standard

Il programma ls mostra un segno + dopo la lista dei permessi standard per segnalare la presenza di ACL, che avvertono di eventuali problemi:

alice$ ls -l documento.txt
-rw-r-----+ 1 alice studenti 68 2009-07-20 09:27 documento.txt

Da questo output sembrerebbe che un utente del gruppo studenti, come Charlie, possa accedere in lettura al file, ma così non è:

charlie$ id
uid=1007(charlie) gid=1014(studenti) groups=1014(studenti)

charlie$ cat documento.txt 
cat: documento.txt: Permission denied

Perché questo avviene? I bit standard riservati al gruppo vengono usati per indicare i permessi massimi consentiti dalle ACL agli utenti (mask).

Ereditarietà delle ACL

È possibile specificare, con l'opzione -d, un default per una directory, in modo che esso venga applicato a tutti i file in essa creati:

alice$ setfacl -d -m user:bob:rx lettere

alice$ fortune > lettere/doc1.txt

bob$ cat lettere/doc1.txt
You display the wonderful traits of charm and courtesy.

Copia di file con ACL

Per copiare file preservando le ACL è necessario usare l'opzione -a del programma cp, oppure -A di rsync.

Il programma tar supporta le ACL, ma non (ancora) in Ubuntu (8.10). Si può ovviare al problema creando un file di testo contenente le ACL, facendo il backup anche di quello e ripristinando le ACL dopo il ripristino dei file:

$ getfacl -R * > ACLs.txt           # backup delle ACL (con ricorsione)
$ sudo setfacl --restore=ACLs.txt   # ripristino delle ACL

PolicyKit

(rinvio) Un sistema più granulare di autorizzazioni, soprattutto legate all'uso in ambiente desktop, è quello previsto dal progetto PolicyKit.