Come Modificare il File Sudoers

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.Nota: Questo tutorial approfondisce l’escalation dei privilegi e il file sudoers. Se vuoi solo aggiungere privilegi sudo a un utente, consulta i nostri tutorial rapidi Come Creare un Nuovo Utente Abilitato a Sudo per Ubuntu e CentOS.

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:

  1. ssh root@server_domain_or_ip

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:

  1. su

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:

  1. exit

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:

  1. sudo command_to_execute

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:

  1. sudo update-alternatives --config editor
Output
There 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:

  1. export EDITOR=`which name_of_editor`

Innesti il file per implementare le modifiche:

  1. . ~/.bashrc

Dopo aver configurato visudo, esegui il comando per accedere al file /etc/sudoers:

  1. sudo visudo

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.

/etc/sudoers
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:

/etc/sudoers
. . .

#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:

  1. sudo visudo -f /etc/sudoers.d/file_to_edit

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:

  1. sudo usermod -aG sudo username

Il comando gpasswd può anche essere utilizzato:

  1. sudo gpasswd -a username sudo

Entrambi faranno la stessa cosa.

Su CentOS, di solito si tratta del gruppo wheel invece del gruppo sudo:

  1. sudo usermod -aG wheel username

Oppure, utilizzando gpasswd:

  1. sudo gpasswd -a username wheel

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:

  1. sudo visudo
/etc/sudoers
. . .
%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:

/etc/sudoers
. . .
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:

/etc/sudoers
. . .
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:

/etc/sudoers
. . .
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:

/etc/sudoers
. . .
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:

/etc/sudoers
. . .
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:

/etc/sudoers
. . .
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:

/etc/sudoers
. . .
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:

  1. sudo -u run_as_user command
  2. sudo -g run_as_group command

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:

  1. sudo -k

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:

  1. sudo -v

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:

  1. sudo -l

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”:

  1. 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 divertirti, puoi aggiungere la seguente riga al tuo file /etc/sudoers con visudo:

  1. sudo visudo
/etc/sudoers
. . .
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:

  1. sudo -k
  2. sudo ls
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