Configurando o Systemd Service para executar com acesso root

21

Eu tenho um serviço na forma de um aplicativo node.js configurado com o Systemd no Raspbian Jessie e ele está usando sua própria conta de usuário. No entanto, estou descobrindo que o serviço não é executado corretamente porque não possui as permissões necessárias. Um dos módulos de nó que instalei requer acesso root. Se eu executar o aplicativo manualmente com o sudo, tudo funcionará bem.

Existe uma maneira de dizer ao systemd para executar o serviço com o sudo?

Lucas
fonte
2
Como é o arquivo da sua unidade? Adicione-o à sua pergunta? Normalmente systemdexecuta os arquivos da unidade com direitos de root.
Thomas

Respostas:

31

diga ao systemd para executar o serviço sudo?

sudo não tem nada a ver com isso.

Normalmente, você instrui o systemd a executar um serviço como um usuário / grupo específico com uma diretiva User=e Group=na [Service]seção do arquivo da unidade.

Defina-os como root (ou remova-os, pois executar como root é o padrão).

HBruijn
fonte
Eu o configurei para usar um usuário específico, pois estava usando um guia para configurá-lo. No entanto, no meu caso, isso não era apropriado. Eu removi isso para rodar como root por padrão e agora tudo funciona!
Lucas
2
Executar como root não é o mesmo que executar com User=root. Veja minha resposta.
Mark Stosberg
Onde esse arquivo pode ser editado?
Matthew
15

Para limpar, os systemdserviços do sistema são executados como raiz por padrão, mas ainda há uma diferença entre o comportamento padrão e a execução de um serviço do sistema User=root.

Conforme documentado em Variáveis ​​de ambiente em processos gerados , essas variáveis ​​são definidas apenas se User=estiverem definidas:

$USER, $LOGNAME, $HOME, $SHELL

Eu testei para confirmar esta descoberta. Portanto, se você deseja executar um serviço systemd como root que precise de uma das variáveis ​​acima, é necessário definir User=root.

Mark Stosberg
fonte
Obrigado! Essa foi a única coisa que funcionou para mim em um aplicativo que eu tenho
Pedro Torres
Nota: se você definir Usuário = raiz, provavelmente também deverá definir Grupo = raiz :) superuser.com/a/1452367/39364
rogerdpack
2

uma solução temporária, mas funcionou rapidamente:

/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'

Pode ser executado com um usuário que tenha privilégios de sudo em um arquivo de unidade systemd da seguinte maneira:

[Unit]
Description=Rails Webserver
After=syslog.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/var/www/webserver
ExecStart=/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target
daino3
fonte
Isso tem vários problemas: primeiro, as duas primeiras respostas explicam por que o uso de um usuário e o sudo são desnecessários e mostram o caminho certo para isso. Segundo, você não deve executar o seu aplicativo da web como root de qualquer maneira. Terceiro, seu aplicativo da web deve estar atrás de um servidor da web normal, como o nginx.
Michael Hampton
Não vou discordar de você em nenhum dos seus pontos. Mas se alguém, como eu, quisesse um servidor básico, o mais rápido possível, um servidor, essa é uma opção viável que funciona.
daino3
Quase o mais rápido que puder. Obviamente, o uso sudodesacelerará um pouco a inicialização. E é desnecessário.
Michael Hampton
@MichaelHampton Estou tentando escrever um backdoor, então achei esta resposta útil!
P. Soutzikevich 03/12
1

Execute-o como um usuário do sistema, neste caso, por padrão, o serviço está sendo executado como root.

Umut
fonte