3 155
contributi
Nessun oggetto della modifica |
Wtf (discussione | contributi) |
||
(41 versioni intermedie di 5 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili | {{Versioni compatibili}} | ||
== Introduzione == | |||
''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 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'' === | ||
Usare <code>sudo</code> in alcune circostanze è meglio (più sicuro) che aprire una sessione come [[root]], in particolare per i seguenti motivi: | |||
* Non c'è bisogno di password di root, ma sudo richiede la password dell'utente corrente. È fondamentale nel caso si debba permettere a più persone di svolgere attività di amministrazione, senza bisogno di condividere la stessa password. | |||
* 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. | |||
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 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 ''sudo'' | 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 27: | Riga 26: | ||
== Configurazione == | == Configurazione == | ||
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 | === 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. 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> | |||
# adduser pippo sudo | |||
</pre> | |||
È necessario un logout e un nuovo login per risultare iscritti al gruppo. | |||
Si può verificare di essere membri di ''sudo'', digitando '''senza''' privilegi di amministrazione: | |||
<pre> | |||
$ groups | |||
</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: | |||
<pre> | |||
# deluser pippo sudo | |||
</pre> | |||
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> | |||
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>. | |||
Per riattivare [[root]], permettendo nuovamente sia il login che l'utilizzo di <code>su</code>, dare invece il seguente comando: | |||
<pre> | |||
$ 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> | |||
=== Esempio di configurazione === | === Esempio di configurazione === | ||
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> | ||
Un esempio di configurazione può essere questo: | |||
<pre> | <pre> | ||
# /etc/sudoers | # /etc/sudoers | ||
Riga 44: | 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 62: | 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 76: | 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'' == | ||
Una tipica sessione di | Una tipica sessione di <code>sudo</code> si presenta così: | ||
<pre> | <pre> | ||
utente1@server $ sudo comando | utente1@server $ sudo comando | ||
Riga 92: | 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 == | ||
Il comando | Il comando <code>sudo</code> logga tutte le sue attività nel file <code>/var/log/auth.log</code> | ||
== Sitografia == | |||
* [http://wiki.debian.org/it/sudo Debian Wiki] | |||
{{Autori | |||
| Autore = [[Utente:Ferdybassi|Ferdybassi]] 12:42, 6 nov 2010 (CET) | |||
| Verificata_da = | |||
: [[Utente:Stemby|Stemby]] | |||
: [[Utente:HAL 9000|HAL 9000]] 14:03, 12 apr 2015 (CEST) | |||
| Estesa_da = | |||
: [[Utente:Stemby|Stemby]] | |||
: [[Utente:HAL 9000|HAL 9000]] | |||
| Numero_revisori = 2 | |||
}} | |||
[[Categoria:Shell]] | [[Categoria:Shell]] | ||
[[Categoria: | [[Categoria:Debian e sicurezza]] |
contributi