5.1 Lezione 1
Certificazione: |
Linux Essentials |
---|---|
Versione: |
1.6 |
Argomento: |
5 Sicurezza e Permessi sui File |
Obiettivo: |
5.1 Sicurezza di Base e Identificazione dei Tipi di Utente |
Lezione: |
1 di 1 |
Introduzione
Questa lezione tratta la terminologia di base degli account, il controllo degli accessi e la sicurezza dei sistemi Linux locali, gli strumenti della Command Line Interface (CLI) in un sistema Linux per i controlli degli accessi per la sicurezza di base e i file principali per gli account utente e di gruppo, inclusi quelli utilizzati per l’escalation dei privilegi di base.
La sicurezza di base nei sistemi Linux deriva dai controlli d’accesso Unix che, nonostante abbiano quasi cinquant’anni, sono molto efficaci in confronto ad alcuni popolari sistemi operativi di livello consumer molto più recenti. Alcuni altri popolari sistemi operativi basati su Unix tendono a “prendersi delle libertà” in termini di “facilità di accesso”, ma Linux no.
I moderni ambienti desktop Linux e le relative interfacce semplificano la creazione e la gestione degli utenti e spesso automatizzano l’assegnazione dei controlli di accesso quando un utente effettua il login, per esempio al display, all’audio e ad altri servizi, senza richiedere praticamente alcun intervento manuale da parte dell’amministratore di sistema. Tuttavia è importante comprendere i concetti di base del sistema operativo Linux sottostante.
Account
La sicurezza comprende molti concetti: uno dei più comuni è il concetto generale di controllo degli accessi. Prima di poter affrontare i controlli di accesso ai file come ownership e autorizzazioni, è necessario comprendere i concetti base relativi agli account utente Linux, che sono suddivisi in diversi tipi.
In un sistema Linux ogni utente è associato a un account che oltre alle informazioni di accesso (come nome utente e password) definisce anche come e dove l’utente può interagire con il sistema. Privilegi e controlli di accesso definiscono i “confini” entro i quali ogni utente può operare.
Identificativi (UID/GID)
Gli identificativi utente e di gruppo (UID - User Identifier/GID - Group Identifier) sono i riferimenti numerici di base agli account. Le prime implementazioni prevedevano numeri interi limitati a 16 bit (valori da 0 a 65535), ma i sistemi moderni (del 21° secolo) supportano UID e GID a 64 bit. Utenti e gruppi vengono enumerati in modo indipendente: quindi lo stesso ID può rappresentare sia un utente sia un gruppo.
Ogni utente ha non solo un UID, ma anche un GID primario. Il GID primario per un utente può essere univoco solo per quell’utente e potrebbe non essere utilizzato da altri utenti. Tuttavia, questo gruppo potrebbe anche essere un gruppo condiviso da numerosi utenti. Oltre a questi gruppi primari, ogni utente può essere membro anche di altri gruppi.
Sui sistemi Linux, per impostazione predefinita, ogni utente viene assegnato a un gruppo con lo stesso nome del proprio nome utente, e lo stesso GID del proprio UID. Per esempio, se si crea un nuovo utente chiamato newuser
, per impostazione predefinita anche il suo gruppo di default sarà newuser
.
L’Account Superuser
Su Linux l’account superuser è root
, che ha sempre UID 0. Talvolta il superuser è chiamato amministratore di sistema e ha accesso e controllo illimitati sul sistema, inclusi gli altri utenti.
Il gruppo predefinito per il superuser ha GID 0
e anch’esso è chiamato root
. La directory home del superuser è una directory di primo livello dedicata, /root
, accessibile solo dall’utente root
stesso.
Account Utenti Standard
Tutti gli account diversi da root
sono tecnicamente account utenti ordinari, ma su un sistema Linux il termine colloquiale account utente spesso si riferisce a un account utente “ordinario” (non privilegiato). In genere hanno le seguenti proprietà, con alcune eccezioni:
-
UID che iniziano da 1000 (4 cifre), sebbene in alcuni sistemi legacy possano iniziare da 500.
-
Una determinata directory home, solitamente una sottodirectory di
/home
, a seconda della configurazione del sistema. -
Una determinata shell di login. In Linux la shell predefinita è solitamente la Bourne Again Shell (
/bin/bash
), sebbene possano essere disponibili anche altre.
Se un account utente non ha una shell valida nei propri attributi, l’utente non sarà in grado di aprire una shell interattiva. Di solito /sbin/nologin
viene usato per indicare una shell non valida. Questo può essere utile nel caso in cui l’utente venga autenticato solo per servizi diversi dalla console o dall’accesso SSH, per esempio solo per l’accesso FTP sicuro (sftp
).
Note
|
Per evitare confusione il termine account utente in futuro verrà usato solo per indicare gli account utenti standard od ordinari. Per esempio, il termine account di sistema verrà utilizzato per fare riferimento a un account utente Linux appartenenete al tipo di account utente di sistema. |
Account di Sistema
Gli account di sistema vengono generalmente creati durante l’installazione del sistema. Questi sono destinati a strutture (facility), programmi e servizi che non verranno eseguiti come superuser. In un mondo ideale, sarebbero tutte facility del sistema operativo.
Gli account di sistema variano, ma i loro attributi includono:
-
Gli UID sono generalmente inferiori a 100 (2 cifre) o vanno da 500 a 1000 (3 cifre).
-
O nessuna directory home dedicata o una directory che di solito non si trova sotto
/home
. -
Nessuna shell di login valida (tipicamente
/sbin/nologin
), con rare eccezioni.
La maggior parte degli account di sistema su Linux non effettuerà mai il login e quindi non necessita di una shell definita nei propri attributi. Molti processi che hanno come come owner e vengono eseguiti dagli account di sistema vengono biforcati nel proprio ambiente dal gestore di sistema, in esecuzione con l’account di sistema specificato. Questi account di solito hanno privilegi limitati o, il più delle volte, nessun privilegio.
Note
|
Per la certificazione LPI Linux Essentials, gli account di sistema sono UID < 1000, con UID (e GID) a 2 o 3 cifre. |
In generale gli account di sistema non dovrebbero avere una shell di login valida. Il contrario costituirebbe un problema di sicurezza nella maggior parte dei casi.
Account di Servizio
Gli account di servizio vengono generalmente creati quando vengono installati e configurati i servizi. Similmente agli account di sistema, sono destinati a strutture (facility), programmi e servizi che non vengono eseguiti come superuser.
In molta documentazione gli account di sistema e di servizio sono simili e spesso interscambiabili. Ciò include la posizione delle directory home, che, se definite, tipicamente si trovano al di fuori di /home
(gli account di servizio hanno spesso maggiori probabilità di averne una rispetto agli account di sistema) e nessuna shell di login valida. Sebbene non esista una definizione rigorosa, la differenza principale tra gli account di sistema e di servizio sta negli UID/GID.
- Account di sistema
-
UID/GID < 100 (2 cifre) o < 500-1000 (3 cifre)
- Account di servizio
-
UID/GID > 1000 (4+ cifre), ma non un account utente “standard” o “ordinario”, un account per servizi, con un UID/GID > 1000 (4+ cifre)
Alcune distribuzioni Linux hanno ancora account di servizio pre-riservati con UID < 100 e potrebbero anche essere considerati account di sistema, anche se non vengono creati durante l’installazione. Per esempio, nelle distribuzioni Linux basate su Fedora (incluso Red Hat), l’utente per il server Web Apache ha UID (e GID) 48, chiaramente un account di sistema, nonostante abbia una home directory (di solito in /usr/share/httpd
o /var/www/html/
).
Note
|
Per la certificazione LPI Linux Essentials, gli account di sistema sono UID < 1000 e gli account utente ordinari sono UID > 1000. Poiché gli account utente ordinari sono > 1000, questi UID possono includere anche account di servizio. |
Shell di Login e Directory Home
Alcuni account hanno una shell di login, mentre altri no per motivi di sicurezza, in quanto non richiedono un accesso interattivo. La shell di login predefinita nella maggior parte delle distribuzioni Linux è la Bourne Again Shell, o bash
, ma potrebbero essere disponibili anche altre shell, come la shell C (csh
), la shell Korn (ksh
) o la shell Z (zsh
), giusto per nominarne alcune.
Un utente può cambiare la sua shell di login utilizzando il comando chsh
. Per impostazione predefinita, il comando viene eseguito in modalità interattiva e visualizza un prompt che chiede quale shell debba essere utilizzata. La risposta dovrebbe essere il percorso completo del binario della shell, come mostrato qui sotto:
$ chsh Changing the login shell for emma Enter the new value, or press ENTER for the default Login Shell [/bin/bash]: /usr/bin/zsh
Puoi anche eseguire il comando in modalità non interattiva, con l’opzione -s
seguita dal percorso del binario, in questo modo:
$ chsh -s /usr/bin/zsh
La maggior parte degli account ha una directory home definita. In Linux, questa è solitamente l’unico posto in cui un account utente ha garantito l’accesso in scrittura, con alcune eccezioni (per esempio aree temporanee del file system). Tuttavia, per motivi di sicurezza, alcuni account sono impostati appositamente per non avere alcun accesso in scrittura anche nella propria directory home.
Ottenere Informazioni Sugli Utenti
Elencare le informazioni di base degli utenti è una pratica quotidiana comune su un sistema Linux. In alcuni casi gli utenti dovranno cambiare utente e ottenere privilegi più alti per portare a termine attività privilegiate.
Anche gli utenti ordinari hanno la possibilità di elencare gli attributi e gli accessi dalla Command Line, utilizzando i comandi di seguito riportati. Le informazioni di base, in un contesto limitato, non costituiscono un’operazione privilegiata.
Per elencare sulla Command Line le informazioni correnti di un utente basta un semplice comando di due lettere: id
. L’output varierà in base al tuo ID di login:
$ id uid=1024(emma) gid=1024(emma) 1024(emma),20(games),groups=10240(netusers),20480(netadmin) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Nell’elenco precedente, l’utente (emma
) possiede una serie di identificativi che possono essere suddivisi come segue:
-
1024
= User ID (UID), seguito dal nome utente (nome comune o nome di login) tra parentesi. -
1024
= l’ID del gruppo primario (GID), seguito dal nome del gruppo (nome comune) tra parentesi. -
Un elenco di GID aggiuntivi (nomi di gruppo) a cui appartiene anche l’utente.
Per elencare l’ultima volta che gli utenti si sono loggati sul sistema puoi usare il comando last
:
$ last emma pts/3 ::1 Fri Jun 14 04:28 still logged in reboot system boot 5.0.17-300.fc30. Fri Jun 14 04:03 still running reboot system boot 5.0.17-300.fc30. Wed Jun 5 14:32 - 15:19 (00:46) reboot system boot 5.0.17-300.fc30. Sat May 25 18:27 - 19:11 (00:43) reboot system boot 5.0.16-100.fc28. Sat May 25 16:44 - 17:06 (00:21) reboot system boot 5.0.9-100.fc28.x Sun May 12 14:32 - 14:46 (00:14) root tty2 Fri May 10 21:55 - 21:55 (00:00) ...
Le informazioni elencate nelle colonne possono variare, ma alcune voci degne di nota dell’elenco precedente sono:
-
Un utente (
emma
) ha effettuato il login tramite la rete (pseudo TTYpts/3
) ed è ancora loggato. -
Viene elencata l’ora del processo di avvio corrente, insieme al kernel. Nell’esempio sopra riportato, circa 25 minuti prima che l’utente abbia effettuato l’accesso.
-
Il superuser (
root
) ha effettuato il login tramite una console virtuale (TTYtty2
), sommariamente, a metà maggio.
Una variante del comando last
è il comando lastb
, che elenca tutti gli ultimi tentativi di login falliti.
I comandi who
e w
elencano solamente i login attivi sul sistema:
$ who emma pts/3 2019-06-14 04:28 (::1) $ w 05:43:41 up 1:40, 1 user, load average: 0.25, 0.53, 0.51 USER TTY LOGIN@ IDLE JCPU PCPU WHAT emma pts/3 04:28 1:14m 0.04s 0.04s -bash
Alcune informazioni sono mostrate da entrambi i comandi. Per esempio, un utente (emma
) ha effettuato il login con uno pseudo-dispositivo TTY (pts/3
) e l’ora del login è 04:28.
Il comando w
mostra ulteriori informazioni, incluse le seguenti:
-
L’ora corrente e da quanto tempo il sistema è attivo
-
Il numero di utenti collegati
-
Il carico medio degli ultimi 1, 5 e 15 minuti
Vengono inoltre visualizzate informazioni aggiuntive per ogni sessione utente attiva:
-
Tempi totali di utilizzo della CPU (Select, total CPU utilization times) (
IDLE
,JCPU
ePCPU
) -
Il processo corrente (
-bash
). Il tempo di utilizzo totale della CPU da parte di quel processo è l’ultimo elemento (PCPU
).
Entrambi i comandi hanno ulteriori opzioni per elencare varie informazioni aggiuntive.
Cambiare Utente e Aumentare i Privilegi
In un mondo ideale, gli utenti non avrebbero mai bisogno di aumentare i privilegi per completare le proprie attività. Il sistema “funzionerebbe” sempre e tutto sarebbe configurato per i diversi tipi di accesso.
Fortunatamente per noi, Linux funziona in questo modo per la maggior parte degli utenti che non sono amministratori di sistema, nonostante segua sempre il modello di sicurezza con privilegi minimi.
Tuttavia, esistono comandi che consentono l’escalation dei privilegi quando necessario. Due dei più importanti sono su
e sudo
.
Attualmente, nella maggior parte dei sistemi Linux, il comando su
viene utilizzato solo per aumentare i privilegi a root, che è l’utente predefinito se non viene specificato un nome utente dopo il comando. Sebbene possa essere utilizzato per passare a un altro utente, non è certamente una buona pratica: gli utenti devono effettuare il login da un altro sistema, sulla rete, o dalla console fisica o dal terminale del sistema.
emma ~$ su - Password: root ~#
Dopo aver inserito la password del superuser (root
), l’utente ottiene la sua shell (nota il #
alla fine del prompt dei comandi) e diventa, a tutti gli effetti, il superuser (root
).
La condivisione delle password è una pessima pratica di sicurezza; quindi, in un moderno sistema Linux, dovrebbe esserci pochissimo bisogno, se presente, del comando su
.
Il simbolo del dollaro ($
) dovrebbe terminare il prompt della Command Line di una shell utente non privilegiata, mentre il simbolo cancelletto (#
) dovrebbe terminare il prompt della Command Line della shell del superuser (root
). È altamente raccomandato non cambiare mai il carattere finale di qualsiasi prompt da questo standard “universalmente accettato”, poiché questa nomenclatura è usata nei materiali di apprendimento, inclusi questi.
Warning
|
Non passare mai al superuser ( |
Qual è il problema più grande nell’usare su
per passare al superuser (root
)? Se la sessione di un utente ordinario è stata compromessa, la password del superuser (root
) potrebbe essere individuata. È qui che entra in gioco “Switch User Do” (o “Superuser Do”):
$ cat /sys/devices/virtual/dmi/id/board_serial cat: /sys/devices/virtual/dmi/id/board_serial: Permission denied $ sudo cat /sys/devices/virtual/dmi/id/board_serial [sudo] password for emma: /6789ABC/
Nell’esempio precedente, l’utente sta tentando di individuare il numero di serie della propria scheda di sistema. Tuttavia, l’autorizzazione viene negata, poiché tali informazioni sono contrassegnate come privilegiate.
Tuttavia, usando sudo
, l’utente inserisce la propria password per autenticarsi. Se è stato autorizzato nella configurazione di sudoers
a eseguire quel comando con privilegi, con le opzioni consentite, funzionerà.
Tip
|
Per impostazione predefinita, il primo comando |
File di Controllo degli Accessi
Quasi tutti i sistemi operativi hanno una serie di posizioni specifiche in cui memorizzare i controlli di accesso. In Linux questi sono tipicamente file di testo nella directory /etc
, che è dove dovrebbero essere memorizzati i file di configurazione del sistema. Per impostazione predefinita, questa directory è leggibile da ogni utente sul sistema, ma scrivibile solo da root
.
I file principali relativi agli account utente, agli attributi e al controllo degli accessi sono:
/etc/passwd
-
Questo file memorizza le informazioni di base sugli utenti di sistema, inclusi UID e GID, la directory home, la shell, etc. Nonostante il nome, qui non vengono memorizzate password.
/etc/group
-
Questo file memorizza le informazioni di base su tutti i gruppi di utenti nel sistema, come il nome del gruppo, il GID e i membri.
/etc/shadow
-
Qui è dove vengono memorizzate le password degli utenti. Sono crittografate (sottoposte a hashing) per ragioni di sicurezza.
/etc/gshadow
-
Questo file memorizza informazioni più dettagliate sui gruppi, inclusa una password crittografata (sottoposta a hashing) che consente agli utenti di diventare temporaneamente membri del gruppo, un elenco di utenti che possono diventare membri del gruppo in qualsiasi momento e un elenco di amministratori del gruppo.
Warning
|
Questi file non sono stati progettati per essere modificati direttamente e questo non dovrebbe mai accadere. Questa lezione tratta solamente le informazioni memorizzate in questi file e non la loro modifica. |
Per impostazione predefinita ogni utente può entrare in /etc
e leggere i file /etc/passwd
ed /etc/group
. Inoltre, per impostazione predefinita, nessun utente, eccetto root
, può leggere i file /etc/shadow
ed /etc/gshadow
.
Esistono anche dei file che hanno a che fare con l’escalation dei privilegi di base sui sistemi Linux, come, per esempio, accade con i comandi su
e sudo
. Per impostazione predefinita, questi sono accessibili solo dall’utente root
.
/etc/sudoers
-
Questo file controlla chi e come può usare il comando
sudo
. /etc/sudoers.d
-
Questa directory può contenere file che integrano le configurazioni del file
sudoers
.
Per l’esame della certificazione LPI Linux Essentials, è sufficiente conoscere il percorso e il nome del file di configurazione predefinito di sudo: /etc/sudoers
. La sua configurazione va oltre lo scopo di questi materiali.
Warning
|
Anche se |
/etc/passwd
Il file /etc/passwd
è comunemente chiamato “file delle password”. Ogni riga contiene più campi sempre delimitati dal carattere due punti (:
). Nonostante il nome, l’hash unidirezionale (one-way hash) delle password oggi non è più memorizzato in questo file.
La tipica sintassi di una riga in questo file è la seguente:
USERNAME:PASSWORD:UID:GID:GECOS:HOMEDIR:SHELL
Dove:
USERNAME
-
Il nome utente o di login (login name), come
root
,nobody
,emma
. PASSWORD
-
Vecchia posizione dell’hash della password. È quasi sempre
x
, a indicare che la password è memorizzata nel file/etc/shadow
. UID
-
User ID (UID), come
0
,99
,1024
. GID
-
Group ID predefinito (GID), come
0
,99
,1024
. GECOS
-
Un elenco CSV di informazioni sull’utente, inclusi nome, posizione, numero di telefono. Per esempio:
Emma Smith,42 Douglas St,555.555.5555
HOMEDIR
-
Percorso della directory home dell’utente, come
/root
,/home/emma
, etc. SHELL
-
La shell predefinita per questo utente, come
/bin/bash
,/sbin/nologin
,/bin/ksh
, etc.
Per esempio, la riga seguente descrive l’utente emma
:
emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555:/home/emma:/bin/bash
Comprendere il Campo GECOS
Il campo GECOS contiene tre (3) o più campi, delimitati da una virgola (,
), ovvero un elenco di valori separati da virgola (CSV - Comma Separated Values). Sebbene non esista uno standard imposto, i campi sono generalmente nel seguente ordine:
NAME,LOCATION,CONTACT
Dove:
NAME
-
È il “nome completo” (Full Name) dell’utente o il “nome del software” (Software Name) nel caso di un account di servizio.
LOCATION
-
Di solito è l’ubicazione fisica dell’utente all’interno di un edificio, il numero della stanza o l’ufficio o la persona da contattare nel caso di un account di servizio.
CONTACT
-
Elenca le informazioni di contatto come il numero di telefono di casa o dell’ufficio.
Campi aggiuntivi possono includere ulteriori informazioni di contatto, come un numero di casa (home number) o un indirizzo e-mail. Per modificare le informazioni nel campo GECOS, usa il comando chfn
e rispondi alle domande, come nell’esempio sotto riportato. Se non viene fornito alcun nome utente dopo il comando, vengono cambiate le informazioni dell’utente corrente:
$ chfn Changing the user information for emma Enter the new value, or press ENTER for the default Full Name: Emma Smith Room Number []: 42 Work Phone []: 555.555.5555 Home Phone []: 555.555.6666
/etc/group
Il file /etc/group
contiene campi, sempre delimitati da due punti (:
), che memorizzano le informazioni di base sui gruppi nel sistema. A volte è chiamato “file dei gruppi”. La sintassi per ogni riga è la seguente:
NAME:PASSWORD:GID:MEMBERS
Dove:
NAME
-
È il nome del gruppo, come
root
,users
,emma
, etc. PASSWORD
-
Vecchia posizione di un eventuale hash della password del gruppo. Quasi sempre
x
, a indicare che la password (se definita) è memorizzata nel file/etc/gshadow
. GID
-
Group ID (GID), come
0
,99
,1024
. MEMBERS
-
Un elenco, separato da virgole, di nomi utente che sono membri del gruppo, come
jsmith,emma
.
L’esempio seguente mostra una riga contenente informazioni sul gruppo students
:
students:x:1023:jsmith,emma
Non è necessario che un utente sia elencato nel campo dei membri quando il gruppo è il gruppo principale di quell’utente. Se un utente è elencato, allora è ridondante, cioè, non vi è alcun cambiamento nel funzionamento, che sia elencato o meno.
Note
|
L’uso delle password per i gruppi esula dallo scopo di questa lezione. Tuttavia, se presente, l’hash della password è memorizzato nel file |
/etc/shadow
Il seguente elenco mostra gli attributi memorizzati nel file /etc/shadow
, comunemente indicato come file shadow. Il file contiene un elenco di campi sempre delimitati da due punti (:
). Sebbene abbia molti campi, la maggior parte di essi non rientra nell’ambito di questa lezione, a eccezione dei primi due.
La sintassi di base di una riga in questo file è la seguente:
USERNAME:PASSWORD:LASTCHANGE:MINAGE:MAXAGE:WARN:INACTIVE:EXPDATE
Dove:
USERNAME
-
Il nome utente (uguale a quello in
/etc/passwd
), comeroot
,nobody
,emma
. PASSWORD
-
L’hash unidirezionale (one-way hash) della password, incluso il salt precedente. Per esempio:
!!
,!$1$01234567$ABC…
,$6$012345789ABCDEF$012…
. LASTCHANGE
-
Data dell’ultima modifica della password, espressa in giorni trascorsi dall'“Epoca”, come per esempio
17909
. MINAGE
-
Durata minima della password in giorni.
MAXAGE
-
Durata massima della password in giorni.
WARN
-
Periodo di avviso prima della scadenza della password, espresso in giorni.
INACTIVE
-
Durata massima della password dopo la scadenza, espressa in giorni.
EXPDATE
-
Data di scadenza della password, in giorni trascorsi dall'“Epoca”.
Nel seguente esempio puoi vedere una riga del file /etc/shadow
. Nota che alcuni valori, come INACTIVE
ed EXPDATE
non sono definiti.
emma:$6$nP532JDDogQYZF8I$bjFNh9eT1xpb9/n6pmjlIwgu7hGjH/eytSdttbmVv0MlyTMFgBIXESFNUmTo9EGxxH1OT1HGQzR0so4n1npbE0:18064:0:99999:7:::
L'“Epoca” di un sistema POSIX è la mezzanotte (0000), Universal Coordinate Time (UTC), di giovedì 1 gennaio 1970. La maggior parte delle date e degli orari POSIX sono espresse in secondi a partire dall'“Epoca” o nel caso del file /etc/shadow
, in giorni trascorsi dall'“Epoca”.
Note
|
Il file shadow è stato progettato per essere leggibile solo dal superuser e da selezionati servizi di autenticazione del sistema di base che controllano l’hash unidirezionale della password al login o in un altro momento di autenticazione. |
Sebbene esistano diverse soluzioni di autenticazione, il metodo base di memorizzazione delle password è la funzione di hash unidirezionale. Questa viene fatta in modo tale che la password non venga mai memorizzata in chiaro su un sistema, poiché la funzione di hashing non è reversibile. Puoi trasformare una password in un hash, ma (idealmente) non è possibile trasformare un hash in una password.
Al massimo, è richiesto un metodo di forza bruta per eseguire l’hash di tutte le combinazioni di una password, fino a quando una non corrisponde. Per cercare di limitare il problema che l’hash di una password venga violato su un sistema, i sistemi Linux utilizzano un salt casuale per ogni hash della password di un utente. Quindi l’hash di una password utente su un sistema Linux generalmente non sarà lo stesso di un altro sistema Linux, anche se la password è la stessa.
Nel file /etc/shadow
, la password può assumere diverse forme, tra cui le seguenti:
!!
-
Questo significa un account “disabilitato” (nessuna autenticazione possibile), senza hash della password memorizzato.
!$1$01234567$ABC…
-
Un account “disabilitato” (a causa del punto esclamativo iniziale), con una precedente funzione di hash, hash salt e hash string memorizzati.
$1$0123456789ABC$012…
-
Un account “abilitato”, con una funzione di hash, hash salt e hash string memorizzati.
La funzione di hash, l’hash salt e l’hash string sono preceduti e delimitati dal simbolo dollaro ($
). La lunghezza dell’hash salt deve essere compresa tra otto e sedici (8-16) caratteri. Ecco tre dei più comuni esempi:
$1$01234567$ABC…
-
Una funzione hash MD5 (
1
), con una lunghezza hash di otto caratteri. $5$01234567ABCD$012…
-
Una funzione hash SHA256 (
5
), con una lunghezza hash di dodici caratteri. $6$01234567ABCD$012…
-
Una funzione hash SHA512 (
6
), con una lunghezza hash di dodici caratteri.
Note
|
La funzione hash MD5 è considerata crittograficamente insicura per il livello di ASIC odierno (dal 2010 in poi) e persino per le prestazioni SIMD di elaborazione generale. Per esempio, i Federal Information Processing Standards (FIPS) degli Stati Uniti non consentono l’utilizzo di MD5 per alcuna funzione crittografica, solo per aspetti molto limitati di validazione, ma non per l’integrità delle firme digitali o scopi simili. |
Dal punto di vista degli obiettivi e dell’esame LPI Linux Essentials, è sufficiente comprendere che l’hash della password di un utente locale è memorizzato nel file /etc/shadow
che può essere letto solamente da selezionati servizi di autenticazione o modificato dal superuser utilizzando altri comandi.
Esercizi Guidati
-
Considera il seguente output del comando
id
:$ id emma uid=1000(emma) gid=1000(emma) groups=1000(emma),4(adm),5(tty),10(uucp),20(dialout),27(sudo),46(plugdev)
In quali file sono memorizzati i seguenti attributi?
UID e GID
Gruppi
-
Inoltre, in quale file è memorizzata la password dell’utente?
-
-
Quale dei seguenti tipi di crittografia viene utilizzato, per impostazione predefinita, per memorizzare le password in locale su un sistema Linux?
-
Asimmetrica
-
Funzione di Hash unidirezionale (One-way Hash)
-
Simmetrica
-
ROT13
-
-
Se un account ha un ID utente (UID - User ID) inferiore a 1000, che tipo di account è?
-
Come puoi ottenere l’elenco dei login attivi sul tuo sistema e anche il loro numero?
-
Utilizzando il comando
grep
, abbiamo ottenuto le informazioni sull’utenteemma
riportate qui sotto:$ grep emma /etc/passwd emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555,:/home/emma:/bin/ksh
Completa gli spazi vuoti della tabella con le informazioni corrette utilizzando l’output del comando precedente.
Nome Utente
Password
UID
GID Primario
GECOS
Directory Home
Shell
Esercizi Esplorativi
-
Confronta i risultati di
last
con quelli diw
ewho
. Quali informazioni mancano a ciascuno dei comandi rispetto agli altri? -
Prova a eseguire i comandi
who
ew -his
.-
Quali informazioni sono state rimosse dall’output del comando
w
con le opzioni “no header” (-h
) e “short” (-s
)? -
Quali informazioni sono state aggiunte all’output del comando
w
con l’opzione “ip address” (-i
)?
-
-
Qual è il file che memorizza l’hash unidirezionale della password di un account utente?
-
Quale file contiene l’elenco dei gruppi di cui è membro un account utente? Quale logica potrebbe essere utilizzata per stilarlo?
-
Per impostazione predefinita, uno o più (1+) dei seguenti file non sono leggibili da utenti ordinari senza privilegi. Quali sono?
-
/etc/group
-
/etc/passwd
-
/etc/shadow
-
/etc/sudoers
-
-
Come puoi cambiare, in modalità non interattiva, la shell di login dell’utente corrente nella Shell Korn (
/usr/bin/ksh
)? -
Perché la directory home dell’utente
root
non si trova nella directory/home
?
Sommario
In questa lezione abbiamo trattato i database degli utenti e dei gruppi di Linux. Abbiamo appreso le proprietà più importanti di utenti e gruppi, inclusi i loro nomi e i loro ID numerici. Abbiamo anche esaminato come funziona l’hashing delle password su Linux e come gli utenti vengono assegnati ai gruppi.
Tutte queste informazioni sono memorizzate nei quattro file di seguito riportati, che forniscono i controlli di accesso più semplici per la sicurezza locale su un sistema Linux:
/etc/passwd
-
Tutti gli attributi POSIX degli account utente a livello locale del sistema, a eccezione degli hash delle password, leggibili da tutti.
/etc/group
-
Tutti gli attributi POSIX dei gruppi a livello locale del sistema, leggibili da tutti.
/etc/shadow
-
Tutti gli hash delle password degli utenti a livello locale del sistema (e le informazioni sulla scadenza), non leggibili da chiunque (solo da processi selezionati).
/etc/sudoers
-
Tutte le informazioni/permessi sull’escalation dei privilegi a livello locale del sistema tramite il comando
sudo
.
In questa lezione sono stati discussi i seguenti comandi:
id
-
Elenca gli ID utente e di gruppo reali (o effettivi).
last
-
Elenca gli utenti che hanno effettuato il login per ultimi.
who
-
Elenca gli utenti che sono attualmente connessi.
w
-
Simile a
who
ma con informazioni di contesto aggiuntive. su
-
Passa a un altro utente con una shell di login o esegue comandi come quell’utente, passando la sua password.
sudo
-
Switch User (o Superuser) Do: se autorizzato, l’utente corrente inserisce la propria password (se richiesta) per scalare i privilegi.
chsh
-
Cambia la shell di un utente.
chfn
-
Modifica le informazioni dell’utente nel campo GECOS.
Risposte agli Esercizi Guidati
-
Considera il seguente output del comando
id
:$ id emma uid=1000(emma) gid=1000(emma) groups=1000(emma),4(adm),5(tty),10(uucp),20(dialout),27(sudo),46(plugdev)
In quali file sono memorizzati i seguenti attributi?
UID e GID
/etc/passwd
Gruppi
/etc/group
-
Inoltre, in quale file è memorizzata la password dell’utente?
La password crittografata (sottoposta a hashing) dell’utente è memorizzata in
/etc/shadow
.
-
-
Quale dei seguenti tipi di crittografia viene utilizzato, per impostazione predefinita, per memorizzare le password in locale su un sistema Linux?
Per impostazione predefinita, per memorizzare le password viene utilizzata una funzione di hash unidirezionale (one-way hash).
-
Se un account ha un ID utente (UID - User ID) inferiore a 1000, che tipo di account è?
Gli account con un UID inferiore a 1000 generalmente sono account di sistema.
-
Come puoi ottenere l’elenco dei login attivi sul tuo sistema e anche il loro numero?
Usando il comando
w
. Oltre a un elenco di tutti i login attivi, il comando mostra anche informazioni come il numero di utenti che hanno effettuato il login, il carico del sistema e il tempo di funzionamento. -
Utilizzando il comando
grep
, abbiamo ottenuto le informazioni sull’utenteemma
riportate qui sotto:$ grep emma /etc/passwd emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555,:/home/emma:/bin/ksh
Completa gli spazi vuoti della tabella con le informazioni corrette utilizzando l’output del comando precedente.
Nome Utente
emma
Password
x
- dovrebbe sempre esserex
per un login utente valido e attivoUID
1000
GID Primario
1000
GECOS
Emma Smith,42 Douglas St,555.555.5555
Directory Home
/home/emma
Shell
/bin/ksh
Risposte agli Esercizi Esplorativi
-
Confronta i risultati di
last
con quelli diw
ewho
. Quali informazioni mancano a ciascuno dei comandi rispetto agli altri?Gli strumenti
w
ewho
elencano solo gli utenti attualmente connessi sul sistema, mentrelast
elenca anche gli utenti che si sono disconnessi. Il comandow
mostra l’utilizzo del sistema, mentrewho
non lo fa. -
Prova a eseguire i comandi
who
ew -his
.-
Quali informazioni sono state rimosse dall’output del comando
w
con le opzioni “no header” (-h
) e “short” (-s
)?Rispettivamente, non viene stampata l’intestazione (header), il che è utile per l’analisi, e non vengono riportate l’ora di accesso e le informazioni sulla CPU.
-
Quali informazioni sono state aggiunte all’output del comando
w
con l’opzione “ip address” (-i
)?Questa opzione stampa l’indirizzo IP, invece di tentare la risoluzione DNS, stampando il nome host. Questa opzione di
w
ha una migliore corrispondenza con l’output predefinito del comandolast
.
-
-
Qual è il file che memorizza l’hash unidirezionale della password di un account utente?
Il file
/etc/shadow
memorizza l’hash unidirezionale della password di un account utente poiché, a differenza di/etc/passwd
, non è leggibile da un account utente ordinario e non privilegiato. -
Quale file contiene l’elenco dei gruppi di cui è membro un account utente? Quale logica potrebbe essere utilizzata per stilarlo?
Il file
/etc/group
ha un elenco CSV di nomi utente nell’ultimo campo (“members”) di qualsiasi riga corrispondente a un gruppo.Qualsiasi riga nel file
/etc/group
in cui un utente è elencato nell’ultimo campo (“members”) indica che quell’utente è un membro di quel gruppo, supponendo che sia formattato in modo corretto (CSV). Inoltre, il gruppo primario di un utente nel file/etc/passwd
avrà anche una corrispondenza nel file/etc/group
in termini di nome del gruppo e GID. -
Per impostazione predefinita, uno o più (1+) dei seguenti file non sono leggibili da utenti ordinari senza privilegi. Quali sono?
-
/etc/group
-
/etc/passwd
-
/etc/shadow
-
/etc/sudoers
I file
/etc/shadow
ed/etc/sudoers
non sono leggibili per impostazione predefinita, tranne che dai servizi selezionati o dal superuser. Queste risposte dipendono dai sistemi e dai nomi utente utilizzati in laboratorio.
-
-
Come puoi cambiare, in modalità non interattiva, la shell di login dell’utente corrente nella Shell Korn (
/usr/bin/ksh
)?$ chsh -s /usr/bin/ksh
-
Perché la directory home dell’utente
root
non si trova nella directory/home
?Perché l’account
root
è necessario per individuare e correggere gli errori, che potrebbero includere problemi di file system relativi alla directory/home
. In questi casi,root
dovrebbe essere completamente funzionante anche quando il file system/home
non è ancora disponibile.