Domanda

E 'possibile utilizzare un frontend sudo (come sudo) per elevare i privilegi del corrente processo? So che posso fare quanto segue:

sudo cat /etc/passwd-

Ma io sono interessato a fare questo:

sudo-become-root # magic function/command
cat /etc/passwd-

sto scrivendo in Python. Il mio caso d'uso è che ho un programma che viene eseguito come utente, ma può incontrare file di lettura / scrittura che sono di proprietà di root-. Mi piacerebbe la richiesta della password, ottenere i privilegi di root, fare quello che mi serve, e poi eventualmente rilasciare di nuovo i privilegi.

So che avrei potuto separare la logica di amministrazione e la logica non-admin in processi separati, e poi basta eseguire il processo di amministrazione come root (con un po 'di comunicazione - PolicyKit / dbus sarebbe una buona misura qui). Ma speravo in una molto più semplice (anche se certamente più rischioso) soluzione.

Sto pensando qualcosa come la corsa ppriv di Solaris attraverso sudo per poi modificare i privilegi per il processo corrente. Che sembra un andata e ritorno hacky-ma-praticabile. Ma per quanto ne so, linux non offre ppriv.

(Mi sorprende che questo non è già evidente, ma sembra una cosa non poco raro volere e non sembrare di essere un buco di sicurezza per consentire l'escalation in-process over escalation di un nuovo processo.)

È stato utile?

Soluzione

Purtroppo, io non sono a conoscenza di un modo per fare ciò che si vuole fare in modo pulito. Credo che la soluzione migliore è quello di rendere il setuid programma (o eseguirlo sotto sudo) e poi o fare il lavoro sporco e le autorizzazioni goccia, o fork () ed i permessi di caduta da un processo e tenere l'altra in giro per fare il vostro lavoro di root .

Quello che stai cercando sono il setuid (2) / setreuid (2) / setregid (2) / setgroups (2) chiama, ma sono tutti già cablato per non consentire di guadagnare privilegi metà invocazione. si possono usare solo per "regalare" i privilegi, per quanto ne so.

Altri suggerimenti

Aptitude ha un'opzione "diventare root". Si potrebbe desiderare di vedere ciò che l'autore ha fatto lì.

Se si vuole affrontare in modo pulito con diritti amministrativi all'interno di un programma, si potrebbe desiderare di utilizzare PolicyKit piuttosto che sudo, a seconda del sistema operativo che si prevede di eseguire il programma su.

Per PolicyKit per Python, vedere python-slip .

In caso contrario, ci sono due modi per chiamare sudo per diventare root:

sudo -s

vi farà radice e mantenere il vostro ambiente corrente (equivalente a sudo su)

sudo -i

vi farà radice e vi darà l'ambiente di root, troppo (equivalente a sudo su -)

Un altro modo di affrontare il problema è quello di considerare che si dispone dei diritti necessari, e lasciare che l'utente del programma scegliere come dare i diritti su tale programma (usando sudo / setuid gruppi / unix / qualsiasi altra cosa).

Si veda anche questa domanda ServerFault sullo stesso argomento.

Il funzione magica / comando potrebbe essere

sudo su
echo 'echo tee; echo hee'|sudo -s

L'output è:

tee
hee

Non mi piace l'idea di essere in grado di eseguire comandi arbitrari come radice da un processo privilegiato inferiore. Tuttavia, dal momento che si desidera, una delle idee che viene in mente è quello di mantenere un setuid ristretta guscio che può eseguire solo i comandi che ti interessa permettendo. È quindi possibile utilizzare le funzioni subprocess.Popen per eseguire il comando utilizzando questa shell ristretta che verrà eseguito con privilegi elevati.

Mi chiedo se questo dovrebbe funzionare:

Aggiungi un altro gruppo al sistema, installare lo script come un programma di root e avere il file sudoers contenere una linea che permette allo script da eseguire da questo gruppo. Infine aggiungere il gruppo alla lista dei conti che hanno bisogno di eseguire lo script.

Poi lo script può essere eseguito solo da root o di qualsiasi account che ha il gruppo speciale nel gruppo set dopo aver fornito la password di account in partenza.

Sudo per altre opzioni.

Si vuole per l'autenticazione con PAM. C'è un esempio qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top