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?


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).


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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.