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


10

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

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

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

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

Ответы:


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

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


2

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

id -u
$UID

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

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

1
Это назад. Он хочет, чтобы root не запускал этот скрипт.
Багамат

О, забыл sudoнемного. Теперь это должно сделать работу.
10

@TobySpeight Нет, скрипт ничего не делает, если пользователь root, как и предполагалось. Я считаю, что ваши изменения также приводят к дополнительному аргументу, если $@он пуст, и я изменил его, чтобы использовать шаблон, найденный в другом месте.
10

Спасибо @TobySpeight, исправлено. Я был уверен, что видел эту форму где-то как способ убедиться, что нулевые аргументы переданы правильно. Также исправлена ​​проверка, в которой определенно была ошибка (это не вилочная бомба, а просто вызывающая себя неопределенно долго.
l0b0

Я бы сказал, что это была «бомба-форк», потому что каждый экземпляр создавал новую оболочку для sudo(она не использовалась exec), а родительский ожидал ее, так что в итоге вы получили бы полную таблицу процессов. Это все еще стоит добавить execтуда (если вы не собираетесь fiзапускать код от имени другого пользователя).
Тоби Спейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.