PERMESSI SUI FILE SPIEGATI IN MODO SEMPLICE

GNU/LINUXGUIDESISTEMI E RETI
Permessi File in Linux

Un saluto a tutti i lettori di OpenLinux, oggi parleremo di permessi sui file in Linux, argomento ai più già arcinoto che vi proporrò in forma semplificata.

La gestione dei permessi sui file nei sistemi Linux è un argomento essenziale perché può aiutarci a mantenere il sistema in sicurezza mediante il controllo degli accessi.

Nel presente tutorial ci limiteremo a una serie di concetti base e accenneremo solo in modo sommario alla parte più ostica degli special file permissions SUID, SGID and Sticky Bit e alla gestione e creazione degli account.

I contenuti di questo tutorial sono in parte tratti dal materiale che utilizziamo nel nostro corso Linux e che proponiamo ai nostri soci.

Da quest’anno ne offriamo una versione rivisitata secondo gli obiettivi definiti per la preparazione dell’esame di certificazione LPI Linux Essentials.

Concetti di base

Il comando ls seguito dall’opzione -l (long form) produce in output una lista dettagliata di informazioni associate ai file contenuti all’interno di una directory.

Le informazioni prodotte da ls -l sono strutturate in colonne separate da tabulazione fissa e ciascuna di queste colonne ha un significato preciso.

Da queste informazioni possiamo ricavare in forma simbolica la stringa che rappresenta i permessi applicati ai file.

Esempio pratico

  1. Creiamo da terminale nella cartella di lavoro una directory vuota denominata new_img.
  2. Acquisiamo l’output di ls -l specifico per questo tipo di file (la directory è in effetti un tipo particolare di file, in Linux in senso esteso tutto è rappresentato da un file…)
mkdir new_img
ls -l | grep new_img

La seguente figura rappresenta l’output ottenuto e riporta opportuni commenti esplicativi (lascio al lettore scoprire perché il numero di hardlink è 2 e non 1).

Gerarchia dei permessi

Il sistema di gestione dei permessi sui file è di tipo gerarchico in quanto è strutturato su 3 livelli di accesso:

  • Utente/User (u): il livello di accesso a cui corrisponde il proprietario del file (user)
  • Gruppo/Group (g): il livello di accesso a cui corrispondono tutti i membri del gruppo assegnato al file (group)
  •  Altri/Other (o): il livello di accesso per tutti gli altri utenti del sistema (other)
  • È importante notare che ogni volta che viene creato un nuovo “Utente Ordinario” ad esso è assegnato un gruppo che ha lo stesso nome dell’utente e UID e GID fra loro coincidenti.

Potrete verificare quanto affermato sopra con questa semplice istruzione inserita nel terminale, sostituendo <nomeutente> con il vostro o altro nome utente:

id <nomeutente> | cut -d " " -f 1,2

Nel caso della mia postazione di lavoro, il comando inserito nella shell ha restituito il seguente output:

uid=1000(michele) gid=1000(michele)

Vi faccio notare che in genere sui sistemi Linux esistono oltre all’Utente Ordinario anche altri tipi di Account.

Possiamo fare le seguenti considerazione che sono valide per la gran parte dei sistemi:

  • All’account con UID/GID = 0 è in genere associato l’utente root. root possiede una propria home directory con percorso `/root` e una shell di login valida (in genere bash)
  • Gli account di sistema hanno invece UID < 1000 e non hanno home directory
  • Gli account utente ordinari hanno UID >= 1000 e possiedono una propria home directory `/home/<nomeutente>` e una shell di login valida (in genere bash)
  • Gli account con UID > 1000, comprendono anche gli account di servizio. Questi particolari account  sono creati, in genere, durante l’installazione del sistema o a seguito dell’installazione di alcune tipologie servizi (es. httpd con relativa “home” `/var/www/html`).

Noterai che l’account di servizio a differenza dell’utente ordinario non possiede una shell di login valida.

Lettura, scrittura ed esecuzione

Ad ognuno dei tre livelli di autorizzazione ugo sono assegnati nell’ordine i tre permessi di base:

  • Lettura/read: r (modalità simbolica) a cui corrisponde un indice intero pari a 4 (modalità ottale)
  • Scrittura/write: w (modalità simbolica) a cui corrisponde un indice intero pari a 2 (modalità ottale)
  • Esecuzione/Execute: x (modalità simbolica) a cui corrisponde un indice intero pari a 1 (modalità ottale)

I tre diversi tipi di permesso esplicano la loro azione in modo diverso quando agiscono rispettivamente su file o directory.

Permessi sui file:

  • READ: permette di aprire o leggere un file
  • WRITE: pemette la modifica o l’eliminazione di un file
  • EXECUTE: permette l’esecuzione di file di tipo eseguibile o di uno script

Permessi sulle directory:

  • READ: leggere / elencare i file presenti all’interno della directory (i singoli file possono avere diversi permessi specifici)
  • WRITE: Creare, eliminare permessi e proprietario di qualsiasi file contenuto nella directory
  • EXECUTE: Entrare ed eseguire i file presenti all’interno della directory, ma non di elencarli (è necessario possedere anche READ)

Comandi essenziali per la modifica dei permessi sui file

chmod

Il comando chmod è l’acronimo di “change mode”.

Con chmod è possibile mediante utilizzo di operatori specifici aggiungere (+), togliere (–) o attribuire (=) permessi ai tre livelli ugo (user, group, others) espressi in modalità simbolica.

In alternativa chmod accetta come argomenti 3 cifre numeriche ciascuna composta dalla somma degli indici ottali che corrispondono ai permessi da attribuire nell’ordine ai tre livelli ugo.

Per esempio: alla cifra 7 sono associati i permessi “rwx” ovvero 4+2+1 = 7, alla cifra 4 i soli permessi di lettura in quanto 4+0+0 = 4, ecc.

# Modo Simbolico

chmod u+x mike.sh # aggiunge all'utente il permesso di esecuzione

chmod g-w files.txt # Rimuove dal gruppo il permesso di scrittura

chmod o=r documento.pdf # Imposta per tutti gli altri utenti il permesso di sola lettura

# Modo Numerico

chmod 755 script.sh # equivalente a rwxr-xr-x

chmod 644 file.txt # equivalente a rw-r--r--

es. chmod 644

User Group Other
rw- r– r–
lettura e scrittura lettura lettura
6 (4 + 2 + 0) 4 (4 + 0 + 0) 4 (4 + 0 + 0)

es. chmod 755

User Group Other
rwx r-x r-x
lettura, scrittura ed esecuzione lettura ed esecuzione lettura ed esecuzione
 7 (4 + 2 + 1) 5 (4 + 0 + 1) 5 (4 + 0 + 1)

umask

Come abbiamo già visto, chmod opera sulla modifica dei permessi dei file e delle directory esistenti.

La cosiddetta “maschera dei permessi” manipolata dal comando umask ci permette invece di conoscere o modificare i permessi che verranno applicati a nuovi files e directory creati in seguito.

umask quando utilizzato per manipolare la stringa dei permessi agisce in maniera differente da chmod perché  si comporta come un filtro per sottrazione.

Un valore di umask impostato su 0111, per esempio, modifica la stringa dei permessi da un valore iniziale di 0777 ad un valore finale ridotto a 0666.

# Controllo dell'umask corrente
umask # restituisce per esempio 0022
umask -S # oppure in formato simbolico u=rwx,g=rx,o=rx

# Per impostare una nuova umask
umask 022 # Risulterà in 755 per le directory e 644 per i file

Una trattazione più dettagliata e precisa la trovate a questo link https://wiki.debian.org/it/Permissions.

chown

Il comando chown è l’acronimo di “change owner”

L’uso di chown è fondamentale, perché con questo comando possiamo definire chi possiede il file e di conseguenza limitarne l’accesso agli altri utenti.

Alcuni esempi pratici:

# Change owner
chown peppe file.txt

# Change owner and group
chown peppe:gruppo1 file.txt

# Change ownership ricorsivo sui file di una directory
chown -R peppe:gruppo1 directory/

Utilizzo di su e sudo

Per lavorare sui permessi e sull’ownership dei file potremmo avere bisogno di accedere a file e cartelle con i privilegi di amministratore di sistema.

I comandi sudo e su sono pensati appunto per consentire ad un utente non privilegiato di utilizzare temporaneamente i privilegi di root.

# Passo alla sessione di root
su -

# Eseguo un singolo comando come root
sudo apt update

# Modifico un file di sistema con sudo
sudo nano /etc/hosts

Ricordo ai debian_mannari come me che l’utente predefinito in fase di installazione non è in genere aggiunto al gruppo “sudo”.

Per rendere il vostro utente SUDOERS dovete quindi autenticarvi come root e inserire la seguente istruzione sul terminale:

usermod -aG sudo <username>

Alcuni scenari di utilizzo comuni

Vi lascio a seguire alcuni esempi di utilizzo comune delle tecniche che vi ho illustrato fino ad ora perché è mia intenzione rendervi la vita più semplice.

# Permessi standard su web directory
chmod 755 /var/www/html
chmod 644 /var/www/html/*.html
# Creazione di directory condivise con altri membri di uno stesso gruppo
mkdir /shared
chmod 775 /shared
chown :developers /shared
# Modificare ricorsivamente i permessi delle cartellemkdir /shared
find /percorso/cartella/ -type d -exec chmod UTENTE+/-/=PERMESSI {}

Permessi speciali (sticky bit, Set GID, Set UID)

Per concludere il presente tutorial, come indicato nella parte introduttiva, tratteremo a seguire in modo sommario gli special file permissions SUID, SGID and Sticky Bit.

I permessi speciali possono alterare il modo in cui funziona una directory o come viene eseguito un programma.

In modalità numerica i permessi speciali vengono specificati in notazione a “4 cifre” (es. 1755), quindi di fatto la cifra del permesso speciale viene posta davanti alla tripletta che specifica i permessi “rwx”.

Nella seguente tabella descriviamo quali sono le principali caratteristiche riferite ai permessi speciali.

Nel seguente schema riassumiamo come vengono rappresentati in simboli i “permessi regolari”e i “permessi speciali”.
Permessi File in Linux

Faccio notare che il SUID bit agisce sui permessi di esecuzione.

Nel caso assegnassimo il SUID bit ad un file che non ha i permessi di esecuzione la ‘s’ della rappresentazione simbolica verrà sostituita con una ‘S’ (maiuscola) in quanto seppure il bit è stato assegnato il sistema ci segnala in questo modo che non è attivo.

Lascio al lettore l’onere della prova.