Sviluppatori

Come Capire i Permessi Chmod (Ottale e Simbolico Spiegati Bene)

8 min di lettura

Chmod 755 significa che il proprietario del file può leggerlo, scriverlo ed eseguirlo, mentre il gruppo e tutti gli altri possono solo leggerlo ed eseguirlo, non modificarlo. Ognuna delle tre cifre di un numero chmod copre una classe di utenti, proprietario, gruppo, altri, e ogni cifra è costruita da tre bit: lettura, scrittura, esecuzione.

Come si costruisce una cifra ottale

Per ogni classe di utenti esistono tre bit di permesso: lettura (valore 4), scrittura (valore 2), esecuzione (valore 1). Si sommano i bit attivi e si ottiene la cifra di quella classe, da 0 a 7.

  • 4 = sola lettura
  • 6 = lettura + scrittura (4 + 2)
  • 5 = lettura + esecuzione (4 + 1)
  • 7 = lettura + scrittura + esecuzione (4 + 2 + 1)
  • 0 = nessun permesso

Un comando chmod elenca tre di queste cifre di fila, sempre nello stesso ordine: proprietario, gruppo, altri. chmod 750 file si scompone così: 7 per il proprietario (lettura, scrittura, esecuzione), 5 per il gruppo (lettura, esecuzione), 0 per gli altri (niente). Non serve memorizzare nulla, basta sommare i bit che valgono per ciascuna classe.

Esempi pratici che si incontrano davvero

CommandOctalSymbolicUso tipico
chmod 600 file600rw-------Chiave privata SSH (id_rsa), file .env / segreti
chmod 644 file644rw-r—r—File normale (HTML, config, log), il proprietario modifica, tutti leggono
chmod 700 dir700rwx------Cartella privata accessibile solo al proprietario
chmod 755 script.sh755rwxr-xr-xScript o directory pubblici, il proprietario modifica, tutti possono eseguire/entrare
chmod 775 dir775rwxrwxr-xDirectory di team condivisa, proprietario e gruppo possono scrivere
chmod 777 file777rwxrwxrwxTutti possono leggere, scrivere, eseguire, da evitare, rischio di sicurezza

Verifica pure la matematica di ogni riga: 755 significa proprietario = 4+2+1 = 7 (rwx), gruppo = 4+0+1 = 5 (r-x), altri = 4+0+1 = 5 (r-x), che dà esattamente rwxr-xr-x. Lo stesso schema vale per ogni riga della tabella.

Un dettaglio che confonde spesso, e riguarda in particolare le directory: una directory ha bisogno del bit di esecuzione per poterci entrare con cd, e del bit di lettura per poterla elencare con ls. Una directory leggibile ma non eseguibile (per esempio 644 su una cartella) permette ad alcuni strumenti di mostrare i nomi dei file contenuti, ma non si può entrarci con cd né fare stat sui file, perché è proprio il bit di esecuzione a governare l’attraversamento di una directory. Lettura ed esecuzione svolgono compiti diversi su una directory rispetto a un file normale.

Due cose diverse chiamate entrambe “simbolico”

Qui la maggior parte delle spiegazioni fa confusione, perché con chmod esistono due cose distinte, entrambe chiamate comunemente “simbolico”:

La stringa mostrata da ls -l, come rwxr-xr-x. È quello che si vede elencando i file, ed è una fotografia assoluta dei permessi attuali, dieci caratteri: un flag di tipo file seguito da tre gruppi rwx per proprietario, gruppo, altri. È una descrizione, non un comando.

La sintassi simbolica propria di chmod, usata per modificare i permessi in modo relativo a quelli già presenti. Invece di specificare il numero completo a tre cifre, si indica una classe e un bit:

  • chmod u+x file.sh aggiunge l’esecuzione solo per il proprietario (user), senza toccare gruppo e altri
  • chmod go-w file toglie la scrittura a gruppo e altri, lasciando intatto il proprietario
  • chmod a+r file rende il file leggibile da tutti (all)

La differenza conta nella pratica: la modalità ottale (chmod 755) imposta sempre uno stato di permessi assoluto e completo, sovrascrivendo quello che c’era prima. La modalità simbolica (chmod u+x) apporta una modifica relativa ai permessi già esistenti, senza toccare il resto. Conviene usare la modalità simbolica quando si vuole cambiare un solo bit senza ricalcolare a mano l’intero numero a tre cifre.

Provalo con i tuoi permessi

LetturaScritturaEsecuzione
Proprietario
Gruppo
Altri
Calcolatore Chmod
Gratis, senza registrazione, su qualsiasi dispositivo.
Apri lo strumento completo

Perché i nuovi file partono da 644 e le nuove directory da 755

Nessuno lancia chmod su ogni file appena creato, eppure i nuovi file risultano quasi sempre 644 e le nuove directory 755. Non è una coincidenza, è l’umask al lavoro.

I nuovi file partono da una base di 666 (rw-rw-rw-, nessun bit di esecuzione per default, per sicurezza, dato che non conviene avere ogni nuovo file eseguibile da subito). Le nuove directory partono invece da 777 (rwxrwxrwx). Da questa base viene poi sottratto il valore di umask della shell. L’umask predefinito sulla maggior parte dei sistemi Linux è 022, quindi:

  • 666 − 022 = 644 per un file appena creato
  • 777 − 022 = 755 per una directory appena creata

È tutto qui il meccanismo dietro i due valori di permesso più comuni della tabella sopra. Se sul proprio sistema i file appena creati risultano diversi da 644 e le directory da 755, conviene controllare umask nella shell: quasi certamente è impostato su un valore diverso da quello predefinito.

Errori comuni e l’aspetto della sicurezza

chmod 777 è un campanello d’allarme, non una soluzione. Impostare un file o una directory a 777 dà a ogni utente del sistema, compreso un eventuale attaccante che abbia ottenuto un minimo accesso, il permesso di leggere, scrivere e sostituire quel file. Un upload di file non validato combinato con una directory di upload a 777 è un classico esempio di come un’applicazione web diventi una webshell. Gli scanner di sicurezza usati negli audit su WordPress e hosting segnalano 777 come criticità appena lo trovano. La correzione quasi sempre è 755 per eseguibili e directory, 644 per i file normali, ristretta ulteriormente a 750 o 640 quando c’è un gruppo fidato che ha bisogno di scrivere ma il resto del mondo no.

SSH rifiuta una chiave privata troppo permissiva. ssh-keygen crea le chiavi private a 600 per default, e OpenSSH lo fa rispettare attivamente: se il proprio id_rsa risulta leggibile dal gruppo o da tutti, SSH si rifiuta di usarla e stampa un messaggio simile a “UNPROTECTED PRIVATE KEY FILE!” insieme a “Permissions 0644 for ‘id_rsa’ are too open.” Non è un avviso cosmetico, è un blocco vero e proprio, ed è il motivo più comune per cui una chiave SSH “smette di funzionare” dopo essere stata copiata tra macchine o estratta da un backup, dato che la copia spesso reimposta i permessi a qualcosa di più aperto di 600.

Nota sui limiti: setuid, setgid e sticky bit

Il calcolatore chmod qui sopra copre l’insieme standard a tre cifre proprietario/gruppo/altri, che gestisce la grande maggioranza dei casi reali. Quello che non modella è una quarta cifra opzionale, iniziale, per i bit di permesso speciali: setuid (4000), setgid (2000) e lo sticky bit (1000), combinati in modalità come chmod 4755 o chmod 1777.

In una frase ciascuno: setuid esegue un binario con i privilegi del suo proprietario invece che di chi lo lancia (l’esempio classico è /usr/bin/passwd, che ha bisogno di accesso elevato per aggiornare il file di sistema delle password), mentre lo sticky bit su una directory scrivibile da tutti come /tmp impedisce a un utente di cancellare o rinominare i file di proprietà di un altro utente lì dentro, anche se tutti possono scrivere nella directory.

Domande frequenti

Cosa significa chmod 755? Il proprietario ottiene lettura, scrittura ed esecuzione (7 = 4+2+1). Il gruppo e tutti gli altri ottengono solo lettura ed esecuzione, senza scrittura (5 = 4+0+1 ciascuno). In forma simbolica è rwxr-xr-x, il permesso standard per uno script o una directory pubblica: il proprietario può modificarlo, tutti gli altri possono eseguirlo o entrarci.

Qual è la differenza tra chmod 644 e 755? 644 toglie del tutto il bit di esecuzione (rw-r—r—), ed è corretto per file normali come HTML, config o log che non devono mai essere lanciati come programma. 755 mantiene l’esecuzione per ogni classe (rwxr-xr-x), ed è quello che serve a uno script o a una directory, dato che le directory richiedono il bit di esecuzione anche solo per essere attraversate. Si usa 644 per i dati, 755 per tutto ciò che deve girare o essere attraversato.

Perché chmod 600 è così importante per le chiavi SSH? Perché OpenSSH controlla i bit di permesso di una chiave privata prima di usarla e rifiuta di procedere se la chiave è leggibile dal gruppo o da altri. 600 (rw-------) significa che solo il proprietario del file può leggerlo o scriverlo, esattamente ciò di cui ha bisogno una chiave privata: nessun altro sul sistema dovrebbe poterne nemmeno vedere il contenuto.

chmod 777 è mai la risposta giusta? Quasi mai in produzione. Concede lettura, scrittura ed esecuzione complete a ogni utente del sistema, una causa comune dietro upload di file sovrascritti con codice malevolo. Se sembra che qualcosa richieda 777 per funzionare, il problema reale di solito è un proprietario o un gruppo del file sbagliati, risolvibile con chown, non un motivo per aprire i permessi a chiunque.

Qual è la differenza tra rwxr-xr-x e chmod u+x? rwxr-xr-x è la stringa mostrata da ls -l, una fotografia dello stato completo attuale dei permessi. chmod u+x è un comando che usa la sintassi simbolica di chmod per fare una modifica relativa, aggiungendo l’esecuzione per il proprietario senza toccare nient’altro. Uno descrive dove si trovano i permessi in questo momento, l’altro è un modo per cambiarli.

ChmodPermessi UnixLinuxPermessi File
Calcolatore Chmod
Ora provalo tu stesso con lo strumento completo.
Prova ora