systemd: concedere a un utente senza privilegi l'autorizzazione a modificare un servizio specifico


20

Sto eseguendo un server di gioco privato su un box Linux senza testa. Poiché non sono un idiota, detto server è in esecuzione come proprio utente senza privilegi con i diritti minimi di accesso minimi necessari per scaricare gli aggiornamenti e modificare il database mondiale.

Ho anche creato un file di unità di sistema per avviare, arrestare e riavviare correttamente il server quando necessario (per tali aggiornamenti, ad esempio).

Tuttavia, per poter effettivamente chiamare systemctlo service <game> start/stop/restartdevo ancora accedere come root o come sudoutente capace.

C'è un modo per dire a systemd che per il <game>servizio all'utente non privilegiato gamesrvè consentito eseguire i comandi start / stop / restart?


Quale versione di PolicyKit / distribuzione? Debian (e derivati) sono su una versione precedente che richiede un diverso formato di file di configurazione .
Gert van den Berg,

Risposte:


37

Posso pensare a due modi per farlo:


Uno consiste nel rendere il servizio un servizio utente anziché un servizio di sistema.

Invece di creare un'unità di sistema, l'unità systemd verrà posizionata nella home directory dell'utente del servizio, in $HOME/.config/systemd/user/daemon-name.service. Lo stesso utente può quindi gestire il servizio con systemctl --user <action> daemon-name.service.

Per consentire l' avvio dell'unità utente all'avvio , root deve abilitare l'attesa dell'account, ad es sudo loginctl enable-linger username. Anche l'unità deve essere WantedBy=default.target.


L'altro modo è consentire all'utente l'accesso per gestire l'unità di sistema tramite PolicyKit. Ciò richiede systemd 226 o versione successiva (e PolicyKit> = 0.106 per i file delle regole.d di JavaScript - verificare con pkaction --version).

Si creerebbe un nuovo file di configurazione di PolicyKit, ad esempio /etc/polkit-1/rules.d/57-manage-daemon-name.rulesche verifica gli attributi che si desidera consentire. Per esempio :

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

L'utente nominato può quindi gestire il servizio denominato con systemctle senza l'utilizzo sudo.


Modalità utente e ha loginctlfunzionato.
Shadur,

1
Funziona su Ubuntu 16.04? È normale che la directory rules.d non esista? Non riesco a farlo funzionare. Le mie regole vengono ignorate.
giovedì

3
Devo riavviare qualcosa per abilitare PolicyKit?
Josir,

@MichaelHampton Con systemd --user posso ottenere tutto ciò che voglio lavorare, tranne l'avvio del servizio all'avvio. Penso che sia normale quando l'ho letto in diversi punti (ad es. Archlinux wiki), ma dici che dovrebbe funzionare, ne sei sicuro?
daks

@daks Sì, funziona. Se il problema persiste, fai una nuova domanda.
Michael Hampton

12

sudoè fatto per quello. Modifica il tuo /etc/sudoersfile con visudoper aggiungere a Cmd_aliasper i comandi che l'utente senza privilegi potrà usare:

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

e aggiungi una riga per consentire all'utente non privilegiato di utilizzare i comandi definiti con l'alias in questo modo:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Leggi altra documentazione sull'argomento per i vari parametri del comando sudo.

Potrebbe essere necessario installare il sudopacchetto per renderlo sudodisponibile sul sistema.


So usare sudo, sì. Mi chiedevo se ci fosse un'opzione che mi permettesse di saltare anche dal momento che in questo caso la prima cosa che fa il systemdfile di unità è specificare che deve essere eseguito come gamesrv.
Shadur,

1

È possibile associarsi sudoa fornire un accesso equivalente a root, ma può anche essere utilizzato per consentire a un utente specifico di accedere alla radice per un set specifico e limitato di comandi.

In che modo è già stata data risposta a Errore server, in [ Concessione dell'accesso di un set di comandi a un utente non root senza accesso sudo di un set di comandi a un utente non root senza sudo).

L'uso di PolicyKit è ancora raro. L'uso di una "unità utente" di systemd dovrebbe funzionare correttamente, ma storicamente il tuo obiettivo è stato raggiunto molte volte utilizzando la possibilità di sudoconsentire a un utente di eseguire comandi specifici come root.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.