# Permessi (informatica)

I permessi, in informatica, indicano le autorizzazioni per l'accesso a file e directory del file system del sistema da parte dei vari utenti in un sistema operativo multiutente.
I sistemi di tipo Unix e Unix-like, essendo stati tra i primi sistemi multiutente, possiedono un proprio meccanismo tradizionale di permessi memorizzati nel file system, tipicamente assegnato/modificato da un amministratore di sistema.

## Permessi tradizionali Unix

Nei sistemi Unix e Unix-like vi sono dei permessi di base o attributi per file e directory che sono applicabili a tre classi distinte, dette utente (o proprietario), gruppo e altri. Vi sono poi ulteriori permessi che si applicano globalmente al file o alla directory.
Questi permessi sono associati all'inode che rappresenta i dati del file o della directory, e non al nome del file, per cui due o più collegamenti fisici allo stesso inode avranno necessariamente gli stessi permessi, anche se collocati in directory diverse.

### Classi

Gli utenti di ciascun file directory appartengono a tre classi utente: esse sono dette proprietario, gruppo di appartenenza e altri. Pertanto, ad ogni file o cartella è possibile associare i diversi permessi di base (scrittura, lettura, esecuzione) relativamente a ciascuna di queste tre classi di utenti:
* proprietario (solitamente, il suo creatore): per tale utente si applica la classe di permessi detta utente;
* gruppo di appartenenza (solitamente, il gruppo principale del suo creatore): agli utenti che non sono proprietari del file, ma che sono membri del gruppo di appartenenza del file, si applica la classe di permessi detta gruppo. A tal proposito, si ricorda che mentre un file appartiene esattamente ad un gruppo di utenti, un utente del sistema può essere membro di uno o più gruppi (di cui uno è detto principale mentre gli altri sono detti supplementari);
* per tutti gli altri utenti che non ricadono nei due casi sopra elencati si applica, invece, la classe di permessi detta altri.
I permessi ulteriori sono applicati indipendentemente dalla classe.
Con il comando ls -l <percorso/nome_file> riepilogando ad esempio si possono ottenere le seguenti informazioni sui permessi:
* drwxrwxrwx - Segnala che il file è una directory (il tipo di file viene indicato prima delle classi);
* -rwxrwxrwx - Gli attributi evidenziati si riferiscono all'utente proprietario del file;
* -rwxrwxrwx - Gli attributi evidenziati si riferiscono al gruppo di cui l'utente fa parte (se non è il proprietario del file, ma fa parte del gruppo di utenti assegnato al file);
* -rwxrwxrwx - Gli attributi evidenziati si riferiscono a tutti gli altri utenti o gruppi che non sono quelli assegnati al file.

### Permessi di base

I permessi di base, che si applicano ai file e cartelle nell'ambito delle tre classi utente sopra elencate, sono:
* lettura (r) – applicato ai file permette di leggerne il contenuto; applicato alle directory consente di elencare i nomi dei file e delle sottodirectory che contengono;
* scrittura (w) – applicato ai file permette di modificarne il contenuto; applicato alle directory permette di aggiungere o rimuovere in esse dei file e altre sottodirectory; da notare quindi che non sono i permessi su un file a determinare se esso può essere cancellato, ma sono i permessi sulla directory che lo contiene a farlo;
* esecuzione (x) – applicato ai file permette di eseguirli; applicato alle directory permette di attraversarle per accedere ai file ed alle sottodirectory in esse contenute (ma non di elencarne il contenuto, per il quale serve anche il permesso di lettura).

### Altri permessi

Oltre ai permessi di base i sistemi Unix hanno altri tre permessi che si applicano globalmente al file o directory, in maniera indipendente dalla classe:
* set user ID, detto anche setuid o suid: quando è applicato ad un file che ha il permesso di esecuzione (un file eseguibile), indica che esso va eseguito con i privilegi dell'utente proprietario del file anziché con quelli dell'utente che lo avvia; viene comunemente usato per consentire ad utenti ordinari di eseguire programmi che richiedono particolari privilegi di sistema di cui normalmente dispone solo l'amministratore. Viene rappresentato con s o S, vedi rappresentazione simbolica per maggiori informazioni;
* set group ID, detto anche setgid: quando è applicato ad un file che ha il permesso di esecuzione (un file eseguibile), indica che esso va eseguito con i permessi del gruppo assegnato al file anziché quelli del gruppo principale dell'utente che lo avvia. Applicato alle directory indica che i nuovi file e sottodirectory creati al loro interno avranno come gruppo assegnato quello della directory che li contiene anziché quello principale dell'utente che crea il file o la directory. Viene rappresentato con s o S, vedi rappresentazione simbolica per maggiori informazioni;
* sticky: un tempo, quando applicato ai file eseguibili, suggeriva al kernel di mantenere nel file di swap una copia del file eseguibile anche dopo che era terminato, in modo da sveltirne gli avvii successivi. Oggi tale suggerimento viene generalmente ignorato. Quando è applicato ad una directory indica invece che i file in essa contenuti possono essere cancellati e spostati solamente dagli utenti che ne sono proprietari, o dall'utente proprietario della directory che li contiene, o ancora dal superuser (root); è il caso ad esempio delle directory /tmp e /var/tmp, dove tutti gli utenti debbono poter creare e modificare dei file, ma nessuno eccetto il superuser deve poter rimuovere o spostare file temporanei di altri utenti. Viene rappresentato con t o T, vedi rappresentazione simbolica per maggiori informazioni;

### Permessi dei collegamenti simbolici

I collegamenti simbolici non hanno mai permessi propri, essendo solo riferimenti per nome ad un altro file, e a tutti gli effetti si può considerare che abbiano i permessi del file o della directory a cui si riferiscono.
È al limite possibile, in alcuni sistemi, dare opzioni per il cambiamento ricorsivo dei permessi seguendo anche i collegamenti simbolici.

## Rappresentazione dei permessi

Esistono due rappresentazioni dei permessi sopra descritti: una simbolica ed una ottale.

### Rappresentazione simbolica

Si tratta della rappresentazione usata dal comando ls -l, e consiste in una serie di 10 caratteri.
Il primo carattere indica il tipo di file o directory elencata, e non rappresenta propriamente un permesso:
* - – file regolare
* d – directory
* b – dispositivo a blocchi
* c – dispositivo a caratteri
* l – collegamento simbolico
* p – named pipe
* s – socket in dominio Unix
Ad esso seguono tre serie di tre caratteri ciascuna. Ogni serie rappresenta una classe di permessi, rispettivamente per il proprietario, per il gruppo e per gli altri:
* r – lettura
* w – scrittura
* x – esecuzione (o attraversabilità per le directory)
* - – indica l'assenza del permesso corrispondente
Gli altri permessi sono rappresentati con delle varianti all'interno delle tre classi, sebbene essi non siano applicabili per classe:
* nella prima classe (quella che denota i permessi per il proprietario) il permesso di esecuzione può anche essere indicato come
** s ( minuscolo ) quando sono presenti sia il permesso set user ID che quello di esecuzione
*** -rws------
** S ( maiuscolo ) quando è presente solo il permesso set user ID
*** -rwS------
* nella seconda classe (quella che denota i permessi per il gruppo) il permesso di esecuzione può anche essere indicato come
** s ( minuscolo ) quando sono presenti sia il permesso set group ID che quello di esecuzione
*** ----rws---
** S ( maiuscolo ) quando è presente solo il permesso set group ID
*** ----rwS---
* nella terza classe (quella che denota i permessi per gli altri) il permesso di esecuzione può anche essere indicato come
** t ( minuscolo ) quando sono presenti sia il permesso sticky che quello di esecuzione
*** --------t
** T ( maiuscolo ) quando è presente solo il permesso sticky
*** --------T

#### Esempi

* drwxr-xr-x indica una directory leggibile, scrivibile e attraversabile dal proprietario, leggibile e attraversabile per il gruppo e per gli altri.
* drwx------ indica una directory leggibile, scrivibile e attraversabile dal proprietario, ma inaccessibile per tutti gli altri.
* drwxrwxrwt indica una directory leggibile, scrivibile e attraversabile da tutti e con il permesso sticky.
* -rw------- indica un file leggibile e scrivibile solo dal proprietario
* -rw-r--r-- indica un file leggibile da tutti, ma scrivibile solo dal proprietario
* -------r-- indica un file leggibile da tutti eccetto il proprietario e gli utenti appartenenti al gruppo di utenti assegnato al file.
* -r-sr-xr-x indica un file eseguibile leggibile ed eseguibile da tutti con anche il permesso speciale set user ID.
* -r-Sr--r-- indica un file leggibile da tutti con anche il permesso speciale set user ID ma senza il permesso di esecuzione.
* drwxrws--- indica una directory leggibile, scrivibile e attraversabile dal proprietario e dal gruppo di utenti assegnato alla directory, con anche il permesso speciale set group ID.

### Rappresentazione ottale

La rappresentazione ottale dei permessi consiste in un numero di quattro cifre in base otto (da 0 a 7). Tutte le cifre eccetto l'ultima possono essere omesse, e si considerano pari a zero. Ad esempio "750" equivale a "0750", mentre "5" equivale a "0005".
L'ultima cifra rappresenta la classe di permessi per gli altri, la penultima cifra la classe di permessi per il gruppo, la terzultima cifra rappresenta la classe di permessi per il proprietario, e la quartultima cifra rappresenta gli altri permessi. Solitamente si specificano numeri di tre o quattro cifre.
Ai permessi di lettura, scrittura ed esecuzione sono assegnati dei numeri:
* 4 – lettura
* 2 – scrittura
* 1 – esecuzione
e la somma dei permessi abilitati denota la cifra da usare per la particolare classe di permessi (ultima, penultima e terzultima cifra), ovvero:
| Cifra | simboli | Permessi |
| 0 | --- | nessun permesso |
| 1 | --x | esecuzione |
| 2 | -w- | scrittura |
| 3 | -wx | scrittura ed esecuzione |
| 4 | r-- | lettura |
| 5 | r-x | lettura ed esecuzione |
| 6 | rw- | lettura e scrittura |
| 7 | rwx | lettura, scrittura, esecuzione |
Anche agli altri permessi viene assegnato un numero:
* 4 – set user ID
* 2 – set group ID
* 1 – sticky
e anche qui la somma dei permessi abilitati denota la quartultima cifra.
| Cifra | Rappresentazione simbolica | Permessi |
| 0 | | nessun ulteriore permesso |
| 1 | --------t | sticky |
| 2 | -----s--- | set group ID |
| 3 | -----s--t | sticky e set group ID |
| 4 | --s------ | set user ID |
| 5 | --s-----t | set user ID e sticky |
| 6 | --s--s--- | set user ID e set group ID |
| 7 | --s--s--t | set user ID, set group ID e sticky |
Da notare che i numeri derivano dalla notazione binaria, in cui ad ogni permesso corrisponde un singolo bit (per un totale di 12 bit), che è impostato a 1 se il permesso è concesso oppure a 0 se è negato.
| | Altri permessi | Altri permessi | Altri permessi | Permessi | Permessi | Permessi | Permessi | Permessi | Permessi | Permessi | Permessi | Permessi |
| | Altri permessi | Altri permessi | Altri permessi | proprietario | proprietario | proprietario | gruppo | gruppo | gruppo | altri | altri | altri |
| | set user ID | set group ID | sticky | lettura | scrittura | esecuzione | lettura | scrittura | esecuzione | lettura | scrittura | esecuzione |
| Bit | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
| Cifre ottali | N | Permessi | Permessi | N | Permessi | Permessi | N | Permessi | Permessi | N | Permessi | Permessi |
| Cifre ottali | 0 | nessun permesso | nessun permesso | 0 | nessun permesso | nessun permesso | 0 | nessun permesso | nessun permesso | 0 | nessun permesso | nessun permesso |
| Cifre ottali | 1 | sticky | sticky | 1 | esecuzione | esecuzione | 1 | esecuzione | esecuzione | 1 | esecuzione | esecuzione |
| Cifre ottali | 2 | set group ID | set group ID | 2 | scrittura | scrittura | 2 | scrittura | scrittura | 2 | scrittura | scrittura |
| Cifre ottali | 3 | set group ID e sticky | set group ID e sticky | 3 | scrittura ed esecuzione | scrittura ed esecuzione | 3 | scrittura ed esecuzione | scrittura ed esecuzione | 3 | scrittura ed esecuzione | scrittura ed esecuzione |
| Cifre ottali | 4 | set user ID | set user ID | 4 | lettura | lettura | 4 | lettura | lettura | 4 | lettura | lettura |
| Cifre ottali | 5 | set user ID e sticky | set user ID e sticky | 5 | lettura ed esecuzione | lettura ed esecuzione | 5 | lettura ed esecuzione | lettura ed esecuzione | 5 | lettura ed esecuzione | lettura ed esecuzione |
| Cifre ottali | 6 | set user ID e set group ID | set user ID e set group ID | 6 | lettura e scrittura | lettura e scrittura | 6 | lettura e scrittura | lettura e scrittura | 6 | lettura e scrittura | lettura e scrittura |
| Cifre ottali | 7 | set user ID, set group ID e sticky | set user ID, set group ID e sticky | 7 | lettura, scrittura, esecuzione | lettura, scrittura, esecuzione | 7 | lettura, scrittura, esecuzione | lettura, scrittura, esecuzione | 7 | lettura, scrittura, esecuzione | lettura, scrittura, esecuzione |
Ad esempio un permesso 755 (in binario 000111101101) imposta lettura, scrittura ed esecuzione (7) per il proprietario (prima cifra), e lettura ed esecuzione (i due 5) per gruppo (seconda cifra) ed altri (terza cifra).
In certa documentazione è possibile siano specificate cinque cifre, la prima delle quali è però sempre zero, secondo la convenzione del linguaggio C per cui un numero ottale va indicato precedendolo da uno zero.

#### Esempi

* 750 (equivalente a 0750) – Indica lettura, scrittura ed esecuzione per il proprietario (4 + 2 + 1 = 7), lettura ed esecuzione per il gruppo (4 + 1 = 5), nessun permesso per gli altri, nessun ulteriore permesso.
* 50 (equivalente a 0050) – Indica nessun permesso per il proprietario, lettura ed esecuzione per il gruppo (4 + 1 = 5), nessun permesso per gli altri, nessun ulteriore permesso.
* 5750 – Indica il permesso set user ID ed il permesso sticky (4 + 1 = 5), lettura, scrittura ed esecuzione per il proprietario, lettura ed esecuzione per il gruppo, nessun permesso per gli altri.

## Permessi per file system non Unix

Con l'andare del tempo i vari sistemi Unix e Unix-like hanno gradualmente acquisito la possibilità di accedere a file system che non hanno un supporto nativo per lo schema di permessi sopra descritto.
In alcuni casi è stato possibile progettare delle estensioni al file system in modo da poter offrire anche questo tipo di supporto in maniera trasparente, come ad esempio nel caso delle estensioni Rock Ridge per il file system ISO 9660.
In molti altri casi, come ad esempio per i file system di tipo FAT e NTFS, si è ricorso ad una assegnazione di permessi, proprietario e gruppo secondo delle regole generalizzate che valgono per tutti i file e directory contenute, e che non sono memorizzate nel file system stesso. In casi come questi non è tipicamente possibile modificare individualmente i permessi di singoli file e directory.