Как разрешить пользователям без полномочий root управлять службой systemd с помощью экземпляров?


12

Мне нужно разрешить пользователям в dbaгруппе контролировать database@сервисы. Ответ на этот связанный вопрос состоит в том, чтобы просто перечислить все systemctl«глаголы», которые я хочу разрешить в sudoersфайле, однако, это не относится к моему случаю, потому что я заранее не знаю, какие базы данных могут существовать в системе. Например, если я перечислю

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

это не распространяется на случаи, которые могут существовать в будущем, и DBA не сможет

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Во всяком случае, я думаю больше об упаковке, чем о том, чтобы играть с определенной системой.

Обратите внимание, что, как показано в этом удивительном ответе на другой связанный вопрос , использование глобусов sudo для этого в конечном счете небезопасно:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

позволяет

$ sudo systemctl start database@awsesomeapp unrelatedservice

Я подозреваю, что использование sudoне решит мою проблему (хотя я надеюсь, что ошибаюсь). Есть ли другой способ разрешить пользователям без полномочий root управлять systemdслужбами?

Что бы это ни стоило, мне нужно сделать это в системе CentOS 7 и системах RHEL7 в будущем. Я также был бы заинтересован в решениях, которые работают на Arch Linux.

Ответы:


1

Судо файл не будет так работать, или мне так кажется. Файл Sudoers предназначен для предоставления конкретной команды доступа, а не для указания аргументов, которые могут использоваться с этой командой.

Создайте скрипт, который запускается от имени root и выполняет это:

/usr/bin/systemctl start database@

Заставьте скрипт использовать аргумент, например anotherawesomeapp, чтобы он выполнял это:

Сценарий выполняет: / usr / bin / systemctl стартовая база данных @ anotherawsesomeapp

Дайте своим пользователям разрешение на запуск файла script.sh с / etc / sudoers.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

Пользователь может запустить его так:

sh script.sh anotherawsesomeapp

Пример:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

1
Как-то это имеет те же проблемы, что и sudoers. Вам необходимо заключить переменную в кавычки, иначе она будет разделена пробелами.
— Кириас

Это не сработает; setuid не учитывается для сценариев оболочки (в Linux).
— Мартейн

Все, что он делает, это использует sudo для выполнения скрипта. Он ничем не отличается от сценария «Привет, мир!». Если root может запустить скрипт, он будет работать.
— Баазигар

0

Предлагаемое решение на основеSUID

Вы можете создать указанный скрипт, который вызывает systemctl с помощью sudo. Сделайте скрипт принадлежащий root. Предоставьте SUIDразрешения для пользователя root, права на чтение и выполнение для группы администраторов баз данных (dba).
Только будьте осторожны, чтобы не предоставлять разрешение на запись группе или другим, потому что таким образом они могут изменить сценарий и заставить его выполнить все, что предшествует sudo! Также убедитесь, что сценарий является пуленепробиваемым для ввода.

$ cat >> start_database.sh
стартовая база данных sudo / usr / bin / systemctl @ $ 1
(Ctrl + D)

Этот сценарий можно улучшить, проверив, действительно ли указан аргумент, и напечатав сообщение Usage:, если нет ..., также, поскольку это сценарий, с SUIDкоторым было бы целесообразно проверить; чтобы избежать внедрения других команд после аргумента. Или, что еще лучше, убедитесь, что в качестве входных данных указана только одна из строк, связанных с приложением, которые вы упомянули!
Затем вы должны убедиться, что разрешения для скрипта строго следующие:

$ sudo chown root: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

Затем, чтобы проверить правильность разрешений:

$ ls -la
,
,
,
-rwSr-x --- 1 корень dba 35 августа 2 19:11 start_database.sh
,
,
,

Итак, подведем итоги:

1. owner of the script is root
2. файл can be read and executed by the dba group members
3. no-one else will be able to even readон.
4. SUIDпозволит пользователю, выполняющему скрипт, стать пользователем root, пока скрипт выполняется.
5. Таким образом, sudo не остановится для пароля.

В любом случае, в системе с несколькими пользователями, будьте очень осторожны с SUIDпотому , что он может оставить место для злоупотребления разрешения.


В вашем скрипте отсутствует шебанг, и даже тогда SUIDон не будет работать для скриптов по умолчанию.
— Ян Тойнар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.