Jak powstrzymać root przed uruchomieniem skryptu

10

GlassFish serwer aplikacji zapewnia skryptów do administrowania serwerem aplikacji i również uruchomić i zatrzymać je i chciałbym ograniczyć użytkownika root z uruchomieniem tego skryptu. Powodem jest to, że niektórzy kluczowi programiści zapominają administrować serwerem jako użytkownik nieuprzywilejowany, a jeśli zrestartują serwer aplikacji jako użytkownik root, serwer aplikacji musi uruchomić użytkownik root [*].

Nie ma możliwości uniknięcia dostępu do konta root, a programiści zapominają, ponieważ są tak przyzwyczajeni do robienia tego na swoim komputerze lokalnym. Chciałbym, aby asadminskrypt albo zmienił się, aby działał jako użytkownik nieuprzywilejowany, lub opcjonalnie wyświetlał komunikat o błędzie za każdym razem, gdy skrypt jest uruchamiany przez użytkownika root.

Używana jest powłoka Bash.

[*]: Próbowałem naprawić prawa do plików, ale mimo że wyśledziłem wiele plików, do których należy root, i chmod je, aplikacja napotyka dziwne błędy i muszę ponownie uruchomić jako root.

tronda
źródło

Odpowiedzi:

18

Podobne do innych odpowiedzi, ale w pożądanym kierunku.

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

Alternatywnie można użyć sudow skrypcie, aby wymusić wykonanie jako użytkownik nieuprzywilejowany, używając -uflagi do określenia użytkownika, który ma być uruchamiany. Nie używam Glassfish, ale oto pseudo skrypt proto-przykładowy.

#!/bin/bash

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

Mam nadzieję, że masz pomysł. Przepraszamy, ale tak naprawdę nie wiem, jak wygląda skrypt ani nazwa użytkownika nieuprzywilejowanego.

bahamat
źródło
2

@ Tshepang ma właściwy pomysł. Nie wiem, który jest najbardziej przenośny, ale oto inne sposoby na wykrycie, czy użytkownik jest rootem:

id -u
$UID

Możesz też po prostu zmusić go do działania jako inny użytkownik z tymi samymi parametrami:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi
l0b0
źródło
1
To jest zacofane. Chce, aby root nie uruchamiał tego skryptu.
bahamat
D'oh, zapomniałem sudotrochę. Teraz powinno wykonać zadanie.
l0b0
@TobySpeight Nie, skrypt nic nie robi, jeśli użytkownik jest rootem, zgodnie z przeznaczeniem. Uważam, że twoja zmiana powoduje również dodatkowy argument, jeśli $@jest pusty, i zmieniłem go, aby użyć wzorca znalezionego gdzie indziej.
l0b0
Dzięki @TobySpeight, poprawione. Byłem pewien, że widziałem gdzieś tę formę jako sposób na zapewnienie poprawnego przekazania zerowych argumentów. Naprawiono również czek, który zdecydowanie miał błąd (nie była to bomba widelcowa, ale po prostu nazywała się w nieskończoność.
l0b0
Twierdziłbym, że to bomba rozwidlająca, ponieważ każda instancja rozwidla nową skorupę dla sudo(nie używa exec), a rodzic czeka na nią, więc w końcu otrzymujesz pełną tabelę procesów. Nadal warto go exectam umieścić (jeśli nie chcesz, aby kod fidziałał później jako niewłaściwy użytkownik).
Toby Speight