Su Linux ogni file e ogni cartella hanno un proprietario, un gruppo e un insieme di permessi che stabiliscono chi può fare cosa. È un modello semplice, nato con Unix, ma capirlo bene risolve metà dei problemi del tipo «permesso negato» e previene configurazioni pericolose come il famigerato chmod 777.
Leggere i permessi con ls -l
Il comando ls -l mostra una riga come questa:
-rw-r--r-- 1 anna ufficio 2048 mar 3 10:15 relazione.txt
Il primo carattere indica il tipo: - file normale, d cartella, l collegamento simbolico. Seguono nove caratteri divisi in tre gruppi da tre:
| Posizione | Si applica a | Nell'esempio |
|---|---|---|
| 2-4 | proprietario (user) | rw- lettura e scrittura |
| 5-7 | gruppo (group) | r-- solo lettura |
| 8-10 | tutti gli altri (others) | r-- solo lettura |
Poi compaiono il proprietario (anna) e il gruppo (ufficio). Il sistema controlla le categorie in ordine: se sei il proprietario valgono i permessi del proprietario, anche se quelli del gruppo fossero più ampi.
Cosa significano r, w, x
Per i file il significato è intuitivo: r permette di leggere il contenuto, w di modificarlo, x di eseguirlo come programma o script.
Per le cartelle le cose sono meno ovvie:
rpermette di elencare i nomi dei file contenuti;wpermette di creare, rinominare ed eliminare file al suo interno;xpermette di attraversare la cartella, cioè di entrarci e accedere ai file di cui si conosce il nome.
Una conseguenza importante: la possibilità di cancellare un file dipende dai permessi della cartella che lo contiene, non da quelli del file stesso. Un file in sola lettura può essere eliminato da chi ha permesso di scrittura sulla cartella.
La notazione ottale
Ogni permesso ha un valore: r = 4, w = 2, x = 1. Sommandoli si ottiene una cifra per ciascuna categoria.
7= 4+2+1 =rwx6= 4+2 =rw-5= 4+1 =r-x4=r--0=---
Così 644 significa rw-r--r--, tipico dei documenti, e 755 significa rwxr-xr-x, tipico di cartelle e programmi. Per un file con dati riservati, come una chiave privata, si usa 600: solo il proprietario legge e scrive.
chmod: cambiare i permessi
chmod accetta sia la forma ottale sia quella simbolica.
chmod 640 contratto.pdf # rw- r-- ---
chmod u+x backup.sh # aggiunge l'esecuzione al proprietario
chmod go-w condiviso.txt # toglie la scrittura a gruppo e altri
chmod -R g+rX progetto/ # lettura al gruppo, X solo dove serve
Nella forma simbolica u, g, o e a indicano proprietario, gruppo, altri e tutti; +, - e = aggiungono, tolgono o impostano. La X maiuscola è un dettaglio prezioso: assegna l'esecuzione solo alle cartelle e ai file che sono già eseguibili per qualcuno, evitando di rendere eseguibili tutti i documenti quando si lavora in modo ricorsivo.
chown e chgrp: cambiare proprietario e gruppo
chown utente file cambia il proprietario, chown utente:gruppo file cambia entrambi, chgrp gruppo file solo il gruppo. Cambiare il proprietario di un file richiede i privilegi di amministratore, quindi di solito si usa sudo. Con -R l'operazione diventa ricorsiva: comodo, ma da usare con attenzione su cartelle di sistema.
Perché chmod 777 è quasi sempre sbagliato
Quando un'applicazione web non riesce a scrivere in una cartella, la tentazione è dare 777: tutti possono leggere, scrivere ed eseguire. Il problema sparisce, ma qualunque utente o processo del sistema può ora modificare o sostituire quei file. La soluzione corretta è capire quale utente ha bisogno di scrivere, per esempio l'utente con cui gira il server web, e assegnare a lui la proprietà o il gruppo, lasciando permessi stretti come 750 o 770.
umask: i permessi di partenza
I nuovi file non nascono con permessi casuali. La umask indica quali permessi togliere ai valori di base, che sono 666 per i file e 777 per le cartelle. Con la umask comune 022, i file nascono 644 e le cartelle 755. Con 027, il gruppo perde la scrittura e gli altri perdono tutto, ottenendo 640 e 750. Il comando umask senza argomenti mostra il valore corrente.
I bit speciali
Oltre ai nove permessi esistono tre bit aggiuntivi:
- setuid su un eseguibile fa sì che giri con i privilegi del proprietario del file. È il meccanismo che permette a
passwddi aggiornare un file di sistema che l'utente non potrebbe toccare. Compare comesal posto dellaxdel proprietario. - setgid su una cartella fa sì che i nuovi file ereditino il gruppo della cartella: ideale per le cartelle condivise di un team.
- sticky bit su una cartella impedisce di cancellare file altrui anche a chi ha permesso di scrittura. È il motivo per cui
/tmpè scrivibile da tutti senza che ognuno possa eliminare i file degli altri; compare cometalla fine.
Nella forma ottale si aggiungono come quarta cifra iniziale: chmod 2770 condivisa/ imposta setgid, chmod 1777 /tmp lo sticky bit.
In sintesi
- Ogni file ha permessi
rwxseparati per proprietario, gruppo e altri. - Sulle cartelle
xsignifica attraversare ewpermette di creare e cancellare i file contenuti. - In ottale r=4, w=2, x=1:
644per documenti,755per programmi,600per dati riservati. - Invece di
777, assegna proprietà o gruppo all'utente che deve davvero scrivere. - setgid e sticky bit risolvono in modo elegante le cartelle condivise.