Как разрешить пользователям без полномочий 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
Baazigar
источник
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он не будет работать для скриптов по умолчанию.
Ян Тойнар