È uscito il Corso Java Completo
Torna al blog

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.

Edoardo Midali

Edoardo Midali

Developer · Content Creator

6 min di lettura

"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:

PermessoLetteraSu un fileSu una cartella
LetturarLeggerne il contenutoElencare cosa contiene
ScritturawModificarloCreare/eliminare file dentro
EsecuzionexEseguirloAttraversarla

La colonna delle cartelle è quella che sorprende, e spiega metà dei problemi:

  • x su una cartella non significa "eseguire": significa poterci entrare. Senza, non accedi a nulla al suo interno nemmeno se hai i permessi sui singoli file.
  • w su 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:

PermessoValore
Lettura (r)4
Scrittura (w)2
Esecuzione (x)1

Si sommano per ottenere la cifra di ciascun livello:

  • 7 = 4+2+1 = lettura, scrittura, esecuzione
  • 6 = 4+2 = lettura e scrittura
  • 5 = 4+1 = lettura ed esecuzione
  • 4 = solo lettura
  • 0 = niente

Tre cifre: proprietario, gruppo, altri.

I valori che userai davvero sono pochi:

ValoreSignificatoPer cosa
644Proprietario legge e scrive, gli altri leggonoFile normali
755Proprietario tutto, gli altri leggono ed entranoCartelle e script
600Solo il proprietario, in lettura e scritturaFile con segreti
700Solo il proprietario, tuttoCartelle 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.