Guida I permessi su Unix: quali sono e come gestirli

22 Febbraio 2022
475
42
353
350
Ultima modifica:
In questo articolo vedremo quali sono e come trattare i permessi su sistemi Unix & Unix-Like.​
copertina.png







1    Quali sono i permessi e come posso vederli

I permessi si dividono in tre:
  • r (read), permette il diritto di lettura.
  • w (write), permette il diritto di scrittura.
  • x (exec), permette il diritto di esecuzione.
Facciamo ls -l per avere più informazioni sui file:
Bash:
[ghost@hackware ~]
% ll # alias per "ls -l"
total 124
drwxr-xr-x 2 ghost ghost  4096 Jan 18 16:11  Desktop
drwxr-xr-x 2 ghost ghost  4096 Jan 26 20:56  Downloads
drwxr-xr-x 2 ghost ghost  4096 Jan 25 21:34  Telegram
drwxr-xr-x 3 ghost ghost  4096 Jan 26 21:18 'VirtualBox VMs'
drwxr-xr-x 2 ghost ghost  4096 Jan 23 21:13  Wallpapers
-rw-r--r-- 1 ghost ghost 83087 Jan 27 16:48  copertina.png
drwxr-xr-x 2 ghost ghost  4096 Jan 23 14:21  iso
-rwxr-xr-x 1 ghost ghost    27 Jan 27 15:01  listener.sh
-rw-r--r-- 1 ghost ghost    85 Jan 22 19:37  readme.txt
drwxr-xr-x 3 ghost ghost  4096 Jan 23 18:15  rkit
-rw-r--r-- 1 ghost ghost     5 Jan 27 15:10  root.txt
Possiamo notare varie colonne, lasciamo perdere le ultime 5 colonne (dimensione, mese, giorno, ora, file) e concentriamoci sulle prime 4.

1.1    Colonna dei permessi

Si divide in tre ed è composta da 10 punti, ogni tripletta è pensata per il proprietario (la 1°), il gruppo (la 2°), tutti gli altri utenti (la 3°):
  • Il primo elemento indica l'oggetto, se inizia con - è un file, d è una directory, l è un symlink (ln -s src dest).
  • La prima tripletta indica l'owner, nel caso del file readme.txt può essere scritto e letto dall'owner (ghost) (rw-).
  • La seconda tripletta indica il gruppo, riprendendo sempre il file readme.txt gli utenti appartenenti al gruppo ghost potranno leggere solo (r--).
  • La terza e ultima tripletta indica gli others (altri utenti), anche questi hanno solo permessi di lettura (r-- ).
Questo ci può tornare utile anche in altre situa, ad esempio voglio listare tutte le cartelle, faccio ls -l | grep '^d', ossia lista tutto greppando le stringhe che partono per 'd':
Bash:
[ghost@hackware ~]
% ll | grep '^d'
drwxr-xr-x 2 ghost ghost  4096 Jan 18 16:11 Desktop
drwxr-xr-x 2 ghost ghost  4096 Jan 27 18:57 Downloads
drwxr-xr-x 2 ghost ghost  4096 Jan 25 21:34 Telegram
drwxr-xr-x 3 ghost ghost  4096 Jan 26 21:18 VirtualBox VMs
drwxr-xr-x 2 ghost ghost  4096 Jan 23 21:13 Wallpapers
drwxr-xr-x 2 ghost ghost  4096 Jan 23 14:21 iso
drwxr-xr-x 3 ghost ghost  4096 Jan 23 18:15 rkit

1.2    Colonna dell'owner

In questa colonna è specificato l'owner del file, ossia il proprietario, non è per forza il creatore, io potrei creare un file scemochilegge.txt e chownarlo ad un altro utente, cambiando così owner (e volendo anche gruppo), come abbiamo detto l'owner ha permessi di scrittura e lettura, detto ciò può eliminarlo, modificarlo e leggerlo, non lo può eseguire a meno che non aggiunga il parametro x a permessi.

1.3    Colonna del group

Questa colonna specifica il gruppo,
Anche in questo caso il gruppo si può cambiare, vale lo stesso discorso come per l'owner.
Per listare i gruppi possiamo cattare il file /etc/group:
Bash:
[ghost@hackware ~]
% cat /etc/group
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
wheel:x:4:ghost
tty:x:5:ghost
tape:x:6:
daemon:x:7:
floppy:x:8:
disk:x:9:ghost
lp:x:10:
dialout:x:11:
audio:x:12:ghost,_bluez_alsa
video:x:13:ghost
utmp:x:14:
adm:x:15:
cdrom:x:16:
optical:x:17:
mail:x:18:
storage:x:19:
scanner:x:20:
network:x:21:ghost
kvm:x:24:
input:x:25:
plugdev:x:26:
usbmon:x:27:
nogroup:x:99:
users:x:100:
xbuilder:x:101:
_dhcpcd:x:999:
_uuidd:x:998:
dbus:x:22:
ghost:x:1000:
vboxusers:x:997:ghost
bluetooth:x:996:ghost
_bluez_alsa:x:995:
E' diviso in diverse colonne:
  • La prima specifica il nom del gruppo.
  • La seconda specifica se c'è una password.
  • La terza specifica l'id.
  • La quarta gli appartenenti al gruppo.
Ad esempio ghost fa parte dei gruppi vboxusers,bluetooth, network. audio, video, tty, disk e wheel.

Con questa immagine dovrebbe essere un po più chiara la situazione:
schema_ll_permessi.png

2    Gestire i permessi con chmod, chown, chgrp

Adesso vediamo come gestirli tramite i comanidi citati sopra

2.1    chmod

Per modificare i permessi possiamo su file e cartelle possiamo usare chmod, in due sintassi differenti, ottale & simbolica:
Ottale usa i numeri da 0 a 7:

  • 0 - NULL
  • 1 - x (exec)
  • 2 - w (write)
  • 3 - wx (write & exec)
  • 4 - r (read)
  • 5 - rx (read & exec)
  • 6 - rw (read & write)
  • 7 - rwx (read & write & exec)
Ad esempio se volessimo dare tutti i permessi all'owner, al gruppo e others dovremmo fare:
Bash:
chmod 777 listener.sh
Se li volessimo lasciare solo quelli di lettura:
Bash:
chmod 444 listener.sh
Se preferiamo usare la notazione simbolica:
  • a - all
  • g - group
  • o - others
  • u - owner
  • r - read
  • w - write
  • x - exec
  • + - aggiunge un permesso
  • - - leva un permesso
  • = - imposta un permesso
Stesso esempio di prima, vogliamo dare tutti i permessi:
Bash:
chmod a=rwx listener.sh
In pratica abbiao detto a chmod di dare a tutti i permessi di scrittura, lettura ed esecuzione, se volessimo rendere uno script eseguibile dovremmo fare:
Bash:
chmod +x listener.sh
Così facendo abbiamo aggiunto il permesso di esecuzione, possiamo lanciarlo facendo ./listener.sh
Con l'opzione -R, --recursive cambi i permessi di una cartella e di tutto il suo contenuto all'interno, vale anche per tutti gli altri comandi che vedremo.

2.2    chown, cambiare owner

Con il comando chown si può cambiare owner (volendo anche gruppo) di un file/cartella:
Bash:
chown [owner] file # owner
chown [owner]:[group] file # owner & group
Mettiamo caso che abbiamo creato un nuovo utente, ledzeppelin, con il comando:
Bash:
useradd -d /home/ledzeppelin -s /bin/bash ledzeppelin
Normalmente dovrebbe creare la home in automatico, ma non lo fa quindi la creiamo noi con il comando mkdir /home/ledzeppelin, dato che siamo root la cartella appena creata appartiene a root:root invece che ledzeppelin:ledzeppelin:
Bash:
drwx------ 15 ghost ghost 4096 Jan 28 13:48 ghost
drwx------  2 root  root  4096 Jan 28 13:49 ledzeppelin
per fixare questo "problema" usiamo chown:
Bash:
chown ledzeppelin:ledzeppelin /home/ledzeppelin
Ora l'owner e il gruppo sono corretti:
Bash:
drwx------ 15 ghost       ghost       4096 Jan 28 13:48 ghost
drwx------  2 ledzeppelin ledzeppelin 4096 Jan 28 13:49 ledzeppelin

2.3    chgrp, cambiare group

chgrp consente di cambiare il gruppo, non l'owner,, solo il gruppo, si potrebbe fare anche con chown, la sintassi è:
Bash:
chgrp [group] file
Esempio:
Bash:
chgrp root readme.txt
Il file readme.txt ora potrà essere letto da tutti gli appartenenti al gruppo root.

Uscirà un altra guida dove vedremo il SUID (Set User ID) e Sticky bit.
 
Ottimo spiegazione, bel lavoro!

Per modificare i permessi possiamo su file e cartelle possiamo usare chmod, in due sintassi differenti, ottale & simbolica:
Ottale usa i numeri da 0 a 7:

Aggiungo un piccolo trucco: nessuno usa la versione simbolica, si usa quella ottale, che è più facile di quello che sembra.
Basta ricordarsi tre premessi: exec (1), write (2), read (4).

Tutti gli altri vengono fuori sommando questi tre. Read and write? 2+4=6
 
  • Mi piace
Reazioni: hackynonpointer
Ottimo spiegazione, bel lavoro!
Grazie!
Aggiungo un piccolo trucco: nessuno usa la versione simbolica, si usa quella ottale, che è più facile di quello che sembra.
Basta ricordarsi tre premessi: exec (1), write (2), read (4).

Tutti gli altri vengono fuori sommando questi tre. Read and write? 2+4=6
Vero, sono rimasto invariabile senza dire cosa preferivo se ottale o simbolica, personalmente io le uso entrambe, se devo dare solo i permessi di exec ad esempio ad un file .sh uso la notazione simbolica ( +x ).
 
Grazie!

Vero, sono rimasto invariabile senza dire cosa preferivo se ottale o simbolica, personalmente io le uso entrambe, se devo dare solo i permessi di exec ad esempio ad un file .sh uso la notazione simbolica ( +x ).
Hai ragione, `chmod +x` è decisamente usata, stavo pensando che non ho mai visto nessuno fare `chmod a=rwx -R /` in frustrazione :D
 
  • Incredibile
Reazioni: hackynonpointer