shell script: usa sudo al suo interno vs eseguirlo con sudo?


13

Quando scrivo uno script di shell, in cui alcuni ma non tutti i comandi in esso necessitano dei privilegi di superutente, dovrei

  • aggiungere sudo a quei comandi che richiedono privilegi di superutente ed eseguire lo script della shell senza sudo, oppure

  • non aggiungere sudo a quei comandi che richiedono i privilegi di superutente, ma eseguire lo script della shell con sudo?

Nel secondo modo dovrò fornire la mia password una sola volta, ma tutti i comandi nello script verranno eseguiti con i privilegi di superutente, inclusi quelli che non sono necessari.

Nel primo modo potrei dover fornire la mia password più volte per diversi comandi sudo, mentre i privilegi di superutente sono concessi solo a quei comandi che ne hanno bisogno.

Per motivi di sicurezza, il primo modo è migliore. Per comodità, il secondo modo è migliore.

  1. Ho pensato di adottare il primo modo. Quindi devo affrontare l'inconveniente di fornire le mie password a più comandi sudo nello script della shell.

  2. Stephen Harris ha scritto :

    Uno script ben scritto rileverà se era in esecuzione con le giuste autorizzazioni e non chiamerebbe affatto sudo, ma ci sono molti script cattivi

    Quindi dovrei usare il secondo modo? Se è così,

    • come posso scrivere "lo script rileverà se era in esecuzione con le giuste autorizzazioni e non chiamasse affatto sudo"?

    • come posso migliorare la sua sicurezza per evitare il problema di dare privilegi di superutente ai comandi che non ne hanno bisogno quando eseguo lo script con sudo?

  3. Questo semplice approccio avrebbe il meglio di entrambi: aggiungere sudo ai comandi che ne hanno solo bisogno ed eseguire lo script con o senza sudo a seconda che io voglia comodità o sicurezza? Questo approccio ha qualche problema?

Grazie.


Pensavo sudoavesse una cache di credenziali predefinita. È disabilitato sulla tua piattaforma?
pipe

@pipe Il suo script potrebbe essere inattivo per un certo numero di volte, ad esempio, e in questo modo la cache potrebbe non funzionare.
LinuxSecurity:

Risposte:


15

Per risolvere il tuo primo problema:

come posso scrivere "lo script rileverà se era in esecuzione con le giuste autorizzazioni e non chiamasse affatto sudo"?

Esiste un controllo POSIX semplice per root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

In alternativa, in Bash, i programmatori più orientati alle prestazioni potrebbero voler utilizzare:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

Nota che ho intenzionalmente racchiuso il codice in funzioni per il riutilizzo.

Per risolvere il tuo secondo problema:

come posso migliorare la sua sicurezza per evitare il problema di dare privilegi di superutente ai comandi che non ne hanno bisogno quando eseguo lo script con sudo?

Non puoi fare molto al riguardo. Almeno niente mi viene in mente. Se vedessi la sceneggiatura, potrei avere dei suggerimenti. Ma dal momento che non l'hai incluso nella tua domanda ... Se esegui l'intero script con sudoo come root, non vedo alcun modo per controllarlo.

Per rispondere al commento:

Cosa ne pensi di "usa sudo al suo interno vs eseguilo con sudo"

Nei miei script, di solito procedo con quest'ultimo approccio, ma ciò non significa necessariamente che te lo raccomando. Perché dipende da chi è destinato lo script - rootsolo per ; per l'utente principalmente con l'eccezione di avere alcuni utenti con sudodiritti; dovresti letteralmente includere la tua sceneggiatura nella domanda per poter rispondere con qualsiasi valore.


sudo -u "$SUDO_USER" command...?
Michael Homer,

Grazie. Cosa ne pensi di "usa sudo al suo interno vs eseguilo con sudo"?
Tim

Grazie. Questo semplice approccio avrebbe il meglio di entrambi: aggiungere sudo ai comandi che ne hanno solo bisogno ed eseguire lo script con o senza sudo a seconda che io voglia comodità o sicurezza? Questo approccio ha qualche problema?
Tim

@MichaelHomer Mi chiedevo cosa sudo -u "$SUDO_USER" commandavrebbe dovuto significare qui?
Tim

@Tim Anche se non trovo alcun problema con questo approccio, qualcuno potrebbe obiettare con argomenti ragionevoli. Questo è davvero fuori dalla portata della tua domanda originale. Devo fare il mio backup mensile M-Disc ora, quindi non credo di essere ancora disponibile oggi, mi dispiace per quello. Spero di aver risposto almeno al punto principale. Ci vediamo domani.
LinuxSecurity:

-4

Penso di poter rispondere a questo.

Quindi dovrei usare il secondo modo?

Non c'è motivo per cui dovresti avere un problema qui, ecco perché:

Se c'è solo un comando che deve essere eseguito come root, allora il runtuo programma come rooto sudoperché sudoall'interno dello script è la strada più lunga. Hai dimenticato che i programmatori sono pigri?

Se hai bisogno di molti comandi runcome rootallora eseguilo come rooto sudo.

come posso migliorare la sua sicurezza per evitare il problema di dare privilegi di superutente ai comandi che non ne hanno bisogno quando eseguo lo script con sudo?

Se altri utenti hanno bisogno del runtuo programma, configuralo sudoperché sudoè molto personalizzabile e soddisferà le tue esigenze.

Ecco un esempio con sudo:

Utilizzare sempre visudoquando si modifica il file sudoers .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo è ottimo anche per cambiare gli utenti all'interno del tuo programma / script, ecco una riga di uno dei miei script:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

come posso scrivere "lo script rileverà se era in esecuzione con le giuste autorizzazioni e non chiamasse affatto sudo"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-determinare-se-uno-shell-script-è-in esecuzione-con-permessi-root

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

MODIFICA su richiesta del gentiluomo @terdon:

Pensa alla tua sceneggiatura in questo modo ....

È uno script pubblico (altre persone oltre a te lo useranno) Cosa fa lo script? Ti dice l'ora? O aggiorna iptables su 200 sistemi? Se solo lo usi, è legato al lavoro / professionale o è per uso personale?

Devi solo sapere in anticipo in cosa consiste il tuo gruppo di utenti, tutto qui.

Se è writtenper dare o vendere agli amministratori, anche allora, perché non dovrebbe scriptessere permesso di funzionare come root?? Che male può fare?

Script / programmi reali vengono eseguiti spesso come utenti privilegiati e nessuno menziona il fatto che non c'è problema, ma quando i programmatori, soprattutto i principianti come me parlano di queste cose, allora è una vera minaccia alla sicurezza ..... cosa ti dice il ragazzo nel tuo post fare riferimento a sta cercando di dire mentre non elegantemente è che alcune persone guardano il controllo che hai del systemtuo e del tuo codice .... imposti i file su più autorizzazioni di quelle che stai per usare, hai tutti i controlli nel tuo logica o il programmatore di talento vedrà i pericoli nel tuo codice solo guardandolo?

Se il tuo code needs root, usa sudo, e se ce ne sono molti, eseguilo come root....... la mia risposta finisce qui, accidenti


2
@somethingSomething potresti spiegare perché stai raccomandando di eseguire sempre lo script come root, anche quando esiste un solo comando che necessita dei privilegi di root? Dai due possibilità nella tua risposta (un comando che richiede privilegi di root o multipli) ma suggerisci la stessa cosa per entrambi.
terdon

2
Ho pensato a questo problema e ho letto altre discussioni simili. Questa risposta mi confonde e basta. (Ma hai già abbastanza voti negativi.)
Joe
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.