Як дозволити користувачам, які не користуються коренем, керувати системною службою за допомогою екземплярів?


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

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

Зауважте, що, як показано в цій дивовижній відповіді на інше пов'язане питання , використання судо глобусів для цього в кінцевому підсумку не є безпечним:

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

дійсно дозволяє

$ sudo systemctl start database@awsesomeapp unrelatedservice

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

Для того, що це варто, мені потрібно це робити в системі CentOS 7 та в майбутньому в системах RHEL7. Мені також були б цікаві рішення, які працюють на Arch Linux.

Відповіді:


1

Файл Sudoers не працюватиме так, або мені так здається. Файл 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
Як-це, це ті ж проблеми, що й судорі. Вам потрібно процитувати змінну, інакше вона буде розділена на пробіли.
kyrias

Це не вийде; setup не шанується для оболонок скриптів (в Linux).
Martijn

Все, що він робить, - це використовувати sudo для виконання сценарію. Це не що інше, ніж те саме із сценарієм "привіт світ". Якщо root може запустити скрипт, він буде працювати.
Баазігар

0

Пропоноване рішення на основіSUID

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

$ 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дозволить користувачеві, який виконує скрипт, отримати корінь до тих пір, поки виконується сценарій.
5. Тож sudo не зупиниться на паролі.

У будь-якому випадку, в системі з декількома користувачами, будьте дуже обережні з SUIDтому , що він може залишити місце для зловживання дозволу.


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