Modificare i permessi con chmod e chown

12/04/22 (aggiornamento 03/03/25) | ~ 7 minuti

In qualsiasi sistema operativo file e cartelle non sono liberamente accessibili e modificabili, ma seguono dei precisi permessi per garantire maggiore sicurezza.
I sistemi GNU/Linux, in particolare, nascono con la predisposizione all'uso multiutente e la componente dei permessi è una delle peculiarità principali, a prescindere dalla distribuzione.
Gli strumenti primari per la gestione dei permessi sono chmod e chown.

Utenti e gruppi

Facciamo un passo indietro.
Ogni distro Linux prevede la presenza di utenti e gruppi. Alla creazione di un utente generalmente corrisponde quella di un gruppo omonimo, a cui l'utente in questione sarà automaticamente aggiunto; ogni utente può far parte di uno o più gruppi.

Oltre ai gruppi che condividono il nome con gli utenti, ne esistono altri con funzionalità particolari, ad esempio il gruppo wheel viene usato per assegnare ad utenti standard permessi amministrativi quando usano il comando sudo.

La rappresentazione simbolica

Per consuetudine la rappresentazione dei comandi avviene con il prefisso "$ ", che non va digitato nella shell.

L'interazione con i permessi può essere effettuata proficuamente anche da quasi tutti i file manager con interfaccia grafica ma, come sempre, per capire meglio, ci concentreremo sul terminale.

Se da una qualsiasi cartella digitiamo il comando: $ ls -l La shell ci risponderà con la lista dettagliata di tutto il contenuto: dr---w---x 2 dajelinux gdajelinux 4096 10 apr 12.00 Cartella -rwxr--r-- 1 dajelinux gdajelinux 0 10 apr 12.00 Prova1 ---xrw--wx 1 dajelinux gdajelinux 0 10 apr 12.00 Prova2

Ogni riga è suddivisa in colonne che espletano le proprietà del rispettivo file o cartella.
La prima colonna è formata da 1+9 caselle.
Tutte le caselle partono da uno stato nullo - non assegnato e possono assumere un valore definito da una lettera.
La prima casella è occupata da una d (directory) se si riferisce ad una cartella, ma rimarrà vuota (-) in caso di file.

Le nove caselle dalla 2 alla 10 vanno considerate raggruppandole in tre terzine.
Ogni gruppo di tre fa riferimento ai permessi dell'utente proprietario (u), del gruppo proprietario (g) e infine degli altri utenti (o).
Le 3 caselle di ogni piccolo gruppo, infine, possono avere dei valori specifici:

-rwxrwxrwx 1 dajelinux gdajelinux 0 10 apr 12.00 Prova3 L'utente e il gruppo proprietario, invece, compaiono rispettivamente nella terza e quarta colonna di ogni riga dell'output di ls. Qui corrispondono a dajelinux e gdajelinux.

La rappresentazione ottale

La rappresentazione ottale utilizza valori binari, convertiti in numeri decimali, al posto delle lettere r, w ed x .

I valori soprastanti possono essere sommati tra loro, inoltre è possibile utilizzare lo 0 per non concedere nessun permesso.
Si otterrà in questo modo un numero di 3 cifre, ognuno ad indicare (anche qui) rispettivamente i privilegi di utente, gruppo ed altri.

Invece del comando ls ci avvalermo di stat per avere una visualizzazione numerica dei permessi di un file o cartella: stat -c "%a %n" Prova1 Ci restituirà qualcosa come: 755 Prova1 Il parametro aggiuntivo di stat non fa altro che limitare le informazioni visualizzate ai permessi con rappresentazione ottale, seguiti dal nome del file (facoltativo).

Esempi con rappresentazione simbolica

dr---w---x 2 dajelinux gdajelinux 4096 10 apr 12.00 Cartella La directory Cartella può essere solo letta dall'utente dajelinux, scritta dai componenti del gruppo gdajelinux ed eseguita dagli altri utenti.

-rwxr--r-- 1 dajelinux gdajelinux 0 10 apr 12.00 Prova1 Il file Prova1 può essere letto, scritto ed eseguito dal suo proprietario dajelinux, ma tutti gli altri potranno solo leggerlo.

---xrw--wx 1 dajelinux gdajelinux 0 10 apr 12.00 Prova2 Il file Prova2 può essere eseguito da dajelinux, letto e scritto da chi fa parte di gdajelinux e scritto ed eseguito dagli altri utenti.

Esempi con rappresentazione ottale

421 Prova1 L'utente proprietario può solo leggere il file (4 = solo lettura).
Gli utenti all'interno del gruppo proprietario possono solo scrivere (2 = solo scrittura).
Gli altri utenti potranno solo eseguire (1 = solo esecuzione).

750 Prova2 Il proprietario in questo caso avrà permessi totali, in quanto il suo valore è ottenuto da: 4 (read) + 2 (write) + 1 (execute) = 7.
Chi è nel gruppo assegnato al file potrà solo leggere ed eseguire (4 + 1 = 5).
Chiunque altro non avrà nessun privilegio.

Cambiare i permessi con chmod

Come abbiamo già visto, i permessi su Linux vengono rappresentati in modo simbolico in tre terzine e divisi per utente, gruppo e altri utenti.
I permessi possono essere modificati selettivamente con chmod, aggiungendoli o rimuovendoli a seconda dei ruoli.

$ chmod u+r Prova1 $ chmod u+w Prova1 # chmod u+x Prova1 Tre comandi differenti, tutti per assegnare permessi all'utente proprietario sul file Prova1. u+r andrà ad aggiungere il permesso di lettura, u+w quello di scrittura, infine u+x quello di esecuzione.
È possibile raggruppare i comandi precedenti un unica richiesta alla shell: $ chmod u+rwx Prova1 Se avessi voluto rimuovere tutti i permessi sul file Prova1 avrei potuto digitare: $ chmod u-rwx Prova1 O avrei dovuto sostituire il + con il - in ogni singolo comando.

Quello che vale per l'utente (u), vale anche per il gruppo proprietario (g) e per gli altri utenti (o). $ chmod g+w Prova2 quindi, per permettere al gruppo di scrivere su Prova2, $ chmod o-x Prova2 per vietarne l'esecuzione a tutti gli altri utenti che non siano il proprietario del file o non facciano parte del gruppo che lo detiene, ecc.

Con la rappresentazione ottale potremmo indicare in maniera più rapida (ma forse non altrettanto semplice da ricordare) i permessi da assegnare: $ chmod 777 Prova1 Permessi massimi (sconsigliati) per il file Prova1. Tutti hanno libertà assoluta.

$ chmod 753 Prova2 Comando per dare pieni permessi al proprietario, possibilità di lettura ed esecuzione agli appartanenti al gruppo di riferimento e infine scrittura ed esecuzione assicurati agli altri utenti.

Eseguire gli script

Nei sistemi Unix-like un semplice file di testo (plain text) può trasformarsi facilmente in uno script eseguibile. Si tratta di una serie di istruzioni da eseguire automaticamente, ad esempio da una shell. L'aggettivo eseguibile non è casuale, ma sta ad indicare che gli utenti devono avere il permesso di esecuzione per avviare lo script.
Per questo motivo spesso capiterà di trovare tutorial online che includono proprio il comando chown +x per permettere l'avvio di uno script.
Per certi versi, il permesso di esecuzione si potrebbe interpretare come appartenente ad un file/cartella piuttosto che all'utente. Chiunque infatti non potrà far partire nessuno script che non sia "flaggato" come eseguibile. Tuttavia è possibile scegliere granularmente i soggetti a cui sarà concessa l'esecuzione, come per ogni permesso "tradizionale".

Cambiare i proprietari con chown

Abbiamo già visto un esempio dell'output del comando ls -l dr---w---x 2 dajelinux gdajelinux 4096 10 apr 12.00 Cartella -rwxr--r-- 1 dajelinux gdajelinux 0 10 apr 12.00 Prova1 ---xrw--wx 1 dajelinux gdajelinux 0 10 apr 12.00 Prova2 Se le caselle della prima colonna rappresentano i permessi, utente e gruppo proprietari sono indicati nella terza e quarta colonna di ogni riga.
La modifica di questi valori è piuttosto semplice rispetto alle combinazioni necessarie per padroneggiare i permessi e si basa fondamentalmente su una struttura chown utente:gruppo . Nello specifico con il comando: $ chown luca:luca Prova1 vado ad impostare come proprietari l'utente luca e il suo omonimo gruppo di appartenenza.

Recursività

Aggiungendo il parametro -R ai comandi chmod o chown, applicheremo una recursività: chown -R luca:luca Cartella In questo modo l'utente diverrà proprietario della cartella e di tutto il contenuto al suo interno, comprese le sottocartelle con i loro file.

Lunga vita al root

La proprietà ed i permessi dei file vengono applicati agli utenti non amministratori, ma mai all'utente root, che fondamentalmente non è sottoposto ad alcun reale limite e può sempre apportare modifiche con chmod e chown.
Root potrebbe anche impersonare gli altri utenti attraverso strumenti come sudo.
Sempre con sudo (o doas, o altro), gli utenti standard possono elevarsi temporaneamente ad amministratori, ereditando l'identità e i privilegi di root.

Gerarchie

Gli utenti non amministatori non possono modificare permessi e proprietà di file che non appartengano a loro, anche se fanno parte del gruppo proprietario.
La natura multi-utente del sistema (derivata da Unix) viene a galla molto presto quando si parla di permessi.
Potenzialmente ogni utente può scegliere di avere un proprio spazio con contenuti privati, ma comunque accessibili da root. Per una protezione completa è consigliabile ricorrere alla crittografia.
Un amministratore di sistema può inoltre sfruttare i permessi per creare facilmente una struttura gerarchica complessa di utenti, ognuno con privilegi specifici.

Non ho parlato ancora di sticky bit, è vero.