ubuntu: consente a un utente di eseguire uno script con permessi di root


9

Ho Ubuntu 8.04 e voglio scrivere uno script bash che funziona come roottutti gli utenti possono eseguire.

Io stesso posso fare sudo.

Come lo faccio?

CHIARIMENTO : Non voglio farlo con sudo, perché gli utenti dovranno digitare la password. Voglio solo che eseguano lo script come root, forse qualcosa di setuid, non lo so.

Risposte:


23

Se questo era un normale binario, è possibile impostare eseguendo

# chmod u+s /path/to/binary

Sfortunatamente, gli script non possono essere impostati. (Beh, puoi, ma viene ignorato). La ragione di ciò è che la prima riga dello script indica al sistema operativo in quale interprete eseguire lo script. Ad esempio se hai avuto uno script con:

#!/bin/bash

In realtà finiresti per correre

/bin/bash /path/to/script

Ovviamente, avresti bisogno che l'interprete fosse setuid, il che significherebbe che tutti gli script sarebbero impostati. Questo sarebbe male.

Puoi farlo con sudo inserendo quanto segue nel tuo file / etc / sudoers eseguendo visudo.

ALL ALL=NOPASSWD: /path/to/script

E ora qualsiasi utente può eseguire

$ sudo /path/to/script

Ciò consente loro di eseguire lo script senza digitare la password.

Esiste un'alternativa che non richiede sudo nel comando, che richiede la creazione di un piccolo binario setuided che esegue lo script, ma ogni binario setuid aggiuntivo aggiunge un altro potenziale problema di sicurezza.


Penso che questa sia la risposta che stavo cercando. Non posso impostare uno script bash, solo un binario? (Certo, prenderei le misure per renderlo non modificabile)
flybywire

No, non puoi impostare uno script setuid.
wfaulk,

wfaulk: Prima lo sapevi, ma le distribuzioni Linux più recenti non lo consentono più. È possibile utilizzare uno strumento come shc per "compilare" lo script e quindi impostarlo su setuid.
Kyle Brandt,

wfaulk: Certo, questo farebbe di tutto per fare qualcosa che è intenzionalmente disabilitato, quindi probabilmente è una cattiva idea :-)
Kyle Brandt

Sostituisci il termine ALLcon un nome utente per consentire a quell'unico sudoer di essere eseguito senza inserire una password.
hdave,

3

Avevo bisogno di inserire quella riga ALLA FINE di / etc / sudoers: ALL ALL = NOPASSWD: <filename> apparentemente, una %admin ALL=(ALL) ALLsostituzione successiva richiedeva una password per gli utenti admin.

Non esiste alcun problema di sicurezza che consenta di eseguire uno script come root purché lo script esegua un'azione ben determinata, innocua e consentita e, se i valori di qualsiasi parametro non possono causare un comportamento errato dello script.

Ma c'è un gotcha ...

Utilizzare sempre percorsi completi nei nomi dei comandi e dei file. Se scrivi qualcosa come echo Hello world!in myrootscript, qualcuno potrebbe scrivere a ~/bin/echo scripted myrootscripteseguire come root qualunque cosa ci sia dentro.

/bin/echo "Hoping this will keep you safe" :-)


se è possibile per un utente non root sulla macchina modificare quello script, allora è possibile che quell'utente prenda il controllo della macchina. Se quello stesso utente ha una password debole, nulla impedisce alla tua macchina di essere totalmente compromessa.
hdave,

2

Per impostazione predefinita, i membri del wheelgruppo sono autorizzati a sudoqualsiasi comando come root. Questo è probabilmente il modo in cui stai usando sudofino ad oggi.

Per consentire a un altro utente dovrai creare una sudoersregola. Per esempio:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Consentirà all'utente mickey.mousedi eseguire il comando /usr/local/bin/test.shcome rootsenza richiedere una richiesta di password aggiuntiva.

Dovresti leggere questo documento per maggiori informazioni.


Debian / Ubuntu usano il gruppo admin piuttosto che wheel. È forse un nome leggermente più preciso.
David Pashley,

Chiamami vecchio stile, ma ..;)
Dan Carley,

1
vecchio stile: P
David Pashley,

0

Usare chmod +s <filename>per vedere il bit del suid. Ciò significa che quando il file viene eseguito, viene eseguito con le autorizzazioni del proprietario del file (quindi chown a root per farlo funzionare così).

Tuttavia, questo può essere MOLTO pericoloso con qualcosa come uno script bash, perché un utente trova un modo per cambiarlo, può facilmente ottenere una shell di root. Assicurati che non possa essere scritto da nessuno tranne root.

Linux non ti consente di impostare su script, per fare questo dovresti compilarlo come programma. Invece, puoi usare il file sudoers (/ etc / sudoers) e aggiungere una riga come questa.

<username> ALL = NOPASSWD: /path/to/script


0

Un'altra alternativa: puoi fare un piccolo wrapper C setuid attorno a quello script

  • verifica eventuali limitazioni che potresti voler applicare (elenco utenti, ora, caricamento del sistema, ...)
  • registra / verifica l'esecuzione se lo si desidera
  • esegue lo script

Un po 'come il tuo sottoinsieme delle molteplici capacità di sudo.

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.