systemd: надати непривілейованому користувачеві дозвіл на зміну однієї конкретної послуги


20

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

Я також створив файл системного блоку для належного запуску, зупинки та перезавантаження сервера при необхідності (наприклад, для зазначених оновлень).

Однак для того, щоб насправді зателефонувати systemctlабо service <game> start/stop/restartмені все одно потрібно увійти як кореневий або sudoздатний користувач.

Чи є спосіб сказати systemd, що для <game>служби непривілейований користувач gamesrvможе запускати команди start / stop / restart?


Яка версія PolicyKit / дистрибуції? Debian (та його похідні) знаходяться на більш старій версії, яка вимагає іншого формату файлу конфігурації .
Герт ван ден Берг

Відповіді:


37

Я можу придумати два способи зробити це:


Перший - це зробити послугу послугою користувача, а не системною службою.

Замість створення системного блоку системний блок розміститься під домашнім каталогом користувача служби за адресою $HOME/.config/systemd/user/daemon-name.service. Потім той самий користувач може керувати послугою за допомогою systemctl --user <action> daemon-name.service.

Щоб дозволити блоку користувача запускатися під час завантаження , root повинен увімкнути затримку для облікового запису, тобто sudo loginctl enable-linger username. Підрозділ також повинен бути WantedBy=default.target.


Інший спосіб - надання доступу користувачеві для управління системним блоком через PolicyKit. Для цього потрібні systemd 226 або новіші (і PolicyKit> = 0,106 для файлів JavaScript rules.d - перевірте pkaction --version).

Ви б створили новий файл конфігурації PolicyKit, наприклад, /etc/polkit-1/rules.d/57-manage-daemon-name.rulesякий перевіряє атрибути, які ви хочете дозволити. Для прикладу :

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

Потім іменований користувач може керувати іменованою службою за допомогою systemctlта без використання sudo.


Користувальницький режим і loginctlпрацював.
Шадур

1
Чи працює це на Ubuntu 16.04? Це нормально, що каталог rules.d не існує? Я не можу змусити його працювати. Мої правила ігноруються.
ygoe

3
Чи потрібно щось перезавантажувати, щоб активувати PolicyKit?
Джосір

@MichaelHampton За допомогою systemd --user я можу отримати все, що хочу працювати, крім запуску служби при завантаженні. Я думаю, що це нормально, коли я читаю його в декількох місцях (наприклад, wiki archlinux), але ти кажеш, що це має спрацювати, ти впевнений у цьому?
дакс

@daks Так, це працює. Якщо у вас все ще є проблеми, то задайте нове запитання.
Майкл Хемптон

12

sudoзроблено для цього. Відредагуйте /etc/sudoersфайл, visudoщоб додати Cmd_aliasкоманду, якою непривілейований користувач може користуватися:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

і додайте рядок, щоб дозволити непривілейованому користувачеві використовувати команди, визначені псевдонімом, таким як:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Прочитайте ще трохи документації по темі для різних параметрів команди sudo.

Можливо, вам доведеться встановити sudoпакет, щоб він був sudoдоступний у вашій системі.


Я знаю, як користуватися судо, так. Мені було цікаво, чи існує варіант, який дозволив би мені пропустити навіть те, що в цьому випадку перше, що systemdробить файл файлу, - це вказати, що його потрібно запускати як gamesrv.
Шадур

1

Ви можете асоціюватись sudoіз наданням доступу, еквівалентного root, але він також може бути використаний для дозволу конкретного кореневого доступу користувача для конкретного обмеженого набору команд.

Як це вже було відповідено на помилках сервера, за адресою [ Надання доступу до набору команд некореневому користувачеві без доступу sudo до набору команд некорінному користувачеві без судового режиму).

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

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