Utenti, gruppi e permessi dei file
Modulo 3: Utenti, permessi e sudo · Tempo di lettura: 12 minuti
Obiettivo della lezione: Dopo questa lezione saprà creare e consultare utenti e gruppi, leggere i permessi di un file o di una cartella in ls -l e impostarli correttamente con chmod e chown, senza spalancare tutto.
Concetti chiave: root (UID 0), utente normale, utente di sistema, /etc/passwd, /etc/shadow, gruppo, adduser, id, rwx, proprietario, gruppo, altri, ottale (644, 755, 600), chmod, chown, umask, setuid, 777
Ognuno è un numero
Linux è stato progettato fin dall'inizio per più utenti sulla stessa macchina. Ogni processo in esecuzione gira per conto di un utente e ogni file ha un proprietario. Per il sistema un utente è soprattutto un numero, lo UID:
- root ha UID 0. Root può fare tutto: leggere e modificare qualsiasi file, fermare qualsiasi servizio, creare qualsiasi utente. Non esiste alcun "è sicuro?".
- Gli utenti normali, come
anna, su Debian e Ubuntu ricevono uno UID a partire da 1000. Possono scrivere nella propria cartella home e poco altro. - Gli utenti di sistema hanno un numero basso e di solito nessuna password e nessuna shell. I servizi girano con un utente di questo tipo: nginx con
www-data, PostgreSQL conpostgres. Se un servizio del genere viene violato, l'intruso ha solo i permessi di quell'utente, non quelli di root.
Chi è Lei, lo vede con id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Anna ha UID 1000, un proprio gruppo anna e fa parte anche dei gruppi sudo e users.
Dove si trovano gli utenti
L'elenco degli utenti si trova in /etc/passwd, una riga per utente:
anna@web1:~$ grep -E '^(root|www-data|anna):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
anna:x:1000:1000:Anna,,,:/home/anna:/bin/bashI campi, separati da due punti: nome, x (la password si trova altrove), UID, gruppo principale, descrizione, cartella home, shell. Per www-data la shell è /usr/sbin/nologin: non è possibile accedere.
Le password vere e proprie si trovano, cifrate (sotto forma di hash), in /etc/shadow. Solo root può leggere quel file. Un ! o un * all'inizio del campo password significa: non è possibile accedere con una password. Per questo root su Ubuntu è bloccato per impostazione predefinita, e su Debian se durante l'installazione non ha indicato una password di root.
Creare utenti e gruppi
Su Debian e Ubuntu si usa il comodo adduser:
root@web1:~# adduser anna
info: Adding user `anna' ...
info: Adding new group `anna' (1000) ...
info: Adding new user `anna' (1000) with group `anna (1000)' ...
info: Creating home directory `/home/anna' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
...adduser crea l'utente, un gruppo proprio con lo stesso nome, una cartella home e chiede una password. Esiste anche il più essenziale useradd (che su AlmaLinux e Rocky Linux è il comando normale), ma senza opzioni fa meno: nessuna password e, su alcuni sistemi, nessuna cartella home.
Un gruppo è un modo per assegnare permessi a più utenti contemporaneamente. Aggiungere un utente a un gruppo:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # uguale, funziona ovunqueFaccia attenzione alla -a in usermod: senza -a sostituisce tutti i gruppi aggiuntivi dell'utente con questo solo gruppo. Un nuovo gruppo vale solo dopo un nuovo accesso.
Bloccare un account senza eliminarlo (per esempio quello di un ex collega):
root@web1:~# usermod -L -e 1 jan-L blocca la password, -e 1 fa scadere l'account. Attenzione: una password bloccata non sempre ferma una chiave SSH. Rimuova quindi anche le chiavi in /home/jan/.ssh/authorized_keys (lezione 2.3); l'account scaduto (-e 1) invece viene rifiutato da sshd.
Leggere i permessi
anna@web1:~$ ls -l /var/www/example.com
total 12
-rw-r--r-- 1 anna www-data 1520 Nov 9 10:12 index.html
-rw-r----- 1 anna www-data 412 Nov 9 10:14 config.php
drwxr-xr-x 2 anna www-data 4096 Nov 9 10:15 images
drwxrwxr-x 2 www-data www-data 4096 Nov 9 10:20 uploadsIl primo blocco di dieci caratteri è la chiave di tutto:
- Carattere 1: il tipo.
-è un file normale,duna cartella (directory),lun collegamento (symlink). - Caratteri da 2 a 4: che cosa può fare il proprietario.
- Caratteri da 5 a 7: che cosa può fare il gruppo.
- Caratteri da 8 a 10: che cosa possono fare gli altri (tutti gli altri).
Seguono il numero di collegamenti, il proprietario, il gruppo, la dimensione e la data.
Per un file le lettere significano:
| Lettera | Significato per un file |
|---|---|
r | leggere |
w | modificare |
x | eseguire come programma o script |
Per una cartella il significato è leggermente diverso:
| Lettera | Significato per una cartella |
|---|---|
r | elencare i nomi dei file nella cartella |
w | creare, rinominare ed eliminare file nella cartella |
x | entrare nella cartella e aprire i file al suo interno |
Quest'ultimo punto sorprende molte persone. Senza x su una cartella non si arriva ai file al suo interno, anche se questi sono leggibili. E chi ha w su una cartella può eliminare i file al suo interno, anche se appartengono a qualcun altro.
Nell'esempio: index.html può essere letto da tutti; config.php (con la password del database) può essere letto e modificato da Anna, il gruppo www-data (cioè il server web) può solo leggerlo e gli altri non possono fare nulla. In uploads il server web può scrivere, perché lì finiscono i file caricati dai visitatori.
I permessi come numero
I permessi vengono spesso scritti come tre cifre, il numero ottale. Ogni lettera ha un valore: r = 4, w = 2, x = 1. Si sommano per ciascun gruppo:
| Permessi | Numero | Uso |
|---|---|---|
rw-r--r-- | 644 | file normale che tutti possono leggere |
rw-r----- | 640 | file per proprietario e gruppo, come una configurazione con una password |
rw------- | 600 | file segreto, come authorized_keys o una chiave privata |
rwxr-xr-x | 755 | cartella o programma che tutti possono usare |
rwx------ | 700 | cartella privata, come ~/.ssh |
Modificare i permessi: chmod e chown
anna@web1:~$ chmod 640 /var/www/example.com/config.php
anna@web1:~$ chmod g+w /var/www/example.com/uploads
root@web1:~# chown anna:www-data /var/www/example.com/config.phpchmod modifica i permessi, con un numero o con lettere (u, g, o per proprietario, gruppo, altri; + o - e la lettera). chown eigenaar:groep modifica proprietario e gruppo; può farlo solo root. Con -R entrambi agiscono su un'intera cartella, ed è lì che spesso le cose vanno storte: chmod -R 644 su una cartella rende inutilizzabili tutte le sottocartelle, perché le cartelle hanno bisogno di x. Per un intero albero usi piuttosto find:
root@web1:~# find /var/www/example.com -type d -exec chmod 755 {} +
root@web1:~# find /var/www/example.com -type f -exec chmod 644 {} +Mai 777
"Non funzionava, allora ho messo 777." 777 significa: chiunque sul server può leggere, modificare ed eseguire questo file. Se un giorno anche un solo servizio o un solo sito web sul Suo server viene compromesso, l'intruso può scrivere ovunque ci sia 777, compresi i Suoi file PHP. Il vero problema è quasi sempre il proprietario o il gruppo: dia al server web, tramite il gruppo, esattamente il permesso di cui ha bisogno, e solo sulla cartella in cui serve.
Permessi predefiniti e bit speciali
I nuovi file ricevono i loro permessi tramite la umask. Con la umask comune 022 i nuovi file diventano 644 e le nuove cartelle 755. La Sua umask la vede con il comando umask.
A volte vede una s al posto di una x, come per /usr/bin/passwd (-rwsr-xr-x). È il bit setuid: il programma gira con i permessi del proprietario (root), anche se lo avvia un utente normale. È necessario per alcuni programmi di sistema, ma non lo imposti mai Lei stesso su uno script. Un file setuid inatteso è un noto segnale di intrusione; con find / -perm -4000 -type f 2>/dev/null li vede tutti.
Su AlmaLinux e Rocky Linux
Lì adduser è un altro nome per useradd; usi useradd -m anna e poi passwd anna. I gruppi si aggiungono con usermod -aG. SELinux aggiunge un ulteriore livello oltre ai permessi di questa lezione: un file con i permessi giusti può comunque essere rifiutato se ha l'etichetta SELinux sbagliata (ls -Z la mostra).
Riepilogo
- Ogni utente ha uno UID; root (0) può fare tutto, i servizi girano con propri utenti di sistema senza shell.
- Gli utenti si trovano in
/etc/passwd, gli hash delle password in/etc/shadow. Crei gli utenti conaddusere aggiunga i gruppi conusermod -aG. ls -lmostra il tipo, i permessi di proprietario, gruppo e altri, e poi proprietario e gruppo. Per una cartellaxsignifica entrare ewcreare ed eliminare file.- Numeri comuni: 644 e 755 per ciò che è pubblico, 640 per configurazioni con segreti, 600 e 700 per ciò che è privato. Mai 777.
- Usi
findper impostare i permessi su un intero albero; tenga d'occhio i file setuid.
Quiz
Esercizio
Esercizio Z3.1: Leggere i permessi. Apra il file di esempio rechten-1.txt: l'output di id per tre utenti e di ls -l in una cartella web. Risponda a ogni domanda indicando chi può fare cosa (per esempio: "il server web può modificare config.php?", "quale file ha permessi troppo ampi?", "quale numero corrisponde a .env?"). Il programma confronta le Sue risposte con la chiave fissa e spiega il perché per ogni domanda.
Per approfondire
I passaggi descritti in questi articoli valgono per i pacchetti di hosting e i VPS di WebOké; con altri fornitori funziona in modo simile.
- Vietato (403): non ha i permessi per accedere a / su questo server
- Accedere al suo VPS con SSH (e creare una chiave SSH)
- Nel corso WordPress: lezione 7.4 "Rendere sicuro il sito: permessi, header e plugin di sicurezza"
- Manuale Debian di adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Manuale Debian di chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
