Sebbene si limitino gli argomenti della riga di comando, nulla impedisce all'utente di utilizzare vim per aprire, modificare e sovrascrivere qualsiasi file casuale una volta che viene eseguito come root.
L'utente può eseguire sudo vim /etc/httpd/conf/httpd.conf
e quindi
- cancella tutto quel testo dal buffer di modifica
- quindi per comodità fonte un file esistente (anche se non è nemmeno necessario): ad esempio la configurazione sudo
:r /etc/sudoers
NOTA: A meno che non sia limitato da SELinux, l'utente può leggere qualsiasi file in questo modo!
- concedersi più privilegi sudo
user ALL=(ALL) NOPASSWD: ALL
- sovrascrivere la vecchia configurazione
:w /etc/sudoers
Posso immaginare dozzine di modi simili in cui il tuo utente può ora accedere, modificare o distruggere il tuo sistema.
Non avrai nemmeno una traccia di controllo su quali file sono stati modificati in questo modo in quanto lo vedrai solo modificando la configurazione di Apache nei messaggi del registro sudo. Questo è un rischio per la sicurezza nel garantire i sudo
privilegi a qualsiasi editor.
Questo è più o meno lo stesso motivo per cui concedere i diritti di livello root sudo a comandi come tar
ed unzip
è spesso insicuro, nulla ti impedisce di includere sostituzioni per file binari di sistema o file di configurazione del sistema nell'archivio.
Un secondo rischio, come hanno sottolineato molti altri commentatori, è che vim
consente di uscire dalla shell , dove è possibile avviare una sub-shell da VIM che consente di eseguire qualsiasi comando arbitrario . Dall'interno della tua sessione sudo vim verranno eseguiti come root, ad esempio la shell escape:
:!/bin/bash
ti darà una shell root interattiva
:!/bin/rm -rf /
farà buone storie nel pub.
Cosa fare invece?
Puoi comunque utilizzare sudo
per consentire agli utenti di modificare i file che non possiedono in modo sicuro.
Nella tua configurazione sudoers puoi impostare uno speciale comando riservato sudoedit
seguito dal nome di percorso completo (jolly) ai file che un utente può modificare:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
L'utente può quindi utilizzare l' -e
opzione nella propria riga comandi sudo o utilizzare il sudoedit
comando:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Come spiegato nella pagina man :
L' -e (edit)
opzione indica che, anziché eseguire un comando, l'utente desidera modificare uno o più file. Al posto di un comando, la stringa "sudoedit" viene utilizzata quando si consulta la politica di sicurezza.
Se l'utente è autorizzato dalla politica, vengono prese le seguenti misure:
- Vengono eseguite copie temporanee dei file da modificare con il proprietario impostato sull'utente che effettua il richiamo.
- L'editor specificato dal criterio viene eseguito per modificare i file temporanei. La politica sudoers utilizza le variabili di ambiente SUDO_EDITOR, VISUAL ed EDITOR (in quell'ordine). Se non è impostato nessuno di SUDO_EDITOR, VISUAL o EDITOR, viene utilizzato il primo programma elencato
sudoers
nell'opzione editor (5).
- Se sono stati modificati, i file temporanei vengono copiati nella loro posizione originale e le versioni temporanee vengono rimosse.
Se il file specificato non esiste, verrà creato.
Si noti che, a differenza della maggior parte dei comandi eseguiti da sudo, l'editor viene eseguito con l'ambiente dell'utente invocatore non modificato. Se, per qualche motivo, sudo non è in grado di aggiornare un file con la sua versione modificata, l'utente riceverà un avviso e la copia modificata rimarrà in un file temporaneo.
Il sudoers
manuale ha anche un'intera sezione su come può offrire una protezione limitata contro le fughe della shell con le opzioni RESRICT
e NOEXEC
.
restrict
Evitare di dare agli utenti l'accesso ai comandi che consentono all'utente di eseguire comandi arbitrari. Molti editor hanno una modalità limitata in cui gli escape di shell sono disabilitati, sebbene sudoedit sia una soluzione migliore per eseguire gli editor tramite sudo. A causa del gran numero di programmi che offrono escape della shell, limitare gli utenti all'insieme di programmi che non lo fanno è spesso impraticabile.
e
noexec
Molti sistemi che supportano le librerie condivise hanno la possibilità di sovrascrivere le funzioni di libreria predefinite puntando una variabile di ambiente (di solito LD_PRELOAD) su una libreria condivisa alternativa. Su tali sistemi, la funzionalità noexec di sudo può essere utilizzata per impedire a un programma eseguito da sudo di eseguire altri programmi. Nota, ... ...
per abilitare noexec per un comando, utilizzare il NOEXEC
tag come documentato nella sezione Specifiche utente sopra. Ecco di nuovo questo esempio:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
ciò consente all'utente aaron di funzionare /usr/bin/more
e /usr/bin/vi
con noexec abilitato. Ciò impedirà a questi due comandi di eseguire altri comandi (come una shell).
vim
, l'utente è libero di aprire e scrivere su qualsiasi file gli piaccia.