So verhindern Sie, dass root ein Skript ausführt

10

Der Glassfish- Anwendungsserver stellt Skripts zur Verfügung, mit denen der Anwendungsserver verwaltet und auch gestartet und gestoppt werden kann. Ich möchte den Root-Benutzer daran hindern, dieses Skript auszuführen. Der Grund dafür ist, dass einige Schlüsselentwickler vergessen, den Server als nicht privilegierten Benutzer zu verwalten. Wenn sie den Anwendungsserver als Root-Benutzer neu starten, muss der Anwendungsserver vom Root-Benutzer [*] ausgeführt werden.

Es ist keine Option, Root-Zugriff zu vermeiden, und die Entwickler vergessen dies, weil sie dies auf ihrem lokalen Computer gewohnt sind. Ich möchte, dass das asadminSkript entweder geändert wird, um als nicht privilegierter Benutzer ausgeführt zu werden, oder optional jedes Mal eine Fehlermeldung anzeigt, wenn das Skript von root ausgeführt wird.

Bash Shell wird verwendet.

[*]: Ich habe versucht, die Rechte an Dateien zu korrigieren, aber obwohl ich viele Dateien aufgespürt habe, die root besitzt, und sie geändert habe, treten bei der Anwendung seltsame Fehler auf, und ich muss erneut als root ausgeführt werden.

Tronda
quelle

Antworten:

18

Ähnlich wie bei den anderen Antworten, aber in die gewünschte Richtung.

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

Alternativ können Sie sudoinnerhalb des Skripts die Ausführung als nicht privilegierter Benutzer erzwingen, indem Sie das -uFlag verwenden, um den Benutzer anzugeben, unter dem ausgeführt werden soll. Ich benutze kein Glassfish, aber hier ist ein Proto-Beispiel-Pseudoskript.

#!/bin/bash

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

Hoffentlich kommst du auf die Idee. Entschuldigung, ich weiß nicht genau, wie das Skript aussieht oder wie der nicht privilegierte Benutzer heißt.

Bahamat
quelle
2

@ Tshepang hat die richtige Idee. Ich weiß nicht, welches am portabelsten ist, aber hier sind andere Möglichkeiten, um festzustellen, ob der Benutzer root ist:

id -u
$UID

Alternativ können Sie einfach erzwingen, dass es als ein anderer Benutzer mit denselben Parametern ausgeführt wird:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi
l0b0
quelle
1
Das ist rückwärts. Er möchte, dass root dieses Skript nicht ausführt.
Bahamat
D'oh, habe das sudobisschen vergessen . Jetzt sollte es den Job machen.
10.
@TobySpeight Nein, das Skript tut nichts, wenn der Benutzer wie beabsichtigt root ist. Ich glaube, Ihre Änderung führt auch zu einem zusätzlichen Argument, wenn $@es leer ist, und ich habe es geändert, um ein Muster zu verwenden, das an anderer Stelle gefunden wurde.
10b0
Danke @TobySpeight, geändert. Ich war mir sicher, dass ich dieses Formular irgendwo gesehen hatte, um sicherzustellen, dass keine Argumente korrekt übergeben wurden. Auch der Scheck wurde behoben, der definitiv einen Fehler hatte (es war keine
Gabelbombe
Ich würde behaupten, es war eine Gabelbombe, weil jede Instanz eine neue Shell für die Gabelbombe gabelt sudo(sie wird nicht verwendet exec) und die Eltern darauf warten würden, sodass Sie schließlich eine vollständige Prozesstabelle erhalten würden. Es lohnt sich immer noch, dort einzugeben exec(wenn Sie nicht beabsichtigen, den Code danach fials falschen Benutzer auszuführen).
Toby Speight