2011-10-03 14 views
13

Ho un compito rapido in uno script python che mi piacerebbe chiamare da Django (utente www), che avrà bisogno di privilegi di root.Esegui script Python come root (seteuid vs c-wrapper)

All'inizio pensavo che avrei potuto utilizzare il file os.seteuid() di Python e impostare il bit setuid sullo script, ma poi mi sono reso conto che avrei dovuto impostare il bit setuid su Python stesso, che presumo sia grande no no. Da quello che posso dire, questo sarebbe anche il caso se si utilizza sudo, che vorrei davvero evitare.

A questo punto, sto considerando di scrivere solo un wrapper C che usi seteuid e chiama il mio script python come root, passando gli argomenti necessari ad esso.

È questa la cosa giusta da fare o dovrei guardare qualcos'altro?

+2

Perché non lo si esegue semplicemente come un processo esterno utilizzando "sottoprocesso" e "sudo", anche se tutto ciò che riguarda questo odore è marcio. – Anders

+0

Perché ciò richiederebbe il permesso www di eseguire Python come root :( – kwl34

+1

Il problema principale qui è che le operazioni setuid e common sudo non si applicano ai singoli script Python come farebbero con un binario, ma piuttosto con l'interprete stesso di Python – kwl34

risposta

14

sudo non richiede bit setuid su Python. È possibile abilitare sudo per un comando solo, senza argomenti:

www   ALL=(ALL)  NOPASSWD: /root/bin/reload-stuff.py "" 

Questo sarebbe sicuro se lo script non prende alcun argomento, non possono essere sovrascritte dall'utente www, e sudo significa "env_reset" (l'impostazione predefinita in più distro).

È possibile accettare gli argomenti, ma fare molta attenzione con essi - non prendere i nomi dei file di output, assicurarsi di verificare tutti gli input. In questo caso, rimuovere "" dalla fine della linea sudo.

+0

Interessante! Vado a testare questo immediatamente allora. Tuttavia, il mio script prende argomenti, anche se semplici. Pensi che sarei ok fintanto che il mio script python sta eseguendo una corrispondenza esatta su questi argomenti? – kwl34

+0

si. Puoi fare gli agrumnts fintanto che stai attento con loro. – theamk

+0

'ALL = (root)' è probabilmente preferito per limitare l'esecuzione dello script solo a root e non a nessun altro utente. Meglio limitare solo a ciò di cui hai bisogno. – CivFan

1

sudo consente di limitare gli argomenti passati al programma. Da man sudoers:

john   ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* 

On the ALPHA machines, user john may su to anyone except root but 
he is not allowed to specify any options to the su(1) command. 

Quindi usare sudo. Ovviamente è necessario prestare la massima attenzione con l'accesso root: assicurarsi che solo root possa modificare lo script stesso e le eventuali directory madri e che lo script sia sicuro e che esegua il minimo assoluto che deve essere eseguito come root.

+0

I potrebbe essere sbagliato, ma questo richiede ancora che l'utente WWW abbia accesso root all'interprete Python stesso, e in pratica stai usando parser di argomenti sudo per consentire solo l'esecuzione dello script. anche considerare gli argomenti passati allo script (chiave/valori)? – kwl34

+0

Sì, è corretto. E sì, dovrebbe essere facile, ma ti consiglio di comunicare tramite stdin/stdout. Sfortunatamente, trattandosi di una domanda di sicurezza, c'è davvero nessuna alternativa alla lettura di 'man sudoers'. –

3

La cosa corretta è chiamata separazione dei privilegi: identificare chiaramente un insieme minimo di attività che devono essere eseguite su privilegi elevati. Scrivi un demone separato e un modo il più possibile limitato di comunicare l'attività da eseguire. Esegui questo daemon come un altro utente con privilegi elevati. Un po 'più di lavoro, ma anche più sicuro.

EDIT: l'utilizzo di un wrapper setuid-in grado di soddisfare anche il concetto di separazione dei privilegi, sebbene raccomando di avere il server Web sotto chroot e di montare il file system chrootato nosuid (che lo sconfiggerebbe).

+0

Questo è quello che sto proponendo usando un binario wrapper C. Fornisce un'interfaccia limitata allo sp funzioni ecologiche a cui l'utente deve accedere con privilegi elevati tramite seteuid(). – kwl34

+0

Sì, hai ragione, lo farò.Non l'ho considerato, perché raccomando chrootare i web server e montare il file system accessibile sul server web nosuid. – knitti

+0

Mi piacerebbe raccomandare sudo su C wrapper. È molto facile dimenticare di cancellare, ad esempio, PYTHONSTARTUP o qualche altra variabile env, ma sudo con env_reset lo farà per te. – theamk