Как помешать root запустить скрипт

10

Сервер приложений Glassfish предоставляет сценарии для администрирования сервера приложений, а также запуска и остановки их, и я хотел бы запретить пользователю root запускать этот сценарий. Причина в том, что некоторые ключевые разработчики забывают администрировать сервер как непривилегированный пользователь, и если они перезапускают сервер приложений как пользователь root, то сервер приложений должен запускаться пользователем root [*].

Невозможно избежать предоставления root-прав, и разработчики забывают, потому что они так привыкли делать это на своей локальной машине. Я хотел бы, чтобы asadminсценарий либо изменялся для запуска от имени непривилегированного пользователя, либо при желании отображал сообщение об ошибке при каждом запуске сценария пользователем root.

Bash shell используется.

[*]: Я пытался исправить права на файлы, но, несмотря на то, что я отследил множество файлов, которым владеет root, и выполнил chmod, приложение испытывает странные ошибки, и мне пришлось снова запускать от имени root.

tronda
источник

Ответы:

18

Аналогично другим ответам, но в нужном вам направлении.

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

В качестве альтернативы, вы можете использовать sudoв скрипте для принудительного выполнения в качестве непривилегированного пользователя, используя -uфлаг, чтобы указать пользователя для запуска. Я не использую Glassfish, но вот псевдо-сценарий с прототипом.

#!/bin/bash

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

Надеюсь, вы поняли идею. Извините, я на самом деле не знаю, как выглядит сценарий или имя непривилегированного пользователя.

bahamat
источник
2

У @Tshepang есть правильная идея. Я не знаю, какой из них наиболее переносим, ​​но вот другие способы определить, является ли пользователь root:

id -u
$UID

В качестве альтернативы вы можете просто заставить его работать как другой пользователь с такими же параметрами:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi
l0b0
источник
1
Это назад. Он хочет, чтобы root не запускал этот скрипт.
Багамат
О, забыл sudoнемного. Теперь это должно сделать работу.
10
@TobySpeight Нет, скрипт ничего не делает, если пользователь root, как и предполагалось. Я считаю, что ваши изменения также приводят к дополнительному аргументу, если $@он пуст, и я изменил его, чтобы использовать шаблон, найденный в другом месте.
10
Спасибо @TobySpeight, исправлено. Я был уверен, что видел эту форму где-то как способ убедиться, что нулевые аргументы переданы правильно. Также исправлена ​​проверка, в которой определенно была ошибка (это не вилочная бомба, а просто вызывающая себя неопределенно долго.
l0b0
Я бы сказал, что это была «бомба-форк», потому что каждый экземпляр создавал новую оболочку для sudo(она не использовалась exec), а родительский ожидал ее, так что в итоге вы получили бы полную таблицу процессов. Это все еще стоит добавить execтуда (если вы не собираетесь fiзапускать код от имени другого пользователя).
Тоби Спейт