# Introduzione ai permessi

Ogni file su disco é di proprietá di un utente e di un gruppo di utenti e dispone di tre tipi di autorizzazioni:

- per il proprietario
- per il gruppo che possiede il file
- per gli altri

```bash
 > ls -l
total 0
drwxrwxr-x 1 dado dado    0 Jan  5 15:49 Desktop
drwxr-xr-x 1 dado dado   12 Jan  3 22:18 Videos
```

- Il primo carattere, `d`, indica il tipo di file
- I successivi tre, `rwx`, i permessi per il proprietario del file (*user*)
- I successivi tre, `rwx`, i permessi per il gruppo che possiede il file (*group*)
- Gli ultimi tre, `r-x`, indicano i permessi per gli altri (*others*)
- La seconda colonna, `1`, indica il numero di *hard link* che puntano a quel file
- La 5a colonna mostra la dimensione del file
- La 6a la data e l'ora dell'ultima modifica del file

## Tipi di file

- `-`: normal file
- `d`: directory
- `l`: symbolic link
- `b`: block device
- `c`: le porte seriali sono esempi comuni di dispositivi a caratteri
- `s`: i socket servono come tramite per il passaggio di informazioni tra due programmi

## Permessi sui file

- `r`: read, ha un valore ottale di 4. Indica il permesso di aprire un file e leggerne il contenuto
- `w`: write, ha un valore ottale di 2. Indica il permesso di modificare un file
- `x`: execute, con un valore ottale di 1. Permesso di esecuzione del file

## Permessi sulle directory

- `r`: read, ha un valore ottale di 4. Indica il permesso di leggere il contenuto della directory, ma non implica il permesso di leggere i file stessi
- `w`: write, ha un valore ottale di 2. Indica il permesso di creare o eliminare file in una directory o modificarne i nomi, permessi e proprietari. Se un utente ha il permesso di scrittura su una directory, potrá modificare i permessi di *qualsiasi* file (contenuto) nella directory, anche se appartiene ad un altro utente
- `x`: execute, con un valore ottale di 1. Indica il permesso di entrare in una directory, ma non di elencarne il contenuto (necessaria l'autorizzazione `r`).

### Modificare i permessi sui file

Si utilizza il comando `chmod`. Solo il proprietario di un file o l'utente root possono modificare i permessi di un file. É possibile cambiare i permessi con due modalitá:

- simbolica
- ottale

Quando viene eseguito su una directory, vengono modificati solo i permessi di quella specifica directory. Per la modalitá ricorsiva, aggiungere `-R`.

#### Modalitá simbolica

```bash
chmod u[,g,o]+x file
chmod u-r file
chmod u=rwx file
chmod o=rw- file
chmod u+x,g,o+r file

```

dove:

- `u`: user
- `g`: group
- `o`: others
- `+`: concedere un permesso
- `-`: revocare un permesso
- `=`: impostare un set di permessi specifico
- `r` o `w` o `x`: autorizzazione

#### Modalitá ottale

I permessi sono specificati come valore a tre cifre su notazione ottale. Sono specificati nel seguente ordine: r(4)w(2)x(1). Se non ci sono permessi, si usa il valore 0. Quindi il permesso rwx sarebbe 4+2+1=7. La prima lettera indica l'utente, la seconda il gruppo e la terza tutti gli altri.

### Modificare la proprietá di un file

Si usa il comando `chown`:

```bash
chown USER:GROUP file
```

## Gruppi

Per vedere quali gruppi esistono sul sistema: `getent group`. `groups user` per sapere a quali gruppi appartiene un utente. Per sapere quali utenti fanno parte di un gruppo si utilizza il comando: `groupmems -g group -l`.

## Permessi di default

Ogni file o directory che si crea sul filesystem avrá sempre le stesse autorizzazioni. Provengono dalla *user mask* o `umask`, che imposta i permessi predefiniti per ogni file (o directory) creato. Per controllare i valori correnti:

```bash
umask -S
u=rwx,g=rwx,o=rx
```

## Permessi speciali

Ogni file puo' avere anche *tre permessi speciali*.

### Sticky Bit

Chiamato anche *indicatore di cancellazione ristretta*, ha il valore ottale di `1` e in modalitá simbolica viene indicato con una `t` all'interno dei permessi degli *others* (sostituisce la *x* sui permessi degli *altri*). Si applica *solo alle directory* e non ha effetto sui file normali. Impedisce agli utenti di rimuovere o rinominare un file all'interno di quella directory, a meno che non siano proprietari di quel file o directory.

In modalitá ottale i permessi vengono specificati con una notazione a 4 cifre, con la prima che rappresenta il permesso speciale: `chmod 1755 directory/`

### Set GID

Noto anche come *SGID*, ha il valore ottale di `2`  in modalitá simbolica viene indicato con una `s` all'interno dei permessi di *group* (sostituisce la *x* sui permessi del gruppo). Si applica sia ai file eseguibili che alle directory. Sui file, eseguirá il processo coi privilegi del gruppo che possiede il file. Sulle directory, fa in modo che ogni file o subdirectory erediti il gruppo della directory principale.

```bash
chmod 2755 file.sh
chmod g+s file.sh
```

### Set UID

*SUID* o *Set User ID*, ha il valore ottale di `4`  in modalitá simbolica viene indicato con una `s` all'interno dei permessi *utente* (sostituisce la *x* sui permessi dell'utente). Si *applica solo ai file eseguibili* e non ha effetto sulle directory. Sui file, eseguirá il processo coi privilegi dell'utente che possiede il file. 

É possibile combinare le autorizzazioni speciali in un unico parametro: `chmod 6755 file.sh`.