systemd: conceda a um usuário sem privilégios permissão para alterar um serviço específico

20

Estou executando um servidor de jogo particular em uma caixa Linux sem cabeça. Por não ser um idiota, o servidor está sendo executado como seu próprio usuário sem privilégios, com os direitos mínimos de acesso necessários para baixar atualizações e modificar o banco de dados mundial.

Também criei um arquivo de unidade systemd para iniciar, parar e reiniciar corretamente o servidor quando necessário (para as atualizações mencionadas, por exemplo).

No entanto, para realmente ligar systemctlou service <game> start/stop/restartainda preciso fazer login como sudousuário root ou capaz.

Existe uma maneira de dizer ao systemd que, para o <game>serviço, o usuário não privilegiado gamesrvtem permissão para executar os comandos start / stop / restart?

Shadur
fonte
Qual versão do PolicyKit / distribuição? O Debian (e derivativos) estão em uma versão mais antiga que requer um formato de arquivo de configuração diferente .
Gert van den Berg

Respostas:

37

Eu posso pensar em duas maneiras de fazer isso:


Uma é tornar o serviço um serviço ao usuário, e não um serviço do sistema.

Em vez de criar uma unidade de sistema, a unidade systemd será colocada no diretório inicial do usuário do serviço, em $HOME/.config/systemd/user/daemon-name.service. O mesmo usuário pode gerenciar o serviço com systemctl --user <action> daemon-name.service.

Para permitir que a unidade do usuário inicie na inicialização , o root deve ativar a demora na conta, ou seja sudo loginctl enable-linger username. A unidade também deve ser WantedBy=default.target.


A outra maneira é permitir que o usuário acesse a unidade do sistema via PolicyKit. Isso requer systemd 226 ou superior (e PolicyKit> = 0.106 para os arquivos rules.d do JavaScript - verifique com pkaction --version).

Você criaria um novo arquivo de configuração do PolicyKit, por exemplo, /etc/polkit-1/rules.d/57-manage-daemon-name.rulesque verifica os atributos que deseja permitir. Por exemplo :

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

O usuário nomeado pode gerenciar o serviço nomeado com systemctle sem o uso sudo.

Michael Hampton
fonte
Modo de usuário e loginctlfuncionou.
Shadur 29/03/19
11
Isso funciona no Ubuntu 16.04? É normal que o diretório rules.d não exista? Eu não posso fazê-lo funcionar. Minhas regras são ignoradas.
ygoe 30/05
3
Preciso reiniciar algo para ativar o PolicyKit?
Josir
@ MichaelHampton Com o systemd --user, posso obter tudo o que quero trabalhar, exceto a inicialização do serviço na inicialização. Eu acho que isso é normal, já que li em vários lugares (por exemplo, wiki do archlinux), mas você diz que deve funcionar, tem certeza?
Daks
@ daks Sim, funciona. Se você ainda tiver algum problema, faça uma nova pergunta.
Michael Hampton
12

sudoé feito para isso. Edite seu /etc/sudoersarquivo visudopara adicionar a Cmd_aliasaos comandos que você deseja que o usuário não privilegiado possa usar:

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

e adicione uma linha para permitir que o usuário não privilegiado use os comandos definidos com o alias como este:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Leia mais alguma documentação sobre o tópico para os vários parâmetros do comando sudo.

Pode ser necessário instalar o sudopacote para ter sudodisponível no seu sistema.

Henrik Pingel Restabelecer Monica
fonte
Eu sei como usar o sudo, sim. Fiquei me perguntando se havia uma opção que me permitisse pular mesmo que, já que neste caso, a primeira coisa que o systemdarquivo de unidade faz é especificar que ele precisa ser executado como gamesrv.
Shadur 28/03
1

Você pode se associar sudoao fornecimento de acesso equivalente a root, mas também pode ser usado para permitir um acesso raiz do usuário específico a um conjunto limitado e limitado de comandos.

Como isso já foi respondido em Falha do servidor, em [ Fornecendo acesso a um conjunto de comandos para um usuário não raiz sem acesso ao sudo de um conjunto de comandos para um usuário não raiz sem sudo).

O uso do PolicyKit ainda é incomum. O uso de uma "unidade de usuário" systemd deve funcionar bem, mas historicamente seu objetivo foi atingido muitas vezes, com a capacidade de sudopermitir que um usuário execute comandos específicos como root.

Mark Stosberg
fonte