Как мы можем позволить пользователям без полномочий root управлять сервисом system.d?

60

При sysvinitтакой sudoersзаписи будет достаточно:

%webteam cms051=/sbin/service httpd *

Это позволило бы такие команды, как:

  • sudo service httpd status
  • sudo service httpd restart

Теперь, с systemd, имя службы является последним аргументом. Т.е. перезапуск службы будет сделан с помощью:

systemctl restart httpd.service

Естественно, я думал, что определение команды systemctl * httpd.serviceбудет работать, но это позволит что-то подобное, systemctl restart puppet.service httpd.serviceчто не является желаемым эффектом.

Учитывая это, каков был бы наилучший способ позволить пользователям без полномочий root контролировать system.dслужбу? Это не должно быть sudoers; возможно, изменение разрешения файла может быть достаточным?

Бельмин Фернандес
источник
Я давно не касался sudoконфигурации, но не могли бы вы просто сделать что-то подобное cms051=systemctl * httpd.service?
Джон У. С. Смит,
1
Это позволит вам перезапустить любой сервис. Я должен был включить этот вопрос в вопрос. Сожалею.
Бельмин Фернандес

Ответы:

43

Просто добавьте все необходимые команды sudoersотдельно:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service
jofel
источник
Я надеялся захватить все команды юнитов, но если мне придется их детализировать, то я думаю, что это то, что я должен буду сделать.
Бельмин Фернандес
9
статус бесполезен, так как это может сделать любой пользователь
Dereckson
5
Что такое cms051?
Кевин
1
Так что же произойдет, если я вызову systemctl restart http.service mariadb.service ;-)? Вероятно, mariadb будет также перезапущен
Марек Вайдзик
1
@MarekWajdzik sudo не допускает дополнительных аргументов, если явно не разрешено использование *схожих шаблонов.
Джофель
31

Ответ @ jofel был именно тем, что мне нужно, чтобы получить рабочую настройку. Выкладываю это на всех остальных, спотыкаясь по этому вопросу. Мне нужен был способ capistranoперезапустить мое приложение Ruby после развертывания с моей локальной машины. Это значит, что мне нужен беспарольный доступ к перезапуску systemdсервисов. Это то, что у меня есть, и это прекрасно работает!

Примечание : мой пользователь и группа называется deployer
Поместить код в пользовательский файл здесь: /etc/sudoers.d/deployer
Код:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
BoomShadow
источник
Мне нужно добавить, что после входа в систему как пользователь deployerв этом случае, вы должны запустить systemctlкоманду с sudo.
Муйива Олу
8

Создайте псевдоним команды с командами, к которым вы хотите, чтобы они имели доступ. Затем назначьте группу этому псевдониму команды:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

Также рекомендуется размещать любые изменения в вашем /etc/sudoers.d/filename вместо непосредственного редактирования файла sudoers. Убедитесь, что вы указали свой файл .d / filename в sudoers, что в любом случае делают большинство новых дистрибутивов. Размещение этих 2 строк в вашем sudoers должно сделать свое дело:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Примечание: этот знак # перед включенным не является комментарием. Это должно остаться.

Богатый
источник
Как добавить шанс выполнить остановку / запуск / перезапуск без ввода пароля?
Николай Бараненко
Лучший ответ ИМО. Каждый должен добавить псевдоним команды и работать с этим.
Даская
6

Лучше всего перечислить их, как предлагает Джофель .

Если бы я хотел позволить кому-то использовать ограниченное подмножество способностей команды, я бы не стал доверять подстановочным знакам в строке sudoers для этого. Даже если язык был более выразительным, чем глобусы-оболочки, слишком много угловых случаев, которые нужно отслеживать.

service httpd *Строка " " относительно безопасна, потому что (проверьте это :) serviceимеет только один полезный флаг ( --status-all), который не делает ничего особенно чувствительного, и (проверьте это тоже :) /etc/init.d/httpdбудет принимать только те командные строки, которые вы хотите разрешить.

Если существует так много комбинаций, что перечисление их становится неудобным, вам, вероятно, следует усомниться в том, что вы делаете. Но вы можете дать им доступ к тщательно написанному вспомогательному скрипту, который запускает команду для них (очень похоже /etc/init.d/http). Даже в этом случае вы должны быть как можно точнее и точнее перечислять, какие именно команды и опции разрешены, и не передавать какой-либо пользовательский ввод непосредственно целевой команде.

Jander
источник