systemd: concede a un usuario sin privilegios permiso para modificar un servicio específico

20

Estoy ejecutando un servidor de juegos privado en una caja de linux sin cabeza. Como no soy un idiota, dicho servidor se está ejecutando como su propio usuario sin privilegios con los derechos mínimos de acceso que necesita para descargar actualizaciones y modificar la base de datos mundial.

También creé un archivo de unidad systemd para iniciar, detener y reiniciar correctamente el servidor cuando sea necesario (para dichas actualizaciones, por ejemplo).

Sin embargo, para llamar realmente systemctlo service <game> start/stop/restarttodavía necesito iniciar sesión como sudousuario root o como un usuario capaz.

¿Hay alguna manera de decirle a systemd que, para el <game>servicio, un usuario sin privilegios gamesrvpuede ejecutar los comandos de inicio / detención / reinicio?

Shadur
fuente
¿Qué versión de PolicyKit / distribución? Debian (y derivados) están en una versión anterior que requiere un formato de archivo de configuración diferente .
Gert van den Berg

Respuestas:

37

Se me ocurren dos formas de hacer esto:


Una es hacer que el servicio sea un servicio de usuario en lugar de un servicio del sistema.

En lugar de crear una unidad del sistema, la unidad systemd se colocará en el directorio de inicio del usuario del servicio, en $HOME/.config/systemd/user/daemon-name.service. El mismo usuario puede administrar el servicio con systemctl --user <action> daemon-name.service.

Para permitir que la unidad de usuario se inicie en el arranque , root debe habilitar la demora para la cuenta, es decir sudo loginctl enable-linger username. La unidad también debe ser WantedBy=default.target.


La otra forma es permitiendo que el usuario acceda a administrar la unidad del sistema a través de PolicyKit. Esto requiere systemd 226 o superior (y PolicyKit> = 0.106 para los archivos JavaScript rules.d - verifique con pkaction --version).

Crearía un nuevo archivo de configuración de PolicyKit, por ejemplo, /etc/polkit-1/rules.d/57-manage-daemon-name.rulesque verifica los atributos que desea permitir. Por ejemplo :

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

El usuario nombrado puede administrar el servicio nombrado con systemctly sin usar sudo.

Michael Hampton
fuente
Modo de usuario y loginctltrabajado.
Shadur
1
¿Funciona esto en Ubuntu 16.04? ¿Es normal que el directorio rules.d no exista? No puedo conseguir que funcione. Mis reglas son ignoradas.
2017
3
¿Tengo que reiniciar algo para habilitar PolicyKit?
Josir
@MichaelHampton Con systemd --user puedo obtener todo lo que quiero trabajar, excepto el inicio del servicio en el arranque. Creo que esto es normal ya que lo leí en varios lugares (por ejemplo, archlinux wiki), pero usted dice que debería funcionar, ¿está seguro?
daks
@daks Sí, funciona. Si todavía tiene un problema, haga una nueva pregunta.
Michael Hampton
12

sudoestá hecho para eso. Edite su /etc/sudoersarchivo con visudopara agregar un Cmd_aliaspara los comandos que desea que el usuario sin privilegios pueda usar:

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

y agregue una línea para permitir que el usuario sin privilegios use los comandos definidos con el alias de esta manera:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Lea más documentación sobre el tema para los diversos parámetros del comando sudo.

Es posible que deba instalar el sudopaquete para tener sudodisponible en su sistema.

Henrik Pingel reinstala a Monica
fuente
Sé cómo usar sudo, sí. Me preguntaba si había una opción que me permitiera omitir incluso eso, ya que en este caso lo primero que hace el systemdarchivo de la unidad es especificar que debe ejecutarse como gamesrv.
Shadur
1

Puede asociarse sudocon proporcionar acceso equivalente a root, pero también se puede usar para permitir un acceso raíz de usuario específico para un conjunto específico y limitado de comandos.

¿Cómo se ha respondido eso en Server Fault, en [ Dar acceso a un conjunto de comandos a un usuario no root sin sudo? Acceder a un conjunto de comandos a un usuario no root sin sudo).

Usar PolicyKit sigue siendo poco común. El uso de una "unidad de usuario" de systemd debería funcionar bien, pero históricamente su objetivo se ha cumplido muchas veces mediante la capacidad de sudopermitir que un usuario ejecute comandos específicos como root.

Mark Stosberg
fuente