Posso fare uno script sempre come root?


27

Come eseguire uno script come root, indipendentemente da chi lo esegue?

Ho letto di setuid ma non sono sicuro di come farlo.

Sto usando Linux, Ubuntu 12.04 LTS.


In quale distribuzione Linux sei? O Unix, anche?
slhck,

@slhck Linux, Ubuntu 12
HappyDeveloper il

3
setuidnon funzionerà con gli script - al momento è disabilitato per motivi di sicurezza sulla maggior parte delle distribuzioni * nix. Puoi impostarlo, ma verrà ignorato. Forse puoi spiegare di più sul tuo problema reale, così possiamo aiutarti a risolverlo invece? Di che sceneggiatura si tratta? Perché ne hai bisogno per essere eseguito come root? Sta usando sudoun'alternativa?
slhck,

Ci hai provato sudo -s?
Nam Phung,

Risposte:


29

Fai molta attenzione: gli script combinati con setuid sono pericolosi!

Innanzitutto, dai un'occhiata a questa domanda / risposte , in particolare a questa risposta e avviso di sicurezza .

Se vuoi ancora eseguire il tuo script con setuidset, puoi scrivere un breve programma C come wrapper e impostare il setuidbit sul binario compilato.

Esempio di wrapper:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Un'altra soluzione che utilizza sudo(menzionata qui ):

  1. Come root, impedisce l'accesso in scrittura (e forse altro) al tuo script:

    chown root /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Verificare che nessuno, tranne root, possa sostituire lo script , ad esempio modificando i diritti di accesso della cartella principale:

    chown root / absolute / path / to / your /
    chmod 755 / absolute / path / to / your /
    
  3. Modifica i diritti di accesso sudo /etc/sudoerscon visudo:

    TUTTI TUTTI = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Maggiori dettagli sulle impostazioni (es. Limitare l'accesso a utenti o gruppi specifici) sono disponibili nella manpage sudoers.

Successivamente, tutti gli utenti possono eseguire lo script come root senza password:

sudo /absolute/path/to/your/script.sh

Questo è simile all'utilizzo della soluzione wrapper / setuid sopra.


3
I pericoli specifici non sono molto evidenti, ma ruotano pesantemente intorno all'ambiente. Diversamente dalla maggior parte dei programmi, il comportamento di uno script di shell può essere modificato in modo significativo da dozzine di variabili di ambiente, tanto che, senza ampie garanzie, tale script può essere facilmente indotto a eseguire codice arbitrario.
Stephanie,

1
Dovresti aggiungere una chiamata a clearenv () prima della chiamata di sistema in quel wrapper, spazzando via completamente l'ambiente in modo che non ci siano impostazioni malvagie per manipolare lo script. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie

@Stephanie Devo fare qualcosa di sbagliato, perché tutto ciò sembra troppo folle per un compito comune. Questo è quello che sto cercando di fare: serverfault.com/questions/401405/…
HappyDeveloper

@HappyDeveloper Non troppo pazzo per uno script setuid, dal momento che uno scarsamente sicuro è un percorso di root per chiunque riesca a eseguirlo.
Stephanie,

4
sudopuò essere utilizzato per dare a tutti gli utenti l'accesso a un determinato programma (o script). In tal senso, agisce come un elegante involucro setuid. Sembra che in genere sarebbe una scelta migliore rispetto alla scrittura del proprio wrapper setuid.
jjlin,

4

Il modo più semplice e sicuro è utilizzare i bit SETUID nelle autorizzazioni dei file. in questo modo le autorizzazioni di comando saranno elevate alle autorizzazioni del proprietario del file.

per impedire lo script dall'edizione non impostare la scrittura per tutti i bit.


0

Non so se questo possa essere utile ma, per far funzionare lo script solo come root, potresti usare questo shebang sulla prima riga dello script:

#!/bin/su root
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.