Configurare SUDO per gestire le attività degli amministratori: differenze tra le versioni

 
(28 versioni intermedie di 3 utenti non mostrate)
Riga 3: Riga 3:
''Sudo'' è un programma progettato per permettere ad alcuni utenti di eseguire certi comandi come [[root]] (o altro utente).
''Sudo'' è un programma progettato per permettere ad alcuni utenti di eseguire certi comandi come [[root]] (o altro utente).


La filosofia alla base della sua creazione in particolare è stata quella di consentire pieni [[privilegi di amministratore]] a meno comandi possibili, ma permettere ancora di compiere determinate attività di amministrazione. ''Sudo'' è anche un modo efficace per registrare l'attività di root: chi ha usato <code>sudo</code>, con che comando e quando.
La filosofia alla base della sua creazione in particolare è stata quella di consentire pieni [[privilegi di amministrazione]] a meno comandi possibili, ma permettere ancora di compiere determinate attività di amministrazione. ''Sudo'' è anche un modo efficace per registrare l'attività di root: chi ha usato <code>sudo</code>, con che comando e quando.


Su Debian, a partire da Squeeze <code>sudo</code> è installato e abilitato, se è stato scelto il metapacchetto Desktop durante l'installazione), ma di default nessun utente può usarlo, a meno che in fase di installazione si sia disabilitato [[root]].
A partire da Squeeze in Debian <code>sudo</code> è installato e abilitato, se è stato scelto il metapacchetto Desktop durante l'installazione, ma di default nessun utente può usarlo a meno che in fase di installazione si sia disabilitato l'account [[root]].


=== Perché ''sudo'' ===
=== Perché ''sudo'' ===
Riga 13: Riga 13:
* In una shell i comandi vengono eseguiti come utente corrente (cioè non privilegiato) e per impostazione predefinita non viene avviata una shell privilegiata, permettendo di evitare errori. Solo i comandi preceduti da sudo vengono eseguiti come [[root]].
* In una shell i comandi vengono eseguiti come utente corrente (cioè non privilegiato) e per impostazione predefinita non viene avviata una shell privilegiata, permettendo di evitare errori. Solo i comandi preceduti da sudo vengono eseguiti come [[root]].
* Verifica/registrazione: quando un comando è eseguito con sudo il nome dell'utente e il comando sono registrati.
* Verifica/registrazione: quando un comando è eseguito con sudo il nome dell'utente e il comando sono registrati.
Per le ragioni esposte, utilizzare una [[shell]] privilegiata con <code>sudo -i</code> (<code>sudo -s</code>, <code>sudo sh</code>, <code>sudo su</code> ed equivalenti) è generalmente sconsigliato perché annulla le caratteristiche di cui sopra. Nel seguito della guida vedremo come disabilitare questa possibilità.
Per le ragioni esposte, utilizzare una [[shell]] privilegiata con <code>sudo -i</code> (oppure <code>sudo -s</code>, <code>sudo sh</code>, <code>sudo su</code> e varianti simili) è generalmente sconsigliato perché annulla le caratteristiche di cui sopra. Nel seguito della guida vedremo come disabilitare questa possibilità.


Si noti che per un sistema con un singolo utente, che è il caso per la maggior parte degli utenti desktop, i benefici di ottenere [[privilegi di amministratore]] con <code>sudo</code> sono inesistenti rispetto all'uso di <code>su</code>, se si permette di eseguire una shell come [[root]]. Sarebbe invece necessario studiare il file di configurazione e personalizzarlo in modo opportuno, restringendone l'uso il più possibile, cercando il giusto compromesso tra sicurezza e comodità d'uso.
Si noti che per un sistema con un singolo utente, che è il caso per la maggior parte degli utenti desktop, i benefici di ottenere [[privilegi di amministrazione]] con <code>sudo</code> sono inesistenti rispetto all'uso di <code>su</code>, se si permette di eseguire una shell come [[root]]. Sarebbe invece necessario studiare il file di configurazione e personalizzarlo in modo opportuno, restringendone l'uso il più possibile, cercando il giusto compromesso tra sicurezza e comodità d'uso.
 
Di default inoltre <code>sudo</code> permette l'esecuzione di comandi successivi senza ulteriore richiesta di password, se entro 15 minuti (rinnovabili) dall'ultima richiesta e sulla stessa console o terminale.


== Installazione ==
== Installazione ==
Per installare <code>sudo</code>, se non è presente, su Debian basta installare il [[pacchetto]] '''sudo'''. Per esempio con [[apt-get]] e [[privilegi di amministratore]] basta:
Per installare <code>sudo</code>, se non è presente, su Debian basta installare il [[pacchetto]] '''sudo'''. Per esempio con [[apt-get]] e [[privilegi di amministrazione]] basta:
<pre>
<pre>
# apt-get install sudo
# apt-get install sudo
Riga 24: Riga 26:


== Configurazione ==
== Configurazione ==
Il file di configurazione di <code>sudo</code> (<code>/etc/sudoers</code>) è già preconfigurato per permettere un utente di eseguire ogni comando come amministratore, se appartiene al gruppo <code>sudo</code>.
Per modificare il file di configurazione, anziche modificare direttamente <code>/etc/sudoers</code>, è consigliato l'uso del comando <code>visudo</code>, che effettua anche un controllo sulla sintassi utilizzata. Ed è l'unico modo per trarre beneficio dalla flessibilità permessa da <code>sudo</code>, in genere a spese della comodità d'uso.


Ciò '''non''' significa che si debba aggiungere il proprio utente a tale gruppo, specialmente se l'account [[root]] è attivo. Va fatto soltanto se si vuole utilizzare <code>sudo</code> come sostituto per tutte le attività di amministrazione.
=== Gruppo sudo ===
Comunque il file di configurazione di <code>sudo</code> è già preconfigurato per permettere a un utente di eseguire ogni comando come [[privilegi di amministrazione|amministratore]], se appartiene al gruppo <code>sudo</code>. Quindi non è necessario apportare modifiche al file di configurazione se si intende permettere al proprio utente di svolgere qualsiasi comando, previa richiesta della propria password.


Se è questo il caso, per aggiungere il proprio utente, per esempio ''pippo'', al gruppo ''sudo'' va eseguito:
Ciò '''non''' significa però che si ''debba'' aggiungere il proprio utente a tale gruppo, specialmente se l'account [[root]] è attivo. Va fatto soltanto se si vuole utilizzare <code>sudo</code>, con il proprio account, come sostituto per tutte le attività di amministrazione. Non si otterrebbe alcun beneficio in termini di sicurezza, se è anche l'unico account del sistema, si avrebbe solo la comodità di doversi ricordare un'unica password.
 
Se è questo il caso, per aggiungere il proprio utente (per esempio ''pippo'') al gruppo ''sudo'' va eseguito:
<pre>
<pre>
# adduser pippo sudo
# adduser pippo sudo
Riga 35: Riga 40:
È necessario un logout e un nuovo login per risultare iscritti al gruppo.
È necessario un logout e un nuovo login per risultare iscritti al gruppo.


Si può verificare di essere membri di ''sudo'', digitando '''senza''' privilegi di amministratore:
Si può verificare di essere membri di ''sudo'', digitando '''senza''' privilegi di amministrazione:
<pre>
<pre>
$ groups
$ groups
</pre>
</pre>
 
Che restituisce l'elenco dei gruppi cui appartiene l'utente corrente (<code>pippo</code> nel nostro esempio) in modo simile a questo:
Eventualmente, per modificare il file di configurazione, è consigliato l'uso del comando <code>visudo</code>, che effettua anche un controllo sulla sintassi utilizzata.
<pre>
pippo users sudo
</pre>
Il nostro utente pippo è effettivamente membro di ''sudo'' solo se tra i vari gruppi elencati compare proprio <code>sudo</code>.


Per rimuoversi invece da tale gruppo, se per esempio il proprio utente si chiama ''pippo'', basta:
Per rimuoversi invece da tale gruppo, se per esempio il proprio utente si chiama ''pippo'', basta:
Riga 46: Riga 54:
# deluser pippo sudo
# deluser pippo sudo
</pre>
</pre>
Prima di questo comando si consiglia di ottenere i [[privilegi di amministratore]] con l'uso di <code>su</code>, per verificare che l'account [[root]] è attivo prima di rimuoversi dal gruppo.
Prima di questo comando si consiglia di ottenere i [[privilegi di amministrazione]] con l'uso di <code>su -</code>, per verificare che l'account [[root]] è attivo prima di rimuoversi dal gruppo.
 
==== Disabilitare su e root ====
Se si modifica la configurazione di default per poter utilizzare <code>sudo</code> con tutti i comandi, si consiglia che almeno sia l'unico modo per diventare amministratori, nel caso l'account [[root]] esista.
 
Per disabilitare soltanto l'uso di <code>su</code>, senza disabilitare l'account di '''root''', è sufficiente:
<pre>
$ sudo nano /etc/pam.d/su
</pre>
E decommentare (rimuovere il carattere '''#''' iniziale) dalla linea:
<pre>#auth      required pam_wheel.so</pre>
dopodiché salvare premendo <code>Ctrl-o</code> e uscire con <code>Ctrl-x</code>. Nessuno potrà utilizzarlo, se non i membri del gruppo '''root''' (oppure '''wheel''', se creato), ovvero soltanto lo stesso amministratore.
 
Per ripristinare tutto è sufficiente annullare le proprie modifiche, ripetendo il comando precedente e ricommentando con '''#''' la riga:
<pre>auth      required pam_wheel.so</pre>


=== Disabilitare root ===
Se si vuole invece disabilitare l'account di [[root]], digitare il seguente comando:
Se si intende utilizzare soltanto <code>sudo</code> per tutti i comandi, si consiglia di disabilitare l'utente [[root]], così da disporre di un unico modo per diventare amministratori. Per disabilitare l'utente ''root'' digitare il seguente comando:
<pre>
<pre>
$ sudo passwd --lock root
$ sudo usermod --lock --expiredate 1 root
</pre>
</pre>
Ora è possibile ottenere i [[privilegi di amministratore]] soltanto utilizzando <code>sudo</code>, scrivendolo prima del comando da eseguire come amministratore.
Ora è possibile ottenere i [[privilegi di amministrazione]] soltanto utilizzando <code>sudo</code>, scrivendolo prima del comando da eseguire come amministratore.


Non sarà possibile né effettuare il login come utente ''root'', né utilizzare il comando <code>su</code>.
Non sarà possibile né effettuare il login come utente ''root'', né utilizzare il comando <code>su</code>.
Riga 59: Riga 80:
Per riattivare [[root]], permettendo nuovamente sia il login che l'utilizzo di <code>su</code>, dare invece il seguente comando:
Per riattivare [[root]], permettendo nuovamente sia il login che l'utilizzo di <code>su</code>, dare invece il seguente comando:
<pre>
<pre>
$ sudo passwd --unlock root
$ sudo usermod --unlock --expiredate "" root
</pre>
 
Si noti che è necessario anche assegnargli una password, se l'account non era mai stato attivo o ne fosse sprovvisto:
<pre>
$ sudo passwd
</pre>
</pre>


=== Esempio di configurazione ===
=== Esempio di configurazione ===
Per modificare il file di configurazione, con [[privilegi di amministratore]] digitare:
Per modificare invece il file di configurazione per sfruttare la flessibilità di <code>sudo</code>, con [[privilegi di amministrazione]] digitare:
<pre>
<pre>
# visudo
# visudo
</pre>
Equivalentemente con <code>sudo</code>, se abilitato per tutti i comandi, il comando di prima può essere digitato come segue con i privilegi del proprio utente:
<pre>
$ sudo visudo
</pre>
</pre>


Riga 81: Riga 103:
#
#


Defaults        env_reset
Defaults        env_reset, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


# Configurazione di default per root
# Configurazione di default per root
Riga 99: Riga 121:


# Definisco degli alias per i comandi che voglio impedire
# Definisco degli alias per i comandi che voglio impedire
Cmnd_Alias  NSHELLS = /bin/sh,/bin/bash
Cmnd_Alias  NSHELLS = /bin/sh, /bin/bash, /bin/dash
Cmnd_Alias  NSU = /bin/su
Cmnd_Alias  NSU = /bin/su
Cmnd_Alias  NVISUDO = /usr/sbin/visudo
Cmnd_Alias  NVISUDO = /usr/sbin/visudo
Riga 113: Riga 135:
# modificare la configurazione di sudo
# modificare la configurazione di sudo
SUPERUSERS ALL = ALL, !NSHELLS, !NSU, !NVISUDO
SUPERUSERS ALL = ALL, !NSHELLS, !NSU, !NVISUDO
</pre>


</pre>
==== Valutazioni di sicurezza ====
 
Le restrizioni operate con '''!''' non sono '''MAI''' realmente efficaci contro malintenzionati se si permette l'uso di ''ALL'', vista la difficoltà di immaginare a priori tutti i comandi possibili. Al limite comunicano che i SUPERUSERS non dovrebbero eseguire tali comandi o equivalenti con lo stesso effetto.
 
Non sarebbe vietato agire su un dispositivo in /dev, caricare nuovi moduli nel kernel, avviare altri interpreti (<code>awk</code>, <code>perl</code>, <code>python</code>, ...), eseguibili con una shell di escape (in grado di avviare una shell, tra cui perfino <code>more</code>, <code>less</code>, <code>w3m</code>, ... ) e in generale comandi in grado di avviarne altri (<code>env</code>, <code>find</code>, ...), comandi che avviano più sessioni della shell (<code>screen</code>, <code>tmux</code>, ... ) o emulatori di terminali (<code>xterm</code>, <code>uxterm</code>, <code>lxterm</code>, ...), comandi per alterare la password o l'[[UID]] degli utenti del sistema oppure per crearne altri di privilegiati (<code>passwd</code>, <code>usermod</code>, <code>adduser</code>, <code>useradd</code>, ...), editor di testo (<code>nano</code>, <code>vi</code>, <code>ed</code>, ...) o qualsiasi comando in grado di alterare il contenuto di un file o i suoi permessi (<code>cp</code>, <code>mv</code>, <code>sed</code>, <code>tee</code>, <code>dd</code>, <code>chmod</code>, <code>chown</code>, ...) per poter modificare <code>/etc/sudoers</code>, <code>/etc/passwd</code>, <code>/etc/shadow</code>, <code>/etc/group</code> o qualunque file (anche uno script d'avvio) utilizzabile per ottenere massimi privilegi.
 
Se anche tutti questi e tutti quelli utilizzabili per gli stessi exploit venissero vietati, e si noti che si impedirebbero molti comandi utili in situazioni generali, sarebbe sempre possibile fare copie di una shell con altri nomi e creare nuovi eseguibili, perfino banali script, che modificano file con [[privilegi di amministrazione]] o avviano una [[shell]] privilegiata.


'''L'unico modo''' per restringere le attività che un utente può eseguire come amministratore è limitarlo a una '''lista predeterminata''' di eseguibili, secondo un approccio di tipo ''whitelist'' anziché ''blacklist'', valutando singolarmente che non siano sfruttabili anche per altre azioni, come per esempio eseguire una shell o alterare il sistema in modo arbitrario.


{{Warningbox | Le restrizioni operate con '''!''' non sono '''MAI''' realmente efficaci contro malintenzionati se si permette l'uso di ''ALL'', vista la difficoltà di immaginare a priori tutti i comandi possibilit. Al limite comunicano che i SUPERUSERS non dovrebbero eseguire tali comandi o equivalenti con lo stesso effetto.
E si noti che perfino rimuovendo ''ALL'' il solo <code>dpkg</code>, utilizzabile dagli ADMIN, è in grado di installare software esterno a Debian, creabile da chiunque se in forma di [[pacchetto|pacchetto deb]], e può essere quindi sfruttato per ottenere pieni privilegi di amministrazione. E anche i comandi <code>apt-get</code> e <code>aptitude</code> durante un aggiornamento, in presenza di configurazioni cambiate, possono permettere di accedere a una shell con permessi di [[root]].


Infatti le restrizioni sono facilmente aggirabili modificando direttamente <code>/etc/sudoers</code> con un editor qualsiasi e, se anche questi venissero ristretti, sarebbe sempre possibile fare copie di una shell con altri nomi e perfino creare nuovi eseguibili che modifichino file con [[privilegi di amministratore]].
Questo per dire che a volte la sicurezza ottenuta da tali file di configurazione, pur riducendo di molto gli usi consentiti, è soltanto apparente senza un'attenta valutazione delle conseguenze per ogni comando permesso. E spesso, come nell'esempio precedente, non è possibile impedirne l'abuso senza togliere anche la possibilità di svolgere un'attività di amministrazione, il che non è sempre accettabile. Le regole scritte nel file di configurazione in questi casi servono a comunicare a un amministratore minore le funzioni che è autorizzato a svolgere, che possono essere monitorate tramite i log delle attività, predisponendo dei sistemi di protezione (hardware o tramite ''Mandatory Access Control'') che ne garantiscano l'integrità.


L'unico modo per restringere le attività che un utente può eseguire come amministratore è limitarlo a una lista predeterminata di eseguibili, valutando singolarmente che non siano sfruttabili anche per altre azioni, come per esempio eseguire una shell o alterare il sistema in modo arbitrario.}}
Va considerato comunque che utilizzare una lista ridotta di comandi, per quanto sia a volte possibile abusarli per ottenere pieni privilegi ed eseguire qualsiasi comando, almeno riduce sempre le possibilità di eseguire inavvertitamente del software malevolo. E le restrizioni operate con ''ALL'', per quanto sempre facilmente aggirabili, disabilitano almeno le opzioni di <code>sudo</code> che potrebbero essere usate per abitudine, rendendo più chiara l'analisi dei log e l'individuazione di possibili attività anomale.


== Esempio di sessione ''sudo'' ==
== Esempio di sessione ''sudo'' ==
Riga 136: Riga 166:
[sudo] password for utente1:
[sudo] password for utente1:
</pre>
</pre>
Nel caso si ricevesse la risposta:
 
Si ricordi che, di default, ogni successivo comando sulla stessa console o terminale '''non''' richiederà nuovamente la password, finché non saranno passati 15 minuti dall'ultima richiesta. Si possono invalidare le credenziali memorizzate, comportando la richiesta di password per i comandi successivi, eseguendo manualmente:
<pre>$ sudo -k</pre>
oppure al contrario, se non sono ancora scadute, si possono validare per altri 15 minuti dall'esecuzione di:
<pre>$ sudo -v</pre>
 
Per personalizzare i minuti di timeout si deve modificare con <code>visudo</code> il file di configurazione per aggiungere in cima al file:
<pre>Defaults timestamp_timeout=MINUTI</pre>
 
Nel caso dopo l'esecuzione di un comando con <code>sudo</code> si ricevesse la risposta:
<pre>
<pre>
Spiacente, all'utente utente1 non è consentito eseguire '/usr/bin/comando' come root su localhost
Spiacente, all'utente utente1 non è consentito eseguire '/usr/bin/comando' come root su localhost
</pre>
</pre>
significa che sono stati impostati in maniera incorretta i privilegi sudo dell'utente.
significa che l'utente non ha i permessi, in base al file di configurazione creato, di eseguire tale comando.


== File di log ==
== File di log ==
Riga 152: Riga 191:
| Verificata_da =
| Verificata_da =
: [[Utente:Stemby|Stemby]]
: [[Utente:Stemby|Stemby]]
: [[Utente:HAL 9000|HAL 9000]] 13:22, 1 set 2014 (CEST)
: [[Utente:HAL 9000|HAL 9000]] 14:03, 12 apr 2015 (CEST)
| Estesa_da =
| Estesa_da =
: [[Utente:Stemby|Stemby]]
: [[Utente:Stemby|Stemby]]
Riga 160: Riga 199:


[[Categoria:Shell]]
[[Categoria:Shell]]
[[Categoria:Monitoraggio]]
[[Categoria:Debian e sicurezza]]
2 972

contributi