Permessi file Linux: chmod e chown spiegati
Come funzionano i permessi in Linux: lettura, scrittura ed esecuzione, la notazione numerica, chmod e chown, e perché 777 non è mai la soluzione.
"Permission denied" è probabilmente il primo errore serio che si incontra su Linux, e la soluzione che si trova subito su internet — chmod 777 — è anche la peggiore. I permessi hanno una logica semplice che si capisce in dieci minuti, e capirla evita sia l'errore sia il rimedio sbagliato.
Il modello
Ogni file e cartella ha un proprietario, un gruppo, e tre livelli di permesso: cosa può fare il proprietario, cosa può fare il gruppo, cosa possono fare tutti gli altri.
I permessi sono tre:
| Permesso | Lettera | Su un file | Su una cartella |
|---|---|---|---|
| Lettura | r | Leggerne il contenuto | Elencare cosa contiene |
| Scrittura | w | Modificarlo | Creare/eliminare file dentro |
| Esecuzione | x | Eseguirlo | Attraversarla |
La colonna delle cartelle è quella che sorprende, e spiega metà dei problemi:
xsu una cartella non significa "eseguire": significa poterci entrare. Senza, non accedi a nulla al suo interno nemmeno se hai i permessi sui singoli file.wsu una cartella permette di eliminare file al suo interno, anche file che non sono tuoi. È il permesso più pericoloso da concedere.
Come si leggono
Eseguendo ls -l:
-rw-r--r-- 1 edoardo staff 1024 Sep 11 10:30 documento.txt
drwxr-xr-x 2 edoardo staff 4096 Sep 11 10:31 progetti
La prima colonna si legge a blocchi:
- rw- r-- r--
│ │ │ └── altri: solo lettura
│ │ └─────── gruppo: solo lettura
│ └──────────── proprietario: lettura e scrittura
└──────────────── tipo: - file, d cartella, l collegamento
Il secondo esempio (drwxr-xr-x) è una cartella in cui il proprietario può fare tutto, e gli altri possono entrare ed elencare ma non creare file.
La notazione numerica
È quella che si usa nella pratica, e si basa su una somma:
| Permesso | Valore |
|---|---|
| Lettura (r) | 4 |
| Scrittura (w) | 2 |
| Esecuzione (x) | 1 |
Si sommano per ottenere la cifra di ciascun livello:
7= 4+2+1 = lettura, scrittura, esecuzione6= 4+2 = lettura e scrittura5= 4+1 = lettura ed esecuzione4= solo lettura0= niente
Tre cifre: proprietario, gruppo, altri.
I valori che userai davvero sono pochi:
| Valore | Significato | Per cosa |
|---|---|---|
| 644 | Proprietario legge e scrive, gli altri leggono | File normali |
| 755 | Proprietario tutto, gli altri leggono ed entrano | Cartelle e script |
| 600 | Solo il proprietario, in lettura e scrittura | File con segreti |
| 700 | Solo il proprietario, tutto | Cartelle private |
Nella pratica: 644 per i file, 755 per le cartelle, 600 per tutto ciò che contiene credenziali. Con questi tre si copre quasi ogni situazione.
I comandi
chmod 644 file.txt # notazione numerica
chmod u+x script.sh # aggiungi esecuzione al proprietario
chmod go-w file.txt # togli scrittura a gruppo e altri
chmod -R 755 cartella/ # ricorsivo, su tutto il contenuto
chown utente file.txt # cambia proprietario
chown utente:gruppo file.txt # proprietario e gruppo
chown -R www-data:www-data /var/www # ricorsivo
Nella notazione simbolica: u proprietario, g gruppo, o altri, a tutti; + aggiunge, - toglie, = imposta esattamente.
Attenzione a chmod -R su una cartella: applica lo stesso valore a file e cartelle, ma le cartelle hanno bisogno di x e i file no. Impostare 644 ricorsivamente rende le cartelle inaccessibili; impostare 755 rende tutti i file eseguibili.
La soluzione corretta tratta i due casi separatamente:
find /percorso -type d -exec chmod 755 {} \; # cartelle
find /percorso -type f -exec chmod 644 {} \; # file
Perché 777 non è mai la soluzione
È il consiglio più diffuso e più dannoso che si trova cercando "permission denied".
chmod 777 significa: chiunque può leggere, modificare ed eseguire. Su un server web, "chiunque" include il processo del server — e quindi, potenzialmente, chi riesce a sfruttare una vulnerabilità di quel processo.
Le conseguenze concrete:
- Un file di configurazione a 777 è modificabile da qualunque processo sulla macchina
- Una cartella web a 777 permette a un attaccante che riesca a caricare un file di renderlo eseguibile
- Molti software si rifiutano di funzionare con permessi troppo aperti — SSH, per esempio, ignora le chiavi private se non sono a 600, proprio come protezione
Quando qualcosa non funziona per i permessi, la domanda giusta è: quale utente sta cercando di accedere? Quasi sempre il problema non è che i permessi sono troppo stretti, è che il proprietario è sbagliato — e si risolve con chown, non con chmod 777.
Su un server web il caso tipico: i file appartengono al tuo utente ma il server gira come utente diverso. La soluzione è assegnare il gruppo corretto, non aprire tutto.
Il bit setuid e la sticky bit
Due casi particolari che si incontrano e vale la pena riconoscere.
Una s al posto della x (-rwsr-xr-x) indica che il programma viene eseguito con i privilegi del proprietario invece che di chi lo lancia. È il meccanismo che permette a comandi come passwd di modificare file di sistema.
Vederlo su un file che non dovrebbe averlo è un segnale d'allarme: è una tecnica classica per mantenere accesso privilegiato su una macchina compromessa.
Una t finale (drwxrwxrwt) è la sticky bit: in una cartella scrivibile da tutti, permette a ciascuno di eliminare solo i propri file. È quello che rende sicura la cartella temporanea di sistema.
Errori tipici
chmod 777 per far funzionare qualcosa. Già detto, ed è il primo.
chmod -R senza distinguere file e cartelle. Vedi sopra.
Dimenticare che serve x sulle cartelle del percorso. Per leggere /a/b/c/file.txt servono i permessi di attraversamento su a, b e c, non solo sul file.
Cambiare i permessi invece del proprietario. Il problema è quasi sempre chown.
Chiavi SSH con permessi aperti. SSH le rifiuta: devono essere a 600 — vedi SSH e chiavi.
File con credenziali leggibili da tutti. Un file di ambiente a 644 è leggibile da qualunque utente sulla macchina: va a 600. Su un VPS con più utenti è una delle prime cose da verificare.
In sintesi
I permessi Linux si basano su tre livelli — proprietario, gruppo, altri — e tre diritti: lettura (4), scrittura (2), esecuzione (1), che si sommano.
Nella pratica servono tre valori: 644 per i file, 755 per cartelle e script, 600 per i file con segreti.
La cosa che spiega metà dei problemi: su una cartella, x significa poterci entrare, e serve su tutto il percorso, non solo sulla destinazione.
E la regola che conta più di tutte: chmod 777 non risolve i problemi di permessi, li nasconde creandone di sicurezza. Quando qualcosa non funziona, la domanda giusta è quale utente sta accedendo — e la risposta è quasi sempre chown, non chmod.
Se i comandi di base ti sono ancora poco familiari, il quadro è in comandi Linux essenziali.