Sicurezza: i permessi di accesso GNU/Linux

Dicembre 2016


Introduzione

Lo scopo di questo articolo non è di insegnare quali permessi dare ai file o directory né perché. L'uso di gestione degli utenti, gruppi o altri e le autorizzazioni concesse dipendono dalla configurazione particolare, la strategia messa in atto da parte dell'amministratore del sistema e le sue esigenze. Ma con l'articolo troverete una breve presentazione dei permessi che il sistema GNU/Linux utilizza e i comandi utilizzati.

Generalità

Nell'ambito di un sistema GNU/Linux tutto è un file, compresi i file speciali che designano i dispositivi. Linux divide i file in diverse categorie:


Directory;

File regolari (programmi, file di configurazione, file di dati, ecc.);

File speciale (carattere o tipo di blocco);

Il file system per GNU/Linux è organizzato in un albero, non c'è bisogno di menzionare il nome del disco o la partizione per accedere.

I Permessi

In un sistema GNU/Linux, ad ogni file vengono assegnati i permessi per 3 identità:

Il proprietario - è l'utente che ha creato il file o l'utente che root ha designato come proprietario;

Il gruppo (non necessariamente il gruppo del proprietario);

Gli altri (quelli che non fanno parte del gruppo);

Il comando
ls -l
ci permette di visualizzare i permessi di un file.

Per ogni identità (vedi sopra), sono 3 i permessi di accesso:

r - read (permesso di lettura);

w - write (permesso di scrittura);

x - execute (permesso di esecuzione);

La visualizzazione dei permessi viene rappresentata da una stringa di 9 caratteri, preceduta da un carattere che rappresenta il tipo di file. Questi 9 caratteri, raggruppati per 3 (rwx rwx rwx) definiscono i permessi delle 3 identità (proprietario, gruppo e altri). Per ogni permesso esistente vi è una lettera tra r, w o x (vedi sopra) e se il permesso non esiste si utilizza il trattino (da non confondere con il primo trattino che significa - file regolare).

Significato      Simbolo    Proprietario      Gruppo    Altri
______________________________________________________________________
file regolare -
directory d
dispositivi carattere c
dispositivi blocco b r w x r w x r w x
link simbolico l
named pipe p
socket locale s
______________________________________________________________________


Esempio

-rwxr-x---

Significa:

Si tratta di un file regolare ( il primo carattere è un trattino -);

Il proprietario ha tutti i permessi (ReadWriteExecute quindi LeggereScrivereEseguire);

I membri del gruppo hanno i permessi di leggere (il 1° carattere è r) e di eseguire (il 3° carattere è x), invece non hanno il permesso de scrivere (il 2° carattere è un trattino -);

Gli altri non hanno nessun permesso, ne leggere, ne scrivere, ne eseguire (i 3 caratteri sono dei trattini -).

I permessi speciali

Lo Sticky bit

Lo Sticky bit è un permesso speciale, il quale comportamento è diverso per i file eseguibili e le directory. Corrisponde alla lettera t (rappresentazione simbolica) o 1000 (rappresentazione digittale). Se i permessi di esecuzione non sono impostati è la lettera T che corrisponde.

I file eseguibili - il programma rimane in memoria per una ulteriore esecuzione;

Le directory - se lo sticky bit è impostato su una directory, solo il proprietario può cancellare i file (è il caso delle directory /tmp e /var/tmp sotto GNU/Linux);

Esempio:
$ ls -l / | grep tmp;ls -l /var | grep tmp
drwxrwxrwt 12 root root 1024 2006-07-22 14:18 tmp
drwxrwxrwt 4 root root 4096 2006-07-22 10:23 tmp

è la visualizzazione dei permessi per /tmp e /var/tmp.
si nota che l'ultimo carattere (n° 9) per i permessi è un "t" e non un "x" o un "-".

SetUID e SetGID

I permessi SetUID e SetGID in GNU/Linux sono rappresentati da:


La lettera s (se il permesso x è posizionato);

La lettera S (se il permesso x non è posizionato).

Numericamente, i permessi SetUID e SetGID sono rappresentati come segue:

4000 - identità del proprietario;

2000 - identità del gruppo;

Il comportamento dei permessi.

Per i file o programmi eseguibili:

SUID = 4000 - il processo ha i permessi del proprietario del programma eseguito;

SGID = 2000 - il processo ha i permessi del gruppo del programma eseguito;

Per le directory:

SGID = 2000 - i file contenuti nella cartella appartengono al gruppo della cartella;

I permessi SetUID e SetGID sono importantissimi per la sicurezza.

Invece di dare accesso ad un file, si dà il permesso di accesso ad un comando. Il kernel (o nucleo), durante l'esecuzione del comando assume l'identità del proprietario o del gruppo del comando invece dell'utente che ha lanciato il comando. Così l'accesso ai file avviene tramite il comando e non direttamente. Quando un utente accede a un sistema GNU/Linux, ottiene 2 UID (UserIDentity) e 2 GID (GroupIDentity), il reale e l'effettivo:

Quando viene eseguito il comando i UID e GID sono i reali, gli effettivi sono assegnati al comando;

Quando i permessi non sono posizionati, allora UID e GID effettivi sono identici ai UID e GID reali;

Se i permessi sono posizionati allora l'UID e/o GID effettivi sono quelli del comando. ciò i UID e GID effettivi sono loro che controllano i permessi d'accesso ad un comando.

Per conoscere i file con permessi SetUID e SetGID sul sistema, digitare in un terminale il comando:

# find / -perm -2000 -o -perm -4000 -exec ls -l {} \; 2>/dev/null


Un buon esempio è il comando crontab. Questo comando crea un file in /var/spool/cron/crontabs per l'utente che ha eseguito il comando crontab. L'accesso alla directory /var/spool/cront/crontabs è vietato agli utenti tranne root:

$ cd /var/spool/cron/crontabs/
bash: cd: /var/spool/cron/crontabs/: Il permesso non è stato concesso


Quando l'utente avvia il comando crontab -e (per modificare suo file /var/spool/cron/crontabs/nome_utente), il comando viene eseguito con l'UID e GID reali dell'utente però con l'UID e GID effettivi di root:

$ ls -l /usr/bin/crontab
-rwxr-sr-x 1 root crontab 26872 2004-07-28 22:44 /usr/bin/crontab


Si nota che il comando crontab è proprietà di root e che fa parte del gruppo crontab con il permesso SGID.

E come root ha permesso di creare in /var/spool/cron/crontabs il file verrà creato:

# ls -l /var/spool/cron/crontabs/nome_utente
-rw------- 1 nome_utente crontab 225 2006-07-22 16:00 /var/spool/cron/crontabs/nome_utente


Si nota che l'utente 'nome_utente' è proprietario del file e ha i permessi di lettura e scrittura. Però non può farlo direttamente.

I comandi

chmod

Il comando chmod (CHangeMODe) consente di definire e modificare i permessi di accesso di un file o un insieme di file. Tra le opzioni del comando chmod (che non sono numerose - vedi man chmod) eccone due:

V per verbose (Visualizzazione sul output standard STDOUT del risultato del comando);

R tratta le cartelle in modalità ricorsiva (applicazione del comando al contenuto intero della cartella)

Ci sono due modi per l'uso del comando chmod: modalità letterale e modalità numerica.

modalità letterale

Se avete letto con attenzione fino ad ora, dovreste indovinare il modo letterale. È l'uso delle lettere che conoscete già r, w e x per specificare i permessi necessari. La novità è che usiamo anche le lettere per indicare l'identità di cui abbiamo discusso in precedenza: il proprietario, il gruppo e gli altri.

chmod utilizza la nozione che segue:

u - per il proprietario (user);

g - per il gruppo (group);

o - per gli altri (other);

a - per tutti (all);

Una seconda nozione verrà usata per assegnare e/o togliere permessi.

+ (più) per assegnare;

- (meno) per togliere;

= (uguale) per fissare l'accesso esatto.

Ecco un schema di costruzione per chmod:


    Identità Operatore Tipo accesso
_____________________________________
u + r
chmod g - w
o = x
a
_____________________________________


Non si può immaginare tutte le possibili combinazioni, anche se sembra possibile dato il numero limitato di operatori e permessi. Ciò che complica le cose è piuttosto il numero di utenti, il numero di file e la loro distribuzione sul disco (dischi) e le partizioni le quale non conosciamo il numero, ecc. Tuttavia alcune regole che ci aiutano nel uso del comando chmod. Possono essere utilizzati diverse identità e tipi di accesso.

Esempio: chmod go-wx file per i membri del gruppo (g) e gli altri (o) si toglie (-) i permessi di scrittura (r) e di esecuzione (x).

Diversi operatori e tipi di accesso possono essere utilizzati.

Esempio: chmod o+r-w file si assegna il permesso di lettura (r) però si toglie il permesso di scrittura (w) per gli altri (o).

Le stringhe possono essere combinati, separati da virgole.

Esempio: chmod u+x,og-w file si assegna (+) permesso di esecuzione (x) per il proprietario (u) e si toglie (-) il permesso di scrittura (r) per i membri del gruppo (g) e gli altri (o). Attenzione! non c'è spazio tra le stringhe separate da virgole.

Per applicare il comando chmod ad una cartella e suo contenuto (sotto cartelle, file) viene utilizzato il comando chmod -R permessi directory.

Quando l'identità viene omessa, il valore per (tutti) che verrà utilizzato:

chmod -R + W cartella.

Il tipo di accesso può essere omesso se il segno uguale (=) è utilizzato per eliminare tutti gli accessi:

chmod o= file.

La modalità numerica

   Proprietario              Gruppo              Altri
_________________________________________________________________________________________
LetturaScritturaEsecuzione LetturaScritturaEsecuzione LetturaScritturaEsecuzione
_________________________________________________________________________________________
400 200 100 40 20 10 4 2 1


Per capire l'utilizzo di chmod in modalità numerica ecco un esempio. Se per esempio volessimo assegnare ad un file i seguenti permessi:

Proprietario

Lettura + scrittura + esecuzione = 400 + 200 +100 = 700

Gruppo

Lettura + esecuzione = 40 + 10 = 50

Gli altri

Lettura + esecuzione = 4 + 1 = 5

700 + 50 + 5 = 755

Ora useremo i risultati ottenuti con chmod.

chmod -v 0755 file o chmod 0755 file

ma in questo caso il risultato del comando non viene visualizzato sul output standard. Si può semplicemente scrivere chmod 755 file. In breve, il principio non è complicato. Stabiliamo i permessi appropriati per ogni identità ed facciamo l'addizione. Per il resto ne prende cura chmod. Ora che abbiamo visto come usare in modalità numerica il comando chmod, suppongo che avreste trovato la risposta ad una domanda alla quale magari avete pensato.

Si tratta dell'assegnazione dei permessi SetUID e SetGID.


SUID SGID Sticky bit
__________________________
4000 2000 1000
__________________________


Per aggiungere i permessi SetUID e SetGI, oltre i permessi abituali, si inserisce nel calcolo il o i permessi SetUID e SetGID.

Prendiamo l'esempio precedente 700 + 50 + 5 = 755. Per aggiungere i permessi di gruppo, scriviamo 2000 + 700 + 50 + 5 = 2755.

Nota Bene: si tratta di permessi per un comando, ciò il permesso d'esecuzione dovrebbe essere posizionato. Per quanto ne so non c'è modo di tornare ai permessi precedenti una volta che il comando venga eseguito.

Un idea assurda sarebbe di salvare prima i permessi esistenti in un file con il comando ls-l e ls-Rl e quindi creare uno script per analizzare questo file, ma sarebbe complicare le cose e in realtà non ho mai avuto bisogno di farlo. Un'altra idea, altrettanto assurda, sarebbe di salvare con tar e poi, se si perde nei permessi, ripristinare la configurazione originale. Quindi prima di cambiare i permessi su un file o un tree, dare un occhiata prima ai permessi già esistenti.

umask

Il comando umask permette di impostare i permessi di default di un file o una cartella alla sua creazione. In altre parole si indica i permessi che devono essere rimossi quando vengono creati. Il comando umask, come il comando chmod (modalità numerica) prende come argomento 3 cifre, che questa volta rappresentano i permessi che non vogliamo assegnare:

$ umask 0022 file

Da sapere,la vita del comando umask è limitata alla sessione shell corrente. Per una durata permanente vedi i file di configurazione della shell. Per le shell bash si può utilizzare il file ~/.bashrc. Personalmente ho usato il comando umask solo per piccoli test nello scopo di capire il comando chmod.

chown

Per modificare il proprietario di un file si utilizza il comando:

chown utente file

chgrp

Per modificare il gruppo di un file si utilizza il comando:

chgrp utente file

Conclusione

La comprensione dei permessi per i file in un sistema GNU/Linux è fortemente associata con la gestione di utenti e gruppi. In aggiunta ai permessi che abbiamo visto in precedenza, in un sistema GNU/Linux vi è anche i ACL (Access Control List) che permettono di concedere ulteriori permessi.

Potrebbe anche interessarti :
Il documento intitolato « Sicurezza: i permessi di accesso GNU/Linux » da CCM (it.ccm.net) è reso disponibile sotto i termini della licenza Creative Commons. È possibile copiare, modificare delle copie di questa pagina, nelle condizioni previste dalla licenza, finché questa nota appaia chiaramente.