Як ми могли дозволити користувачам, які не користуються коренем, контролювати службу 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що не є бажаним ефектом.

Зважаючи на це, який найкращий спосіб дозволить користувачам, які не користуються коренем, контролювати 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

Я сподівався захопити всі одиничні команди, але якщо мені доведеться їх деталізувати, то, мабуть, саме це мені і доведеться робити.
Белмін Фернандес

9
статус не корисний, оскільки це може зробити будь-який користувач
Дерексон

5
Що таке cms051?
кевін

1
Отже, що буде, якщо я викликаю перезапуск системиctctl http.service mariadb.service ;-)? Можливо, також буде перезапущено
маріадб

1
@MarekWajdzik sudo не дозволяє зайвих аргументів, якщо явно не допускається з *подібними шаблонами або подібними шаблонами.
jofel

31

@ jofel відповідь було саме те, що мені потрібно, щоб отримати робочу настройку. Опублікувавши це для когось іншого, що спотикається з цим питанням. Мені потрібен був спосіб capistranoперезапустити додаток Ruby після розгортання з моєї локальної машини. Це означає, що мені потрібен був безпаровий доступ для перезавантаження systemdпослуг. ЦЕ це у мене, і це чудово працює!

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

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app

Мені потрібно додати, що після входу в систему як користувач deployerу випадку, ви повинні запустити systemctlкоманду з sudo.
Muyiwa Olu

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 / ім'я файлу в судорах, що все одно робить більшість нових дистрибутивів. Розміщуючи ці два рядки у вашому судері, слід зробити фокус:

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

Примітка. Це # перед включенимir не є коментарем. Це має залишитися.


Як додати шанс виконати зупинку / запуск / перезапуск без введення пароля?
Микола Бараненко

Найкраща відповідь ІМО. Кожен повинен додати псевдонім команди та працювати з цим.
DASKAjA

6

Найбезпечніше деталізувати їх так, як пропонує Йофель .

Якби я хотів дозволити комусь використовувати обмежений набір здібностей команди, я б не довіряв подвійним знакам у рядку судорів, щоб це зробити. Навіть якщо мова була більш виразною, ніж кульові оболонки, є дуже багато кутових справ, щоб їх слідкувати.

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

Якщо є так багато комбінацій, що перерахування їх стає незручним, ви, ймовірно, повинні запитати, що ви робите. Але ви можете надати їм доступ до ретельно написаного допоміжного сценарію, який виконує команду для них (подібне /etc/init.d/http). Навіть у цьому випадку ви повинні бути максимально точними та чіткими, щоб перелічити, які саме команди та параметри дозволені, і не передавати жодний ввід користувача безпосередньо цільовій команді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.