Introduzione
La separazione dei privilegi è uno dei paradigmi di sicurezza fondamentali implementati in Linux e nei sistemi operativi Unix-like. Gli utenti regolari operano con privilegi limitati al fine di ridurre la portata della loro influenza al proprio ambiente, e non al sistema operativo in generale.
Un utente speciale, chiamato root, ha privilegi di super-utente. Questo è un account amministrativo senza le restrizioni che sono presenti sugli utenti normali. Gli utenti possono eseguire comandi con i privilegi di super-utente o di root in diversi modi.
In questo articolo, discuteremo come ottenere correttamente e in modo sicuro i privilegi di root, con particolare attenzione alla modifica del file /etc/sudoers
.
Completeremo questi passi su un server Ubuntu 20.04, ma la maggior parte delle distribuzioni Linux moderne come Debian e CentOS dovrebbero funzionare in modo simile.
Questa guida presuppone che abbiate già completato la configurazione iniziale del server discussa qui. Accedete al vostro server come normali utenti non root e continuate di seguito.
Nota: Questo tutorial approfondisce l’escalation dei privilegi e il file sudoers
. Se volete solo aggiungere sudo
privilegi ad un utente, date un’occhiata ai nostri tutorial di avvio rapido su come creare un nuovo utente abilitato per Ubuntu e CentOS.
Come ottenere i privilegi di root
Ci sono tre modi fondamentali per ottenere i privilegi di root, che variano nel loro livello di sofisticazione.
Entrare come root
Il metodo più semplice e diretto per ottenere i privilegi di root è quello di accedere direttamente al vostro server come utente root.
Se state entrando in una macchina locale (o usando una console fuori banda su un server virtuale), inserite root
come nome utente al prompt di login e inserite la password di root quando richiesto.
Se state effettuando l’accesso tramite SSH, specificate l’utente root prima dell’indirizzo IP o del nome di dominio nella vostra stringa di connessione SSH:
- ssh root@server_domain_or_ip
Se non avete impostato chiavi SSH per l’utente root, inserite la password root quando richiesto.
Usa su per diventare root
L’accesso diretto come root non è solitamente raccomandato, perché è facile iniziare ad usare il sistema per compiti non amministrativi, il che è pericoloso.
Il prossimo modo per ottenere i privilegi di super-utente vi permette di diventare l’utente root in qualsiasi momento, quando ne avete bisogno.
Lo possiamo fare invocando il comando su
, che sta per “substitute user”. Per ottenere i privilegi di root, digitate:
- su
Vi verrà richiesta la password dell’utente root, dopodiché sarete lanciati in una sessione di shell di root.
Quando avete finito i compiti che richiedono i privilegi di root, tornate alla vostra shell normale digitando:
- exit
Usa sudo per eseguire comandi come root
L’ultimo modo di ottenere i privilegi di root che discuteremo è con il comando sudo
.
Il comando sudo
permette di eseguire comandi una tantum con privilegi di root, senza la necessità di generare una nuova shell. Viene eseguito così:
- sudo command_to_execute
A differenza di su
, il comando sudo
richiederà la password dell’utente corrente, non quella di root.
A causa delle sue implicazioni di sicurezza, l’accesso sudo
non è concesso agli utenti per impostazione predefinita, e deve essere impostato prima di funzionare correttamente. Date un’occhiata ai nostri tutorial come creare un nuovo utente abilitato a Sudo per Ubuntu e CentOS per imparare come impostare un utente abilitato a sudo
.
Nella sezione seguente, discuteremo come modificare la configurazione sudo
in maggiore dettaglio.
Che cos’è Visudo?
Il comando sudo
è configurato attraverso un file situato all’indirizzo /etc/sudoers
.
Attenzione: Non modificare mai questo file con un normale editor di testo! Usate sempre il comando visudo
!
Perché una sintassi impropria nel file /etc/sudoers
può lasciarvi con un sistema rotto dove è impossibile ottenere privilegi elevati, è importante usare il comando visudo
per modificare il file.
Il comando visudo
apre un editor di testo come al solito, ma convalida la sintassi del file al momento del salvataggio. Questo impedisce agli errori di configurazione di bloccare le operazioni sudo
, che potrebbero essere l’unico modo per ottenere i privilegi di root.
Tradizionalmente, visudo
apre il file /etc/sudoers
con l’vi
text editor. Ubuntu, tuttavia, ha configurato visudo
per utilizzare invece l’editor di testo nano
.
Se volete cambiarlo di nuovo in vi
, eseguite il seguente comando:
- sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status------------------------------------------------------------* 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual modePress <enter> to keep the current choice, or type selection number:
Selezionate il numero che corrisponde alla scelta che volete fare.
Su CentOS, potete cambiare questo valore aggiungendo la seguente linea al vostro ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Sorgente il file per implementare le modifiche:
- . ~/.bashrc
Dopo aver configurato visudo
, esegui il comando per accedere al file /etc/sudoers
:
- sudo visudo
Come modificare il file Sudoers
Vi verrà presentato il file /etc/sudoers
nel vostro editor di testo selezionato.
Ho copiato e incollato il file da Ubuntu 18.04, con i commenti rimossi. Il file CentOS /etc/sudoers
ha molte altre linee, alcune delle quali non saranno discusse in questa guida.
Defaults env_resetDefaults mail_badpassDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"root ALL=(ALL:ALL) ALL%admin ALL=(ALL) ALL%sudo ALL=(ALL:ALL) ALL#includedir /etc/sudoers.d
Diamo un’occhiata a cosa fanno queste linee.
Linee di default
La prima linea, “Defaults env_reset”, resetta l’ambiente del terminale per rimuovere qualsiasi variabile utente. Questa è una misura di sicurezza usata per cancellare le variabili ambientali potenzialmente dannose dalla sessione sudo
.
La seconda linea, Defaults mail_badpass
, dice al sistema di inviare avvisi di cattivi sudo
tentativi di password all’utente configurato mailto
. Per impostazione predefinita, questo è l’account root.
La terza linea, che inizia con “Defaults secure_path=…”, specifica i PATH
(i posti nel filesystem che il sistema operativo cercherà per le applicazioni) che saranno usati per le sudo
operazioni. Questo previene l’utilizzo di percorsi utente che potrebbero essere dannosi.
Linee di privilegio dell’utente
La quarta linea, che detta i privilegi dell’utente root sudo
, è diversa dalle linee precedenti. Diamo un’occhiata al significato dei diversi campi:
-
root ALL=(ALL:ALL) ALL
Il primo campo indica il nome utente a cui si applica la regola (root). -
root ALL=(ALL:ALL) ALL
Il primo “ALL” indica che questa regola si applica a tutti gli host. -
root ALL=(ALL:ALL) ALL
Questo “ALL” indica che l’utente root può eseguire comandi come tutti gli utenti. -
root ALL=(ALL:ALL) ALL
Questo “ALL” indica che l’utente root può eseguire comandi come tutti i gruppi. -
root ALL=(ALL:ALL) ALL
L’ultimo “ALL” indica che queste regole si applicano a tutti i comandi.
Questo significa che il nostro utente root può eseguire qualsiasi comando usando sudo
, purché fornisca la sua password.
Le linee di privilegio dei gruppi
Le prossime due linee sono simili a quelle dei privilegi degli utenti, ma specificano le regole sudo
per i gruppi.
I nomi che iniziano con un %
indicano i nomi dei gruppi.
Qui vediamo che il gruppo admin può eseguire qualsiasi comando come qualsiasi utente su qualsiasi host. Allo stesso modo, il gruppo sudo ha gli stessi privilegi, ma può eseguire come qualsiasi gruppo.
Incluso /etc/sudoers.d Line
L’ultima linea potrebbe sembrare a prima vista un commento:
. . .#includedir /etc/sudoers.d
In effetti inizia con un #
, che solitamente indica un commento. Tuttavia, questa linea in realtà indica che anche i file all’interno della directory /etc/sudoers.d
saranno individuati e applicati.
I file all’interno di questa directory seguono le stesse regole del file /etc/sudoers
stesso. Ogni file che non finisce in ~
e che non ha un .
al suo interno sarà letto e aggiunto alla configurazione sudo
.
Questo è principalmente pensato per le applicazioni per modificare i privilegi sudo
al momento dell’installazione. Mettere tutte le regole associate in un unico file nella directory /etc/sudoers.d
può rendere facile vedere quali privilegi sono associati a quali account e invertire facilmente le credenziali senza dover cercare di manipolare direttamente il file /etc/sudoers
.
Come per il file /etc/sudoers
stesso, si dovrebbe sempre modificare i file all’interno della directory /etc/sudoers.d
con visudo
. La sintassi per modificare questi file sarebbe:
- sudo visudo -f /etc/sudoers.d/file_to_edit
Come dare ad un utente i privilegi Sudo
L’operazione più comune che gli utenti vogliono compiere quando gestiscono i sudo
permessi è quella di concedere ad un nuovo utente un accesso generale sudo
. Questo è utile se si vuole dare ad un account l’accesso amministrativo completo al sistema.
Il modo più semplice per fare questo su un sistema impostato con un gruppo di amministrazione generale, come il sistema Ubuntu in questa guida, è effettivamente quello di aggiungere l’utente in questione a quel gruppo.
Per esempio, su Ubuntu 20.04, il gruppo sudo
ha privilegi di amministrazione completi. Possiamo concedere ad un utente questi stessi privilegi aggiungendolo al gruppo in questo modo:
- sudo usermod -aG sudo username
Il comando gpasswd
può anche essere usato:
- sudo gpasswd -a username sudo
Entrambi realizzeranno la stessa cosa.
Su CentOS, questo è di solito il gruppo wheel
invece del gruppo sudo
:
- sudo usermod -aG wheel username
O, usando gpasswd
:
- sudo gpasswd -a username wheel
Su CentOS, se l’aggiunta dell’utente al gruppo non funziona immediatamente, potrebbe essere necessario modificare il file /etc/sudoers
per scommentare il nome del gruppo:
- sudo visudo
. . .%wheel ALL=(ALL) ALL. . .
Come impostare le regole personalizzate
Ora che abbiamo familiarizzato con la sintassi generale del file, creiamo alcune nuove regole.
Come creare alias
Il file sudoers
può essere organizzato più facilmente raggruppando le cose con vari tipi di “alias”.
Per esempio, possiamo creare tre diversi gruppi di utenti, con membri sovrapposti:
. . .User_Alias GROUPONE = abby, brent, carlUser_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant. . .
I nomi dei gruppi devono iniziare con una lettera maiuscola. Possiamo quindi permettere ai membri di GROUPTWO
di aggiornare il database apt
creando una regola come questa:
. . .GROUPTWO ALL = /usr/bin/apt-get update. . .
Se non specifichiamo un utente/gruppo da eseguire come, come sopra, sudo
è l’utente root.
Possiamo permettere ai membri di GROUPTHREE
di spegnere e riavviare la macchina creando un “alias di comando” e usandolo in una regola per GROUPTHREE
:
. . .Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restartGROUPTHREE ALL = POWER. . .
Creiamo un alias di comando chiamato POWER
che contiene comandi per spegnere e riavviare la macchina. Permettiamo poi ai membri di GROUPTHREE
di eseguire questi comandi.
Possiamo anche creare alias “Esegui come”, che possono sostituire la parte della regola che specifica l’utente con cui eseguire il comando:
. . .Runas_Alias WEB = www-data, apacheGROUPONE ALL = (WEB) ALL. . .
Questo permetterà a chiunque sia membro di GROUPONE
di eseguire comandi come utente www-data
o utente apache
.
Basta tenere a mente che le regole successive sovrascriveranno le regole precedenti quando c’è un conflitto tra le due.
Come bloccare le regole
Ci sono diversi modi per ottenere un maggiore controllo su come sudo
reagisce a una chiamata.
Il comando updatedb
associato al pacchetto mlocate
è relativamente innocuo su un sistema a singolo utente. Se vogliamo permettere agli utenti di eseguirlo con privilegi di root senza dover digitare una password, possiamo fare una regola come questa:
. . .GROUPONE ALL = NOPASSWD: /usr/bin/updatedb. . .
NOPASSWD
è un “tag” che significa che non verrà richiesta alcuna password. Ha un comando compagno chiamato PASSWD
, che è il comportamento predefinito. Un tag è rilevante per il resto della regola a meno che non sia annullato dal suo tag “gemello” più avanti nella linea.
Per esempio, possiamo avere una linea come questa:
. . .GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill. . .
Un altro tag utile è NOEXEC
, che può essere usato per prevenire alcuni comportamenti pericolosi in alcuni programmi.
Per esempio, alcuni programmi, come less
, possono generare altri comandi digitando questo dall’interno della loro interfaccia:
!command_to_run
Questo fondamentalmente esegue qualsiasi comando dato dall’utente con gli stessi permessi che less
sta usando, il che può essere abbastanza pericoloso.
Per limitare questo, potremmo usare una linea come questa:
. . .username ALL = NOEXEC: /usr/bin/less. . .
Informazioni varie
Ci sono alcune altre informazioni che possono essere utili quando si tratta di sudo
.
Se si è specificato un utente o un gruppo da “eseguire come” nel file di configurazione, è possibile eseguire i comandi come quegli utenti utilizzando i flag -u
e -g
, rispettivamente:
- sudo -u run_as_user command
- sudo -g run_as_group command
Per comodità, per impostazione predefinita, sudo
salverà i vostri dettagli di autenticazione per un certo periodo di tempo in un terminale. Questo significa che non dovrai digitare di nuovo la tua password fino allo scadere di quel timer.
Per motivi di sicurezza, se volete cancellare questo timer quando avete finito di eseguire comandi amministrativi, potete eseguire:
- sudo -k
Se, d’altra parte, volete “innescare” il comando sudo
in modo che non vi venga richiesto in seguito, o per rinnovare il vostro sudo
lease, potete sempre digitare:
- sudo -v
Vi verrà richiesta la vostra password, che verrà memorizzata nella cache per usi successivi sudo
fino alla scadenza del sudo
periodo di tempo.
Se vi state semplicemente chiedendo che tipo di privilegi sono definiti per il vostro nome utente, potete digitare:
- sudo -l
Questo elencherà tutte le regole nel file /etc/sudoers
che si applicano al vostro utente. Questo vi dà una buona idea di ciò che vi sarà o non vi sarà permesso di fare con sudo
come qualsiasi utente.
Ci sono molte volte in cui eseguirete un comando e questo fallirà perché avete dimenticato di anteporlo a sudo
. Per evitare di dover ridigitare il comando, si può sfruttare una funzionalità di bash che significa “ripeti l’ultimo comando”:
- sudo !!
Il doppio punto esclamativo ripeterà l’ultimo comando. Lo abbiamo preceduto con sudo
per cambiare rapidamente il comando non privilegiato in un comando privilegiato.
Per divertirvi, potete aggiungere la seguente linea al vostro file /etc/sudoers
con visudo
:
- sudo visudo
. . .Defaults insults. . .
Questo farà sì che sudo
restituisca uno stupido insulto quando un utente digita una password errata per sudo
. Possiamo usare sudo -k
per cancellare la precedente sudo
password nella cache per provarla:
- sudo -k
- sudo ls
Output password for demo: # enter an incorrect password here to see the resultsYour mind just hasn't been the same since the electro-shock, has it? password for demo: My mind is going. I can feel it.
Conclusione
Ora dovreste avere una comprensione di base di come leggere e modificare il file sudoers
, e una comprensione dei vari metodi che potete usare per ottenere i privilegi di root.
Ricordate che i privilegi di super-utente non sono dati agli utenti regolari per un motivo. È essenziale che capiate cosa fa ogni comando che eseguite con i privilegi di root. Non prendete la responsabilità alla leggera. Imparate il modo migliore di usare questi strumenti per il vostro caso d’uso, e bloccate ogni funzionalità che non è necessaria.