Come imporre sempre la password sudo per un comando specifico?


12

L'altro giorno stavo facendo alcune attività di manutenzione sul mio web server. Avevo fretta e sonno, quindi ho fatto tutto usando il sudocomando.

E poi, ho accidentalmente premuto Ctrl+ V, inviando questo comando al mio server web:

sudo rm -rf /*

Per coloro che si chiedono cosa fa il comando sopra: Questo ha cancellato tutto il mio server web

Fortunatamente, avevo i backup e, purtroppo, ho dovuto passare altre due ore a svegliarmi per correggere questo fantastico errore. Ma da allora mi chiedo:

C'è un modo per imporre sempre la password sudo per un comando specifico?

Se il server mi chiedesse una password, mi risparmierei molti problemi. No, perché ho eseguito circa 5 sudocomandi prima di questo maestoso errore.

Quindi, c'è un modo per farlo? Ho solo bisogno della password con il rmcomando per essere sempre applicata. Altri comandi che sto usando sono di solito nanoo cpche entrambi sono (in una certa misura) riverificabili.



2
@solsTiCe /*viene espanso prima di essere passato al comando rm. Quindi il comando non vede un singolo argomento, ma un elenco di argomenti ( /bin /boot /cdrom /dev /etc /home...)
Dan,

3
Una lezione importante da togliere a questo è che non dovresti fare cose con sudo a meno che tu non ne abbia davvero bisogno. So che non risponde a ciò che hai chiesto qui, ma la domanda generale è come (si spera) impedirti di eliminare nuovamente il tuo server, ed evitare sudo dovrebbe essere la tua prima linea di difesa contro questo.
David Z,


2
@ WinEunuuchs2Unix Non è affatto una domanda duplicata, l'operazione qui non vuole che il rmcomando abbia una password. Vogliono solo sudorichiederne uno ogni volta che viene utilizzato il comando rm. La soluzione alla domanda che hai collegato diventerebbe leggermente fastidiosa quando il tuo primo comando è sudo rm. Come ti chiederanno due password, una per sudouna per rm.
Dan,

Risposte:


17

È possibile impostare timestamp_timeoutsu 0per comandi particolari in /etc/sudoers. Crea un file visudo -f /etc/sudoers.d/pduckcon il seguente contenuto:

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Ora all'utente pduckviene sempre richiesta una password durante l'esecuzione sudo rm(indipendentemente dai parametri aggiuntivi forniti) anche se l'utente è membro del sudogruppo e sudoricorda la sua password per altri comandi.

Il rovescio della medaglia è che non è possibile aggiungere facilmente parametri alla /bin/rmriga nel file per limitare ulteriormente questo. Bene ... puoi, come:

Cmnd_Alias DANGEROUS = /bin/rm -f

ma poi ti viene richiesto esattamente sudo rm -fe non (di nuovo) sudo rm -rf, per esempio.


9

Un metodo sarebbe usare safe-rm . Questo indirizzerà SOLO l'utilizzo di "rm" e impedirà l'esecuzione di versioni specifiche di "rm". Ciò include la rimozione del sistema di root, ma può anche essere utilizzato per impedire la rimozione di directory relative al sistema come "/ usr /" o "/ var /". Dal link:

Revent dell'eliminazione accidentale di file importanti

Safe-rm è uno strumento di sicurezza destinato a prevenire la cancellazione accidentale di file importanti sostituendolo /bin/rmcon un wrapper, che verifica gli argomenti forniti rispetto a una lista nera configurabile di file e directory che non devono mai essere rimossi.

Gli utenti che tentano di eliminare uno di questi file o directory protetti non saranno in grado di farlo e verrà invece visualizzato un messaggio di avviso:

$ rm -rf /usr   
Skipping /usr

(I percorsi protetti possono essere impostati sia a livello di sito che di utente.)

Il recupero di file importanti che hai eliminato per errore può essere piuttosto difficile. Proteggiti oggi stesso installando safe-rm e riduci le probabilità che dovrai contattare un servizio di recupero dati!

inserisci qui la descrizione dell'immagine


È stato votato per il safecow
Michael Fulton,

3

sudofornisce un'opzione -k, --reset-timestamp, vedere man sudo:

Se utilizzata in combinazione con un comando o un'opzione che potrebbe richiedere una password, questa opzione farà sì che sudo ignori le credenziali memorizzate nella cache dell'utente. Di conseguenza, sudo richiederà una password (se richiesta dalla politica di sicurezza) e non aggiornerà le credenziali memorizzate nella cache dell'utente.

È possibile scrivere un semplice wrapper per il sudotest rm -rf /*e l'esecuzione

sudo -k rm -rf /*

invece, ad esempio in questo modo:

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Esempio di utilizzo

Test con echo aqui.

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

Se vuoi che ti venga chiesto ogni volta che esegui rmin generale, puoi adattare la funzione sopra come segue:

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Se si desidera combinare sia le chiamate di comando generali che le righe di comando specifiche che consiglio di utilizzare case, ad esempio:

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

Si noti che questi approcci non funziona se si esegue sudocon le opzioni - soluzioni possibili sono [[ "$*" =~ " rm " ]]per verificare la stringa “rm” circondato da spazi o *" rm "*)con caseper catturare qualsiasi riga di comando contenente “rm”.


[[ "$1" == "rm" ]] && opt="-k";e che ne dici /bin/rm?
Rinzwind,

@Rinzwind Penso che la funzione sia facilmente adattabile a esigenze specifiche, in particolare l' caseapproccio.
dessert

1

Questa risposta non affronta la sudoparte della tua domanda, ma d'altra parte si rivolge a un modo per mitigare il pericolo di rminvocazioni accidentali per qualsiasi utente.

Puoi alias rma rm -Iquale

  • chiede conferma non appena cancellerebbe una directory o più di 3 file
  • purché si escluda ciò-f che sostituisce le -Iopzioni precedenti .

--one-file-systemè un'altra possibile protezione contro l'eliminazione involontaria che utilizzo nel mio rmalias.

Impostare

Per creare un tale alias utilizzare il comando:

alias rm='rm -I --one-file-system'

Puoi metterlo nel tuo ~/.bashrco anche /etc/bash.bashrc.

uso

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

Per confermare digitare yeso la sua traduzione nella propria lingua o nella prima lettera di una delle due parole e premere Enter. Qualsiasi altro input incluso nessuno interrompe l'operazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.