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.

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.