OsGate.org Logo

Permessi su file e directory - file directory permissions

System System

Date 29.04.2010

Visits 3352

"All'interno di un sistema UNIX svolgono un ruolo importante i permessi che possiamo applicare a tutti i file del sistema. In questo articolo vedremo brevemente come gestirli."

Inode

Per comprendere meglio la gestione dei file e delle cartelle, partiremo con lo spiegare cos'è un inode.

Un inode (index node) è una struttura di dati, che serve a contenere alcune informazioni basilari su ogni singolo file che viene scritto sul filesystem. Ogni inode è identificato sul filesystem con un numero univoco, un inode number.

In un inode sono presenti le seguenti informazioni principali sui file (metadata):

  • dimensione
  • posizione sul disco
  • l'ID dell'utente e l'ID del gruppo
  • informazione sui tempi di creazione, modifica e accesso
  • i permessi lettura scrittura ed esecuzione

Dunque gli inode contengono informazioni fondamentali su file e cartelle. Inoltre contengono specialmente i  permessi relativi al file che andremo ad analizzare nel resto dell'articolo.

Visualizzazione permessi

Nei sistemi UNIX il modo più facile di visualizzar e i permessi su un rispettivo file o cartella è utilizzando il comando "ls -l", che serve per elencare la lista di tutti i file e le cartelle presenti nella cartella attuale in modo dettagliato.

bash-3.1# ls -l
total 52880
-rw-r--r-- 1 root root 560537 2008-11-09 20:14 Canzone.mp3
-rw-r--r-- 1 root root 9643 2008-11-09 20:15 Documento.odt
-rw-r--r-- 1 root root 42 2008-11-09 20:17 Sito.html
-rw-r--r-- 1 root root 4845568 2008-11-09 20:16 Video.mpg
drwxr-xr-x 2 root root 4096 2008-11-09 20:53 cartella

Così facendo possiamo visualizzare i permessi presenti sul file, visibili nella prima colonna, l'utente ed il gruppo d'appartenenza, visibili nella terza e quarta colonna.

Se volessimo per esempio visualizzare la lista dei file in una cartella che non sia quella dove ci troviamo attualmente, basterà digitare:

bash-3.1# ls -l /parent/child

Struttura dei permessi

I permessi sono suddivisi in tre sezioni principali:

  • permessi per l'utente, rappresentabile con la lettera "u"
  • permessi per il gruppo, rappresentabile con la lettera "g"
  • permessi per gli altri, che non rientrano ne nei gruppi ne negli utenti, rappresentabile con la lettera "o"

Per ognuna di queste sezioni è possibile assegnare i seguenti tipi di permessi base:

  • lettura (r), utilizzato per leggere i file e per listare i contenuti delle directory
  • scrittura (w), utilizzato per modificare un file e per aggiungere e rimuovere file nelle directory
  • esecuzione (x), utilizzato per eseguire un file e per rendere una directory accessibile

Ecco dunque la spiegazione per esempio di "-rwxr-xr-x".

Il primo carattere, non è un permesso ma rappresenta il tipo di file elencato, i valori che può assumere sono i seguenti:

Valore Significato
- file regolare come per esempio uno script o un file mp3
d directory (/home/myuser/)
b dispositivo a blocchi come un hard disk (/dev/sda)
c dispositivo a caratteri come le porte seriali
l link simbolico
p named pipe
s socket come /var/run/acpid.socket

Gli altri caratteri, presi a gruppi di tre, sono i set di permessi dell'utente, del gruppo e del resto del mondo.

Ovviamente i permessi si possono mescolare a seconda delle esigenze:

  • -rwx------
  • dr-r--r--
  • -rwxrwxrwx
    • ecc, ecc, ...

Rappresentazione ottale

I permessi nei sistemi UNIX sono rappresentati attraverso il sistema ottale, ecco una veloce spiegazione del funzionamento di questo sistema. Iniziamo col dire che ogni tipo di permesso (scrittura, lettura, esecuzione), possiede una cifra nella rappresentazione ottale che lo identifica:

lettura 4
scrittura 2
esecuzione 1

Ammettiamo di impostare i permessi su un file attraverso il comando chmod (che vedremo in seguito) in lettura e scrittura per l'utente, in esecuzione per il gruppo ed in scrittura per gli altri utenti, dunque utilizzeremo questa numerazione: 621. Come possiamo vedere i permessi si possono sommare tra di loro fino a raggiungere "il set" di permessi desiderati.

Ora dobbiamo suddividere ogni cifra del numero 621 in 3 bit, come specificato nel sistema ottale. La tabella seguente mostra il risultato del procedimento.

Rappresentazione Valori
Fattori 2x (22, 21,20) 421 421 421
Binaria 1/0 110 010 001
Decimale 6 2 1

Rappresentazione scritta

Un altro modo per impostare i permessi è usando la rappresentazione scritta. Questo metodo è più facile da utilizzare rispetto al precedente.

Vediamo qualche esempio:

chmod ugo+rw /home/user/*

Con questi parametri impostiamo i permesso in lettura e scrittura per l'utente, il gruppo ed il resto del mondo.

chmod ug-x /home/user/script.sh

Qui invece togliamo il permesso di esecuzione all'utente ed al gruppo.

Usando questa modalità è necessario specificare a sinistra le entità che verranno interessate dal cambio dei permessi, al centro il simbolo "+" che aggiunge i permessi o il simbolo "-" che li sottrae ed infine a destra, bisogna scrivere i permessi da applicare come "x", che è il permesso di esecuzione e via dicendo.

Permessi addizionali

Set UID, Set GID

In alcuni casi particolari, il permesso di esecuzione può assumere altri due valori oltre a "x" e "-", questi due valori sono rappresentati dalle lettere "s" e "S".

Questo permesso speciale è chiamatto setuid (Set UID). Tramite questo permesso chi esegue per esempio uno script o un file binario, avrà per la durata di esecuzione di quest'ultimo i permessi dell'utente detentore di essi.

La differenza tra la "s" minuscola e la "S" maiuscola sta nel fatto che per la prima il permesso d'esecuzione sul file è già stato impostato, mentre per la seconda non è ancora stato impostato niente (quindi in precedenza avevamo un "-").

Vediamo il funzionamento con un paio d'esempi.

#Visualizziamo i permessi sul file
bash-3.1# ls -l
-rwxrw---- 1 mark users 42 2008-11-09 20:17 script.sh
#Impostiamo il permesso speciale, detto anche setuid (Set UID) sull'utente
bash-3.1# chmod u+s script.sh
#Visualizziamo i nuovi permessi
bash-3.1# ls -l
-rwsr-xr-x 1 mark users 42 2008-11-09 20:17 script.sh

Ora abbiamo impostato setuid sul file.

In questo modo chi eseguirà il file script.sh, per tutta la durata dell'esecuzione dello stesso, avrà come UID effettivo quello dell'utente mark. La stessa cosa avviene se impostiamo un GID sul file, solo che al posto dell'UID avremo impostato il GID.

Sarà in ogni caso possibile risalire al vero UID o al vero GID all'interno del programma tramite la chiamata di sistema getuid() e getgid(). La chiamata di sistema per risalire al UID o GID effettivo è geteuid() e getegid().

Questi permessi speciali sono usati su eseguibili comuni, come per esempio ping o mount, dove per esempio un utente assume l'UID dell'utente root temporaneamente per eseguire tutte le funzioni del programma.

Bisogna in tutti casi non trascurare l'aspetto sicurezza, dato che se questi due permessi vengono gestiti in malo modo, possono rappresentare un vero e proprio attentato alla sicurezza del sistema. Meglio usarli solo quando sono veramente indispensabili o rappresentano l'unica risorsa.

Per le directory il comportamento di questi permessi è differente. Il permesso Set-UID non ha effetto sulle directory, pertanto se viene settato su una directory verrà ignorato.

Il permesso Set-GID invece ha un funzionamento differente rispetto al normale. Se impostato su una directory, farà sì che il gruppo d'appartenenza degli oggetti nella gerarchia sottostante sia quello impostato sulla directory padre e non quello a cui appartiene l'utente che ha creato la cartella.

Sticky bit

Originariamente lo Sticky Bit era utilizzato per forzare i programmi a restare nello spazio di swap anche dopo la loro chiusura. Questo velocizzava in maniera notevole l'avvio dei programmi precedentemente eseguiti. Con l'avvento dei sistemi moderni, e attraverso il Direct Memory Access (DMA), la velocità di esecuzione dei programmi con lo sticky bit venne a mancare.

Nei sistemi recenti questo permesso viene utilizzato sulle directory per permettere a molteplici utenti di un sistema di poter operare sui file all'interno di una directory evitando che altri utenti possano eliminare i file creati da noi stessi. In poche parole permette di condividere una cartella tra utenti differenti, ma solo chi è il creatore del file può eliminarlo nonostante gli altri utenti abbiano tutti i permessi necessari per eliminare il file.

Se una cartella ha lo sticky bit si possono eliminare i file al suo interno solo se si verificano le seguenti condizioni:

  • l'utente è il proprietario del file
  • l'utente è il proprietario della cartella
  • l'utente è root

Lo sticky bit è impostato normalmente sulla directory /tmp, dove si necessita la creazione di file apparenenti a più utenti, ma si vuole ovviamente evitare che i file al suo interno vengano cancellati dagli altri utenti.

Ecco la cartella l'output di ls -ld /tmp:

drwxrwxrwt 40 root root 12288 2008-12-01 21:37 /tmp

Lo sticky bit, è rappresentato con la lettera t se sulla cartella è impostato il permesso di esecuzione, T se non è impostato il permesso di esecuzione.

Comandi utili

Alcuni comandi utili per gestire i file e le cartelle sono disponibili ai seguenti links: