Consenti all'utente di eseguire un comando con argomenti (che contiene spazi)


17

Voglio consentire a un utente di eseguire grep (tramite sudo) e grep per una stringa specifica in un file specifico. Non voglio consentire a questo utente di eseguire grep su tutti i file. L'utente non ha accesso in lettura al file, quindi l'obbligo di usare sudo. Sto cercando di scrivere un controllo nagios che esegue il greps sul file di registro di un altro servizio sulla macchina.

Comunque non funziona, sudo continua a chiedere una password.

Il mio comando è: sudo grep "string I want (" /var/log/thefilename.log(sì, c'è un raw (e alcuni spazi nella stringa che voglio grep)

/etc/sudoers.d/user-can-grep ha questo contenuto:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Questo file sudoers è di proprietà root:roote dispone di autorizzazioni-r--r-----

Il server è Ubuntu fidato 14.04.3 LTS.

Come posso farlo funzionare?


I nagios check chiamano esplicitamente / bin / grep o / usr / bin / grep?
Jeff Schaller

Scrivi uno script di shell che lo fa, quindi lascia che lo script venga eseguito sudo.
user253751

@JeffSchaller FYI lo script chiama grepe which grepmi dice che sta usando /bin/grep. AFAIK nel file sudo è necessario specificare il percorso completo del file binario, anche se lo si chiama senza il percorso completo.
Rory,

Risposte:


13

Apparentemente, sudo appiattisce il comando in una stringa prima di confrontarlo con una specifica nel file sudoers. Quindi, nel tuo caso, non è necessario utilizzare le virgolette o qualsiasi altra forma di escape:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Modifica : Come sottolinea @ user23013 nei commenti, questo può essere sfruttato per grep per "stringa che voglio" in qualsiasi file (e, per estensione, anche per "stringa I" e "stringa".) Si prega di prendere attentamente in considerazione prima usando il controllo degli argomenti di sudo!


Si noti inoltre che le seguenti chiamate sono equivalenti, ovvero non sarà possibile limitare gli utenti a una rappresentazione specifica:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Ciò è dovuto al fatto che virgolette e escape sono gestite dalla shell e non raggiungono mai sudo.


Interessante, mi chiedo se sia sfruttabile, vale a dire convincere che sudohai digitato una cosa (che corrisponde alle specifiche) ma quando si tratta di eseguirla, è qualcos'altro.
EightBitTony,

4
@EightBitTony Certo che lo è! Nel tuo sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(con l'intenzione di consentire agli utenti di modificare "Modifica file sudoers") può essere sfruttato cd'ing in /etc/e in esecuzione sudo vim Editing sudoers file. Direi che per qualsiasi comando di ragionevole complessità si dovrebbe seguire l'approccio suggerito nel proprio commento: shell fornisce una $@variabile in cui è possibile verificare che gli argomenti siano raggruppati nel modo in cui ci si aspetta che siano raggruppati.
Alexander Batischev,

8
Crea un percorso ( /var/logovunque e collega simbolicamente thefilename.loga qualsiasi file, quindi l'utente può accedere string I wanta qualsiasi file.
user23013

2
La risposta di @ EightBitTony (scrivere uno script wrapper, consentire l'accesso sudo a quello script) è molto migliore e più sicura.
Cas

Wow, questa è una pratica estremamente scadente per uno strumento incentrato sulla sicurezza.
Sam Watkins,

32
  1. Scrivi una sceneggiatura (scrivibile solo da root)
  2. In quello script, esegui ciò di cui grephai bisogno
  3. Nella configurazione sudoers, consenti solo l'accesso a quello script
  4. Configura qualsiasi strumento o consiglia a qualsiasi utente di eseguire semplicemente lo script tramite sudo

Molto più facile da eseguire il debug, più facile da bloccare l'accesso specifico a un file specifico e molto più difficile da sfruttare.


2

Dal momento che hai solo bisogno di root per l'accesso ai file, considera l'utilizzo cat, teeo qualcosa di simile e il piping a quello grepo qualunque programma devi eseguire. Ad esempio, in sudo cat /file/path | grep …questo modo limitate il root a dove ne avete assolutamente bisogno.


0

sudoè fantastico, ma a volte non è la soluzione migliore. Per questo mi piace usare super.superconsente anche autorizzazioni elevate, tuttavia presuppone alias di comando, il che è utile quando si consentono linee di comando complicate, poiché vengono utilizzate come semplici righe di comando.

il tuo super.tab sarebbe simile a:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

e sarebbe invocato come super grepcmd.


sudoha Cmnd_Alias(che può contenere uno o più comandi, con o senza restrizioni arg).
Cas

Non è la stessa cosa. Cmnd_Alias ​​è uno strumento per semplificare il file di configurazione, non espone un alias all'utente che è la modalità operativa principale di super (motivo per cui utilizzo sudo quando non sto aliasing comandi o eseguo script suid (la maggior parte delle volte) e super per questi due casi d'uso).
Hildred

ecco a cosa servono gli script wrapper ... e non si limitano a una riga o presentano fastidiosi problemi di quotazione.
Cas
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.