3 155
contributi
m (→Configurazione) |
Wtf (discussione | contributi) |
||
(26 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 | 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]]. | |||
=== 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> | 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 | 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 | 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 26: | Riga 28: | ||
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. | 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. | ||
Comunque il file di configurazione di <code>sudo</code> è già preconfigurato per permettere a un utente di eseguire ogni comando come [[privilegi di | === 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. | |||
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. | 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: | Se è questo il caso, per aggiungere il proprio utente (per esempio ''pippo'') al gruppo ''sudo'' va eseguito: | ||
Riga 37: | 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 | 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 46: | Riga 54: | ||
# deluser pippo sudo | # deluser pippo sudo | ||
</pre> | </pre> | ||
Prima di questo comando si consiglia di ottenere i [[privilegi di | 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> | <pre> | ||
$ sudo | $ sudo nano /etc/pam.d/su | ||
</pre> | </pre> | ||
Ora è possibile ottenere i [[privilegi di | 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> | |||
Se si vuole invece disabilitare l'account di [[root]], digitare il seguente comando: | |||
<pre> | |||
$ sudo usermod --lock --expiredate 1 root | |||
</pre> | |||
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 | $ 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 | 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> | </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> | |||
==== 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. | |||
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à. | |||
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 | 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]] | : [[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: | [[Categoria:Debian e sicurezza]] |
contributi