Come impedire a root di eseguire uno script


10

Il server delle applicazioni Glassfish fornisce script per amministrare il server delle applicazioni e anche avviarli e arrestarli e vorrei limitare all'utente root l'esecuzione di questo script. Il motivo è che alcuni sviluppatori chiave dimenticano di amministrare il server come utente non privilegiato e se riavviano il server delle applicazioni come utente root, il server delle applicazioni deve essere eseguito dall'utente root [*].

Non è un'opzione per evitare l'accesso root e gli sviluppatori dimenticano perché sono così abituati a farlo sul proprio computer locale. Vorrei che lo asadminscript cambiasse per essere eseguito come utente non privilegiato o facoltativamente per visualizzare un messaggio di errore ogni volta che lo script viene eseguito da root.

Viene utilizzata la shell Bash.

[*]: Ho provato a correggere i diritti sui file, ma anche se ho rintracciato molti file che root possiede e li chmod, l'applicazione presenta strani errori e devo eseguire di nuovo come root.

Risposte:


18

Simile alle altre risposte, ma nella direzione che volevi.

if [[ $EUID -eq 0 ]]; then
  echo "This script must NOT be run as root" 1>&2
  exit 1
fi

In alternativa, è possibile utilizzare sudoall'interno dello script per forzare l'esecuzione come utente non privilegiato utilizzando il -uflag per specificare l'utente come eseguire. Non uso Glassfish, ma ecco uno pseudo script proto-esempio.

#!/bin/bash

if [ $1 == "start" ]; then
  sudo -u nobody /usr/bin/glassfish
fi

Spero che tu abbia l'idea. Spiacente, non so davvero come sia lo script o il nome dell'utente non privilegiato.


2

@Tshepang ha l'idea giusta. Non so quale sia il più portatile, ma qui ci sono altri modi per rilevare se l'utente è root:

id -u
$UID

In alternativa, puoi semplicemente forzare l'esecuzione come un altro utente con gli stessi parametri:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi

1
Questo è arretrato. Vuole che root non esegua questo script.
bahamat,

D'oh, ho dimenticato un sudopo '. Ora dovrebbe fare il lavoro.
l0b0

@TobySpeight No, lo script non fa nulla se l'utente è root, come previsto. Credo che la tua modifica porti anche a un ulteriore argomento se $@è vuoto e l'ho modificata per utilizzare uno schema trovato altrove.
l0b0

Grazie @TobySpeight, modificato. Ero sicuro di aver visto quel modulo da qualche parte come un modo per assicurarsi che zero argomenti fossero passati correttamente. Risolto anche il controllo, che sicuramente aveva un bug (non era una bomba a forcella, ma si sarebbe semplicemente definito indefinitamente.
l0b0

Direi che era una bomba a forcella, perché ogni istanza avrebbe biforcuto una nuova shell per sudo(non sta usando exec) e il genitore l'avrebbe aspettata, quindi alla fine si sarebbe finito con una tabella di processo completa. Vale comunque la pena inserirlo exec(se non si intende eseguire il codice ficome utente errato).
Toby Speight,
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.