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?


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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.