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

mNessun oggetto della modifica
 
(7 versioni intermedie di 2 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.


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]].
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]].
Riga 15: Riga 15:
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à.
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.


Per contro <code>sudo</code> di default permette l'esecuzione di comandi successivi senza ulteriore richiesta di password, se entro 15 minuti dall'ultima richiesta.
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 29: Riga 29:


=== Gruppo sudo ===
=== 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 amministratore|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.
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.


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.
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.
Riga 40: 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:
<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 49: 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 ====
==== Disabilitare su e root ====
Riga 69: Riga 74:
$ sudo usermod --lock --expiredate 1 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 84: Riga 89:


=== Esempio di configurazione ===
=== Esempio di configurazione ===
Per modificare invece il file di configurazione per sfruttare la flessibilità di <code>sudo</code>, 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
Riga 136: Riga 141:
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.
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>, ecc... ) 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>, ...), editor di testo (<code>nano</code>, <code>vi</code>, ...) o qualsiasi comando in grado di alterare il contenuto di un file o i suoi permessi (<code>cp</code>, <code>mv</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.
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 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 perfino creare nuovi eseguibili che modifichino file con [[privilegi di amministratore]].
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.
'''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.


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 amministratore. 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]].
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]].


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à.
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à.
Riga 162: Riga 167:
</pre>
</pre>


Si ricordi che, di default, ogni successivo comando '''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:
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>
<pre>$ sudo -k</pre>
e si possono personalizzare i minuti di timeout, modificando con <code>visudo</code> il file di configurazione per aggiungere in cima al file:
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>
<pre>Defaults timestamp_timeout=MINUTI</pre>


Riga 183: Riga 191:
| Verificata_da =
| Verificata_da =
: [[Utente:Stemby|Stemby]]
: [[Utente:Stemby|Stemby]]
: [[Utente:HAL 9000|HAL 9000]] 14:12, 6 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 191: Riga 199:


[[Categoria:Shell]]
[[Categoria:Shell]]
[[Categoria:Monitoraggio]]
[[Categoria:Debian e sicurezza]]
[[Categoria:Debian e sicurezza]]
3 155

contributi