[Sicurezza] I permessi di accesso GNU/Linux

Ultimo aggiornamento 8 ottobre 2009 alle 16:31 da n00r
Pubblicato da n00r

I permessi di accesso





Prefazione


Lo scopo di questo articolo non è quello di insegnare quali diritti dare ai file o directory ne 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 vostre esigenze.
Ma con l'articolo troverete una breve presentazione dei diritti che il sistema GNU/Linux utilizza e i comandi utilizzati.

I. 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 è organizzata in un albero, non c'è bisogno di menzionare il nome del disco o la partizione per accedere.

II. I Permessi (Diritti)


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 sotto GNU/Linux.

Per ogni identità (vedi sopra), ci 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 è un permesso non esiste si utilizza il trattino (da non confondere con il 1° 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 -)

III. I permessi speciali


1. 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 ottale).
Se i permessi di esecuzione non sono impostati è la lettera T che corrisponde.
  • I file eseguibili - il programma rimane in memoria per la 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 diritti per /tmp e /var/tmp.
si nota che l'ultimo carattere (n° 9) per i diritti è un "t" e non un "x" o un "-" .

2. 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 lo 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 che segue:
# 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/lami20j
-rw------- 1 lami20j crontab 225 2006-07-22 16:00 /var/spool/cron/crontabs/lami20j
Si nota che l'utente lami20j è proprietario del file e ha i permessi di lettura e scrittura. Però non può farlo direttamente.

IV. I comandi


1. 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
  •   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 diritti 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.
  • + (plus) 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.
  • diverse identità e tipi di accesso possono essere utilizzati.


      Es: 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.
    •   Es : 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.
    • Es : 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



Astuzie :
  • 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 signale uguale (=) è utilizza 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.

Esempio : Vogliamo 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! 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.

2. 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.

La comprensione dei permessi per i file in un sistema GNU/Linux è fortemente associata con la gestione di utenti e gruppi.

In aggiunta ai diritti che abbiamo visto in precedenza, in un sistema GNU/Linux vi è anche i ACL (Access Control List) che permettono di concedere ulteriori permessi, che sono descritte in dettaglio in un'altra FAQ. [Link in allestimento]


____________________________
    
Nota: L'articolo originale è stato scritto da lami20j contribuente di CommentCaMarche