Per ogni file su GNU/Linux è possibile gestire i permessi di lettura, scrittura ed esecuzione da parte degli utenti. In questa sezione verranno presentati una serie di comandi per poter gestire e modificare questi permessi. Innanzitutto per poter visualizzare i permessi presenti su un file, è possibile farlo attraverso:
ls -l nomeFile
# visualizza i permessi presenti sul file
# nomeFile
ls -l
# visualizza tutti i file coi relativi permessi
# all'interno della directory corrente
ls -l nomeDir
# visualizza i permessi di tutti i file
# all'interno della directory nomeDir
I permessi vengono presentati nella forma "xxx-xxx-xxx", dove con tre gruppi di caratteri da tre lettere l'uno rappresento i permessi di lettura, scrittura ed esecuzione per tre gruppi di utenti. Le lettere possono essere 'r' (lettura), 'w' (scrittura) e 'x' (esecuzione). Per quanto riguarda i tre gruppi di caratteri:
- il primo gruppo rappresenta i diritti del proprietario del file
- il secondo gruppo rappresenta i permessi dei membri del gruppo del proprietario
- il terzo gruppo rappresenta i permessi del resto degli utenti
Inoltre davanti ai tre gruppi di caratteri è presente un'altro carattere che rappresenta la natura del file e può essere:
- '-' significa, questo è un file
- 'd' significa, questa è una directory
- 'l' significa, questo è un link
Il significato dei permessi: lettura, scrittura ed esecuzione, varia se stiamo operando con una directory o con un file semplice, infatti:
- Per i file semplici:
- lettura 'r': significa poter leggere il file
- scrittura 'w': significa poter modificare il file o poterlo generalmente sovrascrivere
- esecuzione 'x': significa poterlo eseguire
- Per le directory:
- lettura 'r': significa poter leggere il contenuto di una directory, quindi eseguire comandi come "ls" ad esempio
- scrittura 'w': significa poter creare, cancellare o modificare i file (anche sotto-directory) all'interno della directory
- esecuzione 'x': significa poter attraversare una directory, ad esempio col comando "cd"
N.B.: Se un utente possiede i permessi di sola esecuzione per una directory, allora può accedere ai file all'interno della directory se e solo se ne conosce il nome, in quanto non può avere una lista dei file, ovviamente deve avere anche i diritti di lettura per i file all'interno della directory.
Vediamo ora alcuni comandi preliminari sulla gestione del proprietario di un file e dei permessi:
usermod -g myGroup jeff
# inserisce l'utente jeff nel gruppo chiamato myGroup
chown -R jeff.wheel nomeDirectory
# il proprietario della
# directory diventa jeff, e il gruppo proprietario (a cui è
# associato il secondo gruppo di caratteri rwx) diventa wheel,
# col flag -R questa operazione viene associata alla directory e
# a tutti i file all'interno (quindi anche eventuali
# sotto-directory)
Per poter modificare i permessi relativi ad un file, esistono generalmente due modalità:
- Modalità Simbolica
- Modalità Numerica
Una comoda modalità per settare i permessi, è quella di utilizzare la modalità simbolica. In questa modalità, si usano le lettere per riferirsi ai gruppi di utenti, infatti:
u
: indica l'utente proprietario del fileg
: indica il gruppo proprietarioo
: indica il resto degli utentia
: indica 'all', cioè tutti gli utenti, se non viene specificata una lettera, all è l'opzione di default
e dei caratteri chiave :
+
: aggiunge permessi a quelli pre-esistenti-
: rimuove permessi a quelli pre-esistenti=
: imposta permessi cancellando la configurazione precedente
Vediamo ora alcuni comandi per gestire i permessi in modalità simbolica:
chmod o+r nomeFile
# aggiunge (o elimina nel caso del '-') i
# diritti di lettura o toglierli al resto degli utenti al di
# fuori del proprietario e del gruppo del proprietario
chmod g-r -R nomeDirectory
# rimuove i permessi di lettura al
# gruppo proprietario a tutta la directory nomeDirectory, il flag
# -R viene usato ogni qualvolta dobbiamo gestire i permessi di
# una directory e tutto il suo contenuto, nel caso non mettessimo
# il flag -R, il comando è ancora valido, ma vengono settati solo
# i permessi della directory e non dei file all'interno
chmod +x nomeFile
# imposta i diritti di esecuzione per tuti
# gli utenti
chmod go+w nomeFile
# fornisce i diritti di scrittura sul file
# sia al gruppo proprietario che al resto del mondo
chmod a=rw nomeFile
# cancella tutta la configurazione
# precedente di diritti e assegna esattamente i diritti di
# scrittura e lettura per tutti gli utenti
chmod u+r,g-w filename
# aggiunge all'utente proprietario del
# file i diritti di lettura, e toglie al gruppo proprietario i
# diritti di scrittura
chmod --reference file1 file2
# in realtà questo esempio non
# appartiene a nessuna modalità, serve a copiare i permessi che
# ha il file 1 e applicarli al file2
Un'altra modalità per settare i permessi all'interno di un sistema GNU/Linux, è costituito dalla modalità numerica. Vengono utilizzati dei numeri per rappresentare i permessi, nello specifico, abbiamo:
- 1 -> esecuzione
- 2 -> scrittura
- 4 -> lettura
Infatti attraverso un sistema di numerazione ottale si riescono a rappresentare tutti i permessi:
# | Permessi | rwx |
---|---|---|
7 | lettura+scrittura+esecuzione | 4+2+1 |
6 | lettura+scrittura | 4+2 |
5 | lettura+esecuzione | 4+1 |
4 | lettura | 4 |
3 | scrittura+esecuzione | 2+1 |
2 | scrittura | 2 |
1 | esecuzione | 1 |
0 | nessun permesso | 0 |
Quindi con gruppi da 3 cifre riusciamo anche in questa modalità a impostare i diritti, dove il primo numero rappresenta i diritti del proprietario del file, il secondo numero rappresenta i diritti del gruppo proprietario del file e il terzo numero rappresenta i diritti del resto degli utenti. Vediamo ora alcuni esempi di applicazione della modalità numerica per le impostazioni dei permessi:
chmod 644 nomeFile
# cambia i diritti del file nomeFile,
# impostando lettura+scrittura per il proprietario, e sola
# lettura per il gruppo proprietario e per il resto degli utenti
chmod 771 -R nomeDir
# cambia i diritti della directory
# nomeDir, e di tutto il suo contenuto, impostando i permessi di
# lettura+scrittura+esecuzione per il proprietario e per il
# gruppo del proprietario e i permessi di sola esecuzione per il
# resto degli utenti
chmod 707 -R nomeDir
# cambia i diritti della directory nomeDir
# e di tutto il suo contenuto, impostando i permessi di
# lettura+scrittura+esecuzione per il proprietario e per il resto
# degli utenti al di fuori del gruppo proprietario, mentre il
# gruppo proprietario non ha nessun diritto sulla directory e il
# suo contenuto
Le modalità finora discusse sono quelle più utilizzate nella maggior parte dei casi, ad ogni modo esistono dei cosiddetti " special permission bits" che rappresentano modalità operative aggiuntive più avanzate delle semplici r, w ed x. Queste modalità speciali sono:
- SUID (Set User ID): identificato in modalità simbolica con 's', e in modalità numerica con '4'; mi permette di eseguire un file come se fossi il proprietario del file, ad esempio se questo file richiama o modifica file in cui non ho nessun permesso (ad esempio nella directory /etc/), in questo caso non avrò errori nell'esecuzione in quanto mi verranno dati gli stessi permessi del proprietario su tutti i file su cui opera il file in questione al momento dell'esecuzione
- SGID (Set Group ID): anche in questo caso identificato in modalità simbolica con 's', e in modalità numerica con '2'; mi permette di eseguire un file come se appartenessi al gruppo proprietario del file, ad esempio se questo file richiama o modifica file in cui non ho nessun permesso (ad esempio nella directory /etc/), in questo caso non avrò errori nell'esecuzione in quanto mi verranno dati gli stessi permessi del gruppo proprietario su tutti i file su cui opera il file in questione al momento dell'esecuzione
- t (sticky flag): identificato in modalità simbolica con 't' e in modalità numerica con '1'; è un flag applicabile a directory, quindi non può essere utilizzato su file semplici, se settato rende impossibile la cancellazione dei file all'interno di una directory e della directory stessa, infatti un utente potrebbe anche avere tutti i permessi (lettura+scrittura+esecuzione) per i file all'interno della cartella, ma se questo è settato, non può eliminare nulla.
E' da notare che per utilizzare la modalità numerica, dobbiamo usare una notazione a 4 cifre anzichè 3, dove la prima cifra rappresenta gli special permission bits settati e gli altri 3 rappresentano le classiche cifre dei permessi spiegate nella sezione precedente. Una tabella riassuntiva dei valori che può assumere la prima cifra può essere visionata qui sotto.
# | Permessi | rwx |
---|---|---|
7 | SUID+SGID+Sticky Flag | 4+2+1 |
6 | SUID+SGID | 4+2 |
5 | SUID+Sticky Flag | 4+1 |
4 | SUID | 4 |
3 | Sticky Flag+SGID | 2+1 |
2 | SGID | 2 |
1 | Sticky Flag | 1 |
0 | nessun permesso speciale | 0 |
Vediamo ora alcuni esempi di applicazione sia in modalità simbolica che in modalità numerica dei special permission bits:
chmod u+s myFile
# in questo modo imposto su ON il SUID, cioè
# tutti gli utenti possono eseguire il file come se il fosse il
# proprietario a lanciarlo
un esempio presente di default sui sistemi GNU/Linux è il comando "passwd" che deve operare col file /etc/passwd.
chmod 4666 myFile
# in questo caso imposto ON il SUID e i
# diritti di lettura+scrittura per tutti gli utenti
chmod 6644 myFile
# in questo caso imposto ON sia SUID che SGID
# e i diritti di lettura+scrittura per il proprietario del file e
# i diritti di sola lettura per il resto degli utenti
chmod u-s myFile
# in questo modo imposto su OFF il SUID, cioè
# se tutti gli utenti prima potevano lanciare il file come il
# proprietario, dopo questo comando non possono più
chmod g+s myFile
# in questo modo imposto su ON il GUID, cioè
# tutti gli utenti possono eseguire il file come se
# appartenessero al gruppo proprietario
chmod g-s myFile
# in questo modo imposto su OFF il GUID, cioè
# se tutti gli utenti prima potevano lanciare il file come il
# appartenenti al gruppo proprietario, dopo questo comando non
# possono più
chmod +t myDirectory
# aggiunge lo sticky flag sulla directory
# myDirectory, è da ricordare che questo flag non può essere
# applicato a semplici file ma solo a directory
chmod 1444 myDirectory
# aggiungo lo sticky flag alla directory
# myDirectory e imposto i diritti di lettura per tutti gli utenti
Per visualizzare i permessi, valgono le modalità precedenti, quindi con "ls -l", li visualizzo, ad ogni modo è da notare che:
- il flag 'T' sostituirà la 'x' nel gruppo di utenti 'o' (resto degli utenti)
- il flag 'S' per SUID sostituirà la 'x' nel gruppo di caratteri del proprietario
- il flag 'S' per SGID sostituirà la 'x' nel gruppo di caratteri del gruppo proprietario
Un caso per me curioso fu quando un file all'interno della mia home directory apparteneva a root e aveva i permessi di lettura/scrittura solo per root, quindi con un settaggio dei permessi del tipo:
-rw------- root root
la domanda e' posso eliminare questo file pur non essendo root?
ricordiamo che il suo path e' /home/miahome/nomefile
la risposta e': molto probabilmente si, perche' e' nella nostra
home directory e in quella directory abbiamo permessi di scrittura.
Quando un utente crea un file (o una directory) vengono settati dei permessi di default relativi alla possibilità di lettura, scrittura o esecuzione del file in questione da parte degli utente. I permessi di default possono essere cambiati (o generalmente gestiti) attraverso il comando umask. Lanciando solamente il comando "umask" senza parametri, visualizzo un insieme di cifre che rappresenta i permessi di default sul sistema. Questo gruppo di cifre non è altro che una maschera a cui dobbiamo sottrarre dei valori. Di default i permessi sui file sono settati al valore "0666" e i permessi sulle directory sono settati al valore "0777", e il valore di umask predefinito è " 0022". In questa configurazione predefinita, sottraendo ai permessi di default di file e cartelle il valore di umask, possiamo capire i permessi che verranno attribuiti ai file o alle directory appena create; infatti nel nostro caso dovremo sottrarre sia per i file che per le cartelle il valore di umask, e otteniamo:
umask - valoriDiDefaultPerFile = 0666-0022=0644
# cioè per ogni file creato verranno utilizzati i permessi
# 0644, cioè nessun special permission bits settato, permessi
# di lettura+scrittura per il proprietario e per il gruppo
# proprietario e permessi di sola lettura per il resto degli
# utenti
umask - valoriDiDefaultPerDirectory = 0777-0022=0755
# cioè per ogni directory creata verranno utilizzati i permessi
# 0755, cioè nessun special permission bits settato, permessi
# di lettura+scrittura+esecuzione per il proprietario e per il
# gruppo proprietario e permessi di sola lettura+esecuzione per
# il resto degli utenti
Nel caso volessimo cambiare il valore di umask, possiamo lanciare il comando umask col codice che preferiamo per la maschera, ad esempio:
umask 0014
# in questo caso ho cambiato la maschera a 0014,
# quindi avrò di default per i file i permessi"0652" e per le
# directory "0763"
Due comode umask molto gettonate sono:
umask 022
, utilizzata per fare in modo che tutti gli utenti possano vedere i file e le directory che creoumask 077
, utilizzata per fare in modo che tutti gli altri utenti non possano vedere i file e le directory che creo dobbiamo mettere la umask in uno degli startup files per fare in modo che la modifica sia persistente.