È possibile verificare la capacità di sudo prima di farlo?


11

Sto scrivendo un piccolo programma di utilità. Mi piacerebbe che tentasse di eseguire sudoqualcosa se necessario.

Cioè: se le autorizzazioni per i file non consentono all'utente corrente di operare su un determinato file (e le sudoregole lo consentirebbero) Vorrei che la mia utility sudoeseguisse qualcosa come proprietario del file.

Spero di verificare prima questa capacità, perché preferirei che i registri di sistema non si riempissero di rumore per tentativi sudofalliti. Come sudoriportato di per sé in caso di fallimento: "Questo incidente verrà segnalato".

Quindi, spero di controllare programmaticamente: può user <x>eseguire command <y>via sudo?

Ecco il problema: sebbene /etc/sudoerscontenga quella mappatura, è di proprietà di root e non è leggibile dagli utenti normali.

Stavo considerando di generare un sottoprocesso da eseguire sudo -l(che genera comandi che l'utente corrente può eseguire sudo-run). Analizzerei quindi l'output di questo. Tuttavia, questo sembra un po 'fragile. L'output contiene le informazioni che desidero, ma sembra che sia stato progettato per essere letto dagli umani (non per il consumo programmatico). Non so se ci sia alcuna garanzia che l'output seguirà lo stesso formato in futuro o su piattaforme diverse.

L'analisi programmatica sudo -ldell'output è considerata sicura? In caso contrario, ci sono opzioni migliori per determinare in anticipo se un comando sudo riuscirà?


(sfondo sulla X / Y: questa utility è utilizzata da un account con ruolo ad accesso limitato. Mi aspetto che altri utenti optino per consentire all'account con accesso limitato di operare sui propri file tramite le regole sudo. Tuttavia, ho vinto sapere in anticipo quale di quegli altri utenti ha in atto la regola sudo pertinente)


3
Ti consiglio di adottare un approccio leggermente diverso. Invece di avere regole per utente, perché non avere un gruppo a cui è permesso fare qualunque cosa tu voglia che faccia. In questo modo, puoi semplicemente verificare se l'utente è nel gruppo. Sarebbe un'alternativa decente?
terdon

Risposte:


13

Secondo la pagina man sudo:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

quindi questo si riduce a

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Come sottolineato da Muru, usa -U $USERo -U $USERTOTESTo niente, a seconda delle tue necessità.


Se intendevi $USERindicare l'utente corrente, puoi semplicemente farlo sudo -l <command>, senza -U $USER.
muru,

Grazie - questo è utile. Una cosa che ho notato nel testare questo approccio è che non sembra occuparsi dei casi in cui la regola sudo è stata impostata per consentire TUTTI i comandi con particolari eccezioni, come (targetUser) ALL, !/usr/bin/foo ... in quel caso sudo -l -u targetUser /usr/bin/foosembra ancora /usr/bin/foouscire e uscire con lo stato 0. Tuttavia, è praticamente sufficiente per il mio semplice controllo e batte l'analisi sudo -ldell'output più dettagliato .
Peter Martin,
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.