Estou executando um servidor de jogo privado em uma caixa linux sem cabeça. Como não sou idiota, esse servidor está sendo executado como seu próprio usuário sem privilégios, com os direitos de acesso mínimos 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 o servidor corretamente quando necessário (para as referidas atualizações, por exemplo).
No entanto, para realmente ligar systemctl
ou service <game> start/stop/restart
ainda preciso fazer login como root ou um sudo
usuário capaz.
Existe uma maneira de dizer ao systemd que, para o <game>
serviço, o usuário não privilegiado gamesrv
tem permissão para executar os comandos start/stop/restart?
Eu posso pensar em duas maneiras de fazer isso:
Uma delas é tornar o serviço um serviço de usuário em vez de um serviço de 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 então gerenciar o serviço comsystemctl --user <action> daemon-name.service
.Para permitir que a unidade do usuário inicie na inicialização , o root deve habilitar linger para a conta, ou seja,
sudo loginctl enable-linger username
. A unidade também deve serWantedBy=default.target
.A outra maneira é permitir o acesso do usuário para gerenciar a unidade do sistema por meio do PolicyKit. Isso requer systemd 226 ou superior (e PolicyKit >= 0,106 para os arquivos rules.d do JavaScript – verifique com
pkaction --version
). Observe que o Debian reteve deliberadamente o PolicyKit para uma versão 0.105 de quase uma década que não suporta essa funcionalidade, aparentemente por causa da opinião pessoal de uma pessoa , e nem ele nem as distribuições derivadas dele (como o Ubuntu) podem usar esse método.Você criaria um novo arquivo de configuração do PolicyKit, por exemplo,
/etc/polkit-1/rules.d/57-manage-daemon-name.rules
que verifica os atributos que você deseja permitir. Por exemplo :O usuário nomeado pode então gerenciar o serviço nomeado com
systemctl
e sem usarsudo
.sudo
é feito para isso. Edite seu/etc/sudoers
arquivovisudo
para adicionar umCmd_alias
para os comandos que você deseja que o usuário sem privilégios possa usar:e adicione uma linha para permitir que o usuário sem privilégios use os comandos definidos com o alias como este:
Leia mais algumas documentações sobre o tópico para os vários parâmetros do comando sudo.
Pode ser necessário instalar o
sudo
pacote parasudo
disponibilizá-lo em seu sistema.Você pode associar
sudo
o fornecimento de acesso equivalente aroot
, mas também pode ser usado para permitir que um usuário root específico acesse um conjunto específico e limitado de comandos.Como fazer isso já foi respondido em Server Fault, em [ Ging access of a set of commands to a non-root user without sudo access of a set of commands to a non-root user without sudo).
O uso do PolicyKit ainda é incomum. O uso de uma "unidade de usuário" systemd deve funcionar bem, mas historicamente seu objetivo foi alcançado muitas vezes usando a capacidade de
sudo
permitir que um usuário execute comandos específicos como root.