systemd: Udziel nieuprzywilejowanego użytkownika uprawnienia do zmiany jednej konkretnej usługi

20

Korzystam z prywatnego serwera gier na bezgłowym systemie Linux. Ponieważ nie jestem idiotą, wspomniany serwer działa jako własny nieuprzywilejowany użytkownik z minimalnymi prawami dostępu niezbędnymi do pobierania aktualizacji i modyfikowania światowej bazy danych.

Utworzyłem również plik jednostki systemowej, aby poprawnie uruchamiał, zatrzymywał i restartował serwer w razie potrzeby (na przykład dla wspomnianych aktualizacji).

Jednak, aby rzeczywiście zadzwonić systemctllub service <game> start/stop/restartjeszcze trzeba zalogować się jako root albo w sudozdolnej użytkownika.

Czy istnieje sposób, aby powiedzieć systemd, że dla <game>usługi nieuprzywilejowany użytkownik gamesrvmoże uruchamiać polecenia start / stop / restart?

Shadur
źródło
Która wersja PolicyKit / dystrybucji? Debian (i pochodne) są w starszej wersji, która wymaga innego formatu pliku konfiguracyjnego .
Gert van den Berg

Odpowiedzi:

37

Mogę wymyślić dwa sposoby, aby to zrobić:


Jednym z nich jest uczynienie z usługi usługi użytkownika, a nie usługi systemowej.

Zamiast tworzyć jednostkę systemową, jednostka systemowa zostanie umieszczona w katalogu osobistym użytkownika usługi, pod adresem $HOME/.config/systemd/user/daemon-name.service. Ten sam użytkownik może następnie zarządzać usługą za pomocą systemctl --user <action> daemon-name.service.

Aby umożliwić jednostce użytkownika rozpoczęcie rozruchu , root musi włączyć linger dla konta, tj sudo loginctl enable-linger username. Jednostka musi być również WantedBy=default.target.


Innym sposobem jest umożliwienie użytkownikowi dostępu do zarządzania jednostką systemową za pośrednictwem PolicyKit. Wymaga to systemd 226 lub wyższej (i PolicyKit> = 0.106 dla plików reguł JavaScript. D - sprawdź za pomocą pkaction --version).

Utworzyłbyś nowy plik konfiguracyjny PolicyKit, np. /etc/polkit-1/rules.d/57-manage-daemon-name.rulesKtóry sprawdza atrybuty, na które chcesz zezwolić. Na przykład :

// 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;
    }
});

Nazwany użytkownik może następnie zarządzać nazwaną usługą z systemctlużyciem i bez sudo.

Michael Hampton
źródło
Tryb użytkownika i loginctldziałał.
Shadur
1
Czy to działa na Ubuntu 16.04? Czy to normalne, że katalog rules.d nie istnieje? Nie mogę zmusić go do pracy. Moje zasady są ignorowane.
ygoe
3
Czy muszę coś zrestartować, aby włączyć PolicyKit?
Josir
@MichaelHampton Dzięki systemd --user mogę uzyskać wszystko, co chcę pracować, z wyjątkiem uruchamiania usługi podczas rozruchu. Myślę, że to normalne, kiedy czytam to w kilku miejscach (np. Archlinux wiki), ale mówisz, że powinno działać, czy jesteś tego pewien?
daks
@daks Tak to działa. Jeśli nadal masz z tym problem, zadaj nowe pytanie.
Michael Hampton
12

sudojest do tego stworzony. Zmodyfikuj swój /etc/sudoersplik za pomocą, visudoaby dodać Cmd_aliaskomendę, z której nieuprzywilejowany użytkownik będzie mógł korzystać:

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

i dodaj wiersz, aby umożliwić nieuprzywilejowanemu użytkownikowi korzystanie z poleceń zdefiniowanych za pomocą aliasu w następujący sposób:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Przeczytaj więcej dokumentacji na temat różnych parametrów polecenia sudo.

Może być konieczne zainstalowanie sudopakietu, aby był sudodostępny w systemie.

Henrik Pingel Przywróć Monikę
źródło
Wiem, jak używać sudo, tak. Zastanawiałem się, czy istnieje opcja, która pozwoliłaby mi pominąć nawet to, ponieważ w tym przypadku pierwszą rzeczą, którą systemdrobi plik jednostki, jest określenie, że należy go uruchomić jako gamesrv.
Shadur
1

Możesz powiązać się sudoz zapewnieniem dostępu równoważnego root, ale można go również użyć, aby umożliwić określony dostęp użytkownika root do określonego, ograniczonego zestawu poleceń.

W jaki sposób odpowiedziano już na błąd serwera, w [ Udzielanie dostępu do zestawu poleceń użytkownikowi innemu niż root bez dostępu sudo zestawu poleceń do użytkownika innego niż root bez sudo).

Korzystanie z PolicyKit jest nadal rzadkie. Używanie systemowej „jednostki użytkownika” powinno działać dobrze, ale historycznie twój cel został osiągnięty wiele razy dzięki możliwości sudoumożliwienia użytkownikowi uruchamiania określonych poleceń jako root.

Mark Stosberg
źródło