Introduzione
La separazione dei privilegi è uno dei paradigmi di sicurezza fondamentali implementati nei sistemi operativi Linux e 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 più ampio.
A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.
In questo articolo, discuteremo di come ottenere correttamente e in modo sicuro i privilegi di root, con un focus particolare sulla modifica del file /etc/sudoers
.
Completiamo questi passaggi su un server Ubuntu 20.04, ma la maggior parte delle moderne distribuzioni Linux come Debian e CentOS dovrebbero funzionare in modo simile.
Questa guida presuppone che tu abbia già completato la configurazione iniziale del server discussa qui. Accedi al tuo server come utente regolare, non root, e continua di seguito.sudoers
. Se vuoi solo aggiungere privilegi sudo
a un utente, consulta i nostri tutorial rapidi
Nota: Questo tutorial approfondisce l’escalation dei privilegi e il file sudoers
. Se vuoi solo aggiungere i privilegi sudo
a un utente, consulta i nostri tutorial introduttivi Come Creare un Nuovo Utente Abilitato a Sudo per Ubuntu e CentOS.
Come Ottenere I Privilegi Di Root
Ci sono tre modi basilari per ottenere i privilegi root, che variano in base al livello di sofisticazione.
Effettuare l’accesso come Root
Il metodo più semplice e diretto per ottenere i privilegi root è accedere direttamente al tuo server come utente root.
Se stai accedendo a una macchina locale (o utilizzando una funzione di console fuori banda su un server virtuale), inserisci root
come nome utente al prompt di accesso e inserisci la password root quando richiesto.
Se stai accedendo tramite SSH, specifica l’utente root prima dell’indirizzo IP o del nome di dominio nella stringa di connessione SSH:
Se non hai impostato le chiavi SSH per l’utente root, inserisci la password root quando richiesto.
Utilizzando su
per diventare Root
L’accesso diretto come root di solito non è raccomandato, perché è facile iniziare ad utilizzare il sistema per compiti non amministrativi, il che è pericoloso.
Il modo successivo per ottenere i privilegi di superutente ti permette di diventare l’utente root in qualsiasi momento, quando ne hai bisogno.
Possiamo farlo invocando il comando su
, che sta per “sostituisci utente”. Per ottenere i privilegi root, digita:
Ti verrà richiesta la password dell’utente root, dopodiché, verrai lasciato in una sessione di shell root.
Quando hai finito le attività che richiedono i privilegi root, ritorna alla tua shell normale digitando:
Utilizzando sudo
per eseguire comandi come Root
Il modo finale di ottenere i privilegi root di cui parleremo è con il comando sudo
.
Il comando sudo
ti consente di eseguire comandi singoli con privilegi root, senza la necessità di generare una nuova shell. Viene eseguito in questo modo:
A differenza di su
, il comando sudo
richiederà la password dell’utente corrente, non la password dell’utente root.
A causa delle sue implicazioni sulla sicurezza, l’accesso al comando sudo
non viene concesso agli utenti per impostazione predefinita e deve essere configurato prima che funzioni correttamente. Dai un’occhiata ai nostri tutorial introduttivi Come creare un utente abilitato al sudo per Ubuntu e CentOS per imparare come impostare un utente abilitato al sudo
.
Nella sezione successiva, discuteremo come modificare la configurazione del sudo
in modo più dettagliato.
Cos’è Visudo?
Il comando sudo
viene configurato attraverso un file situato in /etc/sudoers
.
Attenzione: Non modificare mai questo file con un normale editor di testo! Usa sempre invece il comando visudo
!
Poiché una sintassi impropria nel file /etc/sudoers
può lasciarti con un sistema rotto in cui è impossibile ottenere privilegi elevati, è importante utilizzare 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. Ciò previene errori di configurazione che impedirebbero operazioni sudo
, che potrebbero essere il tuo unico modo per ottenere privilegi root.
Tradizionalmente, visudo
apre il file /etc/sudoers
con l’editor di testo vi
. Tuttavia, Ubuntu ha configurato visudo
per utilizzare l’editor di testo nano
invece.
Se desideri ripristinarlo su vi
, esegui il seguente comando:
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 mode
Press <enter> to keep the current choice[*], or type selection number:
Seleziona il numero corrispondente alla scelta che desideri effettuare.
Su CentOS, puoi cambiare questo valore aggiungendo la seguente riga al tuo ~/.bashrc
:
Innesti il file per implementare le modifiche:
Dopo aver configurato visudo
, esegui il comando per accedere al file /etc/sudoers
:
Come Modificare il File Sudoers
Ti verrà presentato il file /etc/sudoers
nel tuo editor di testo selezionato.
I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers
file has many more lines, some of which we will not discuss in this guide.
Defaults env_reset
Defaults mail_badpass
Defaults 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 righe.
Linee Predefinite
La prima riga, Defaults env_reset
, ripristina l’ambiente della shell per rimuovere eventuali variabili utente. Questa è una misura di sicurezza utilizzata per cancellare potenzialmente dannose variabili ambientali dal sessione sudo
.
La seconda riga, Defaults mail_badpass
, indica al sistema di inviare notifiche di tentativi di password sudo
errati all’utente configurato mailto
. Per impostazione predefinita, questo è il root account.
La terza riga, che inizia con Defaults secure_path=...
, specifica il PATH
(i luoghi nel file system in cui il sistema operativo cercherà applicazioni) che verrà utilizzato per le operazioni sudo
. Questo impedisce l’uso di percorsi utente che potrebbero essere dannosi.
Linee di Privilegio Utente
La quarta riga, che determina i privilegi sudo
dell’utente root, è diversa dalle righe precedenti. Diamo un’occhiata a cosa significano i diversi campi:
-
root ALL=(ALL:ALL) ALL
Il primo campo indica il nome utente a cui si applicherà la regola (root). -
root ALL=(ALL:ALL) ALL
Il primo “ALL” indica che questa regola si applica a tutti i 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.
Ciò significa che il nostro utente root può eseguire qualsiasi comando utilizzando sudo
, a patto di fornire la propria password.
Linee di Privilegio del Gruppo
Le prossime due linee sono simili alle linee di privilegio dell’utente, 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.
Riga Inclusa /etc/sudoers.d
L’ultima linea potrebbe sembrare un commento a prima vista:
. . .
#includedir /etc/sudoers.d
Inizia effettivamente con un #
, che di solito indica un commento. Tuttavia, questa linea indica in realtà che i file all’interno della directory /etc/sudoers.d
verranno presi in considerazione e applicati.
I file all’interno di quella directory seguono le stesse regole del file /etc/sudoers
stesso. Qualsiasi file che non termini con ~
e che non abbia un .
in esso verrà letto e aggiunto alla configurazione sudo
.
Questo è principalmente pensato per le applicazioni che modificano i privilegi sudo
durante l’installazione. Mettere tutte le regole associate in un unico file nella directory /etc/sudoers.d
può rendere facile capire quali privilegi sono associati a quali account e invertire facilmente le credenziali senza dover manipolare direttamente il file /etc/sudoers
.
Come con il file /etc/sudoers
stesso, dovresti sempre modificare i file all’interno della directory /etc/sudoers.d
con visudo
. La sintassi per modificare questi file sarebbe:
Come concedere a un utente i privilegi sudo
L’operazione più comune che gli utenti vogliono eseguire quando gestiscono i permessi sudo
è concedere a un nuovo utente l’accesso generale sudo
. Questo è utile se vuoi dare a un account l’accesso amministrativo completo al sistema.
Il modo più semplice per farlo su un sistema configurato con un gruppo amministrativo generico, come l’Ubuntu utilizzato in questa guida, è in realtà aggiungere l’utente in questione a quel gruppo.
Ad esempio, su Ubuntu 20.04, il gruppo sudo
ha privilegi di amministratore completi. Possiamo concedere all’utente gli stessi privilegi aggiungendolo al gruppo in questo modo:
Il comando gpasswd
può anche essere utilizzato:
Entrambi faranno la stessa cosa.
Su CentOS, di solito si tratta del gruppo wheel
invece del gruppo sudo
:
Oppure, utilizzando gpasswd
:
Su CentOS, se aggiungere l’utente al gruppo non funziona immediatamente, potrebbe essere necessario modificare il file /etc/sudoers
per scommentare il nome del gruppo:
. . .
%wheel ALL=(ALL) ALL
. . .
Come impostare regole personalizzate
Ora che ci siamo familiarizzati con la sintassi generale del file, creiamo alcune nuove regole.
Come creare alias
Il file sudoers
può essere organizzato più facilmente raggruppando cose con vari tipi di “alias”.
Ad esempio, possiamo creare tre gruppi diversi di utenti, con appartenenze sovrapposte:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
I nomi dei gruppi devono iniziare con una lettera maiuscola. Quindi possiamo 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 sopra, sudo
predefinisce l’utente root.
Possiamo permettere ai membri di GROUPTHREE
di spegnere e riavviare la macchina creando un “alias comando” e utilizzando quello in una regola per GROUPTHREE
:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
Creiamo un alias di comando chiamato POWER
che contiene comandi per spegnere e riavviare la macchina. Quindi consentiamo ai membri di GROUPTHREE
di eseguire questi comandi.
Possiamo anche creare alias “Run as”, che possono sostituire la parte della regola che specifica l’utente da utilizzare per eseguire il comando:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Ciò consentirà a chiunque sia membro di GROUPONE
di eseguire comandi come utente www-data
o utente apache
.
Tieni presente 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 in un sistema monoutente. Se vogliamo consentire agli utenti di eseguirlo con privilegi root senza dover digitare una password, possiamo creare 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 venga sovrascritto dal suo “gemello” tag più avanti nella linea.
Ad esempio, possiamo avere una riga come questa:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
Un’altra etichetta utile è NOEXEC
, che può essere utilizzata per prevenire alcuno comportamento pericoloso in alcuni programmi.
Ad esempio, alcuni programmi, come less
, possono generare altri comandi digitando questo dall’interno della loro interfaccia:
!command_to_run
Questo esegue praticamente qualsiasi comando che l’utente gli dà con le stesse autorizzazioni con cui less
è in esecuzione, il che può essere piuttosto pericoloso.
Per limitare questo, potremmo utilizzare una riga come questa:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Informazioni varie
Ci sono alcuni altri pezzi di informazioni che potrebbero essere utili quando si ha a che fare con sudo
.
Se hai specificato un utente o un gruppo da “eseguire come” nel file di configurazione, puoi eseguire comandi come quegli utenti utilizzando le opzioni -u
e -g
, rispettivamente:
Per comodità, per impostazione predefinita, sudo
salverà i tuoi dettagli di autenticazione per un certo periodo di tempo in un terminale. Ciò significa che non dovrai digitare di nuovo la tua password fino a quando il timer non scadrà.
Per motivi di sicurezza, se desideri cancellare questo timer quando hai finito di eseguire comandi amministrativi, puoi eseguire:
Se, d’altra parte, vuoi “preparare” il comando sudo
in modo da non essere richiesto in seguito, o per rinnovare il tuo contratto sudo
, puoi sempre digitare:
Ti verrà richiesto il tuo password, che verrà memorizzato per i successivi usi di sudo
fino a quando il periodo di tempo di sudo
scade.
Se stai semplicemente chiedendoti quali privilegi sono definiti per il tuo nome utente, puoi digitare:
Questo elencherà tutte le regole nel file /etc/sudoers
che si applicano al tuo utente. Questo ti dà una buona idea di ciò che sarai in grado di fare o non sarai in grado di fare con sudo
come qualsiasi utente.
Ci sono molti momenti in cui eseguirai un comando e fallirà perché hai dimenticato di precederlo con sudo
. Per evitare di dover ricaricare il comando, puoi sfruttare una funzionalità bash che significa “ripeti l’ultimo comando”:
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 divertirti, puoi aggiungere la seguente riga al tuo file /etc/sudoers
con visudo
:
. . .
Defaults insults
. . .
Questo farà in modo che sudo
restituisca un insulto sciocco quando un utente digita una password errata per sudo
. Possiamo usare sudo -k
per cancellare la password precedente di sudo
memorizzata nella cache per provarlo:
Output[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
Conclusione
Ora dovresti avere una comprensione di base di come leggere e modificare il file sudoers
e una presa sulle varie modalità che puoi utilizzare per ottenere i privilegi di root.
Ricorda, i privilegi di super utente non vengono dati agli utenti regolari per un motivo. È essenziale che tu comprenda cosa fa ogni comando che esegui con i privilegi di root. Non prendere alla leggera questa responsabilità. Impara il modo migliore per utilizzare questi strumenti per il tuo caso d’uso e blocca qualsiasi funzionalità non necessaria.
Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file