Guida I permessi su Unix - quali sono e come gestirli

0xGhost

Helper
22 Febbraio 2022
436
38
318
286
Ultima modifica:
In questo articolo vedremo quali sono e come trattate i permessi su sistemi Unix & Unix-Like ( BSD, Linux, Mac Os [...] )​
copertina.png


Il thread si dividerà in una parte di teoria e una pratica, nella prima spiegheremo il significato di proprietario gruppo, permessi e altro
Nel secondo metteremo in atto quello imparato poco prima, inizieremo a usare comandi come chmod, chown, chgrp [...]

Linux nasce con un concetto multi-users a differenza di Windows, perciò saper gestire i permessi è importante per evitare brutte situazioni.

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 nella shell per avere più informazioni sui file:
Bash:
[[email protected] ~]
% ll
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 9 ( 10 punti, ma il primo indica l'oggetto ) 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 ( gli 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:
[[email protected] ~]
% 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:
[[email protected] ~]
% 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 tuti ( a ) 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 ( tolto usermod ).

2.2    chown, cambiare owner

Con il comando chown si può cambiare owner ( volendo anche gruppo ) di un file/cartella, la sintassi è la seguente:
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 attenzione, solo il gruppo, si potrebbe fare anche con chown, la sintassi è easy:
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.

./ghost​
 
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: 0xGhost
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: 0xGhost