Eu criei alguns serviços systemd que basicamente funcionam:
localização:
/etc/systemd/system/multi-user.target.wants/publicapi.service
conteúdo:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
Quando tento reiniciar o serviço como usuário techops na linha de comando, obtenho a seguinte saída:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
Quero que apenas os techops possam reiniciar os serviços e que esse prompt não apareça ao fazer login como techops. Como eu posso fazer isso?
Eu li que existem abordagens diferentes com o polkit-1 ou sudoers, mas não tenho certeza.
[ATUALIZAÇÃO] 27/01/2019 16:40
Obrigado por esta resposta abrangente a Thomas e Perlduck. Isso me ajudou a melhorar meu conhecimento do systemd.
De acordo com a abordagem para iniciar o serviço sem um prompt de senha, quero pedir desculpas por não enfatizar o problema real o suficiente:
Na verdade, o mais importante para mim é que nenhum outro usuário que não seja o techops deve parar ou iniciar o serviço. Mas, pelo menos nas duas primeiras abordagens, ainda posso executar service publicapi stop
e recebo o prompt ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
novamente. Quando escolho o usuário padrão e conheço a senha, pude parar todos os serviços. Quero negar que esse usuário faça isso, mesmo que ele tenha a senha . Informações importantes de plano de fundo para entender melhor por que essa é a parte mais importante para mim:
O usuário padrão é o único usuário exposto ao ssh, mas esse usuário não pode fazer mais nada (exceto mudar para outros usuários, se você tiver a senha desses outros usuários) . Mas, no momento, ele pode iniciar ou interromper os serviços, mas esse usuário não deve fazer isso.
Se alguém obtiver a senha do defaultuser e efetuar login via ssh, ele poderá interromper todos os serviços no momento. Isto é o que eu quis dizer com "Eu quero que apenas os técnicos possam reiniciar os serviços". Desculpe, eu não era tão exato na minha pergunta inicial. Eu pensei que sudo o usuário techops talvez ignorasse esse problema, mas não. O problema em si não é executar o comando sem o prompt da senha. (Eu poderia facilmente fazer isso como usuário do techops quando apenas executar /home/techops/publicapi start
). O problema em si é impedir que o usuário padrão inicie esses serviços.
E eu esperava que qualquer uma das soluções pudesse fazer isso.
Comecei com as abordagens de Thomas. A abordagem com o sudo funciona quando não quero que a senha dos techops do usuário seja solicitada quando executo os comandos conforme explicado, por exemplo
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
A segunda abordagem ainda não funciona para mim. Não consigo iniciar o serviço sem o prompt de senha ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
e a interrupção pode fazer login como usuário padrão quando tenho a senha deste usuário.
Com a terceira abordagem, o serviço nem inicia mais no processo de inicialização, por isso não tenho certeza se essa abordagem é a correta para mim. Não consigo nem com o systemctl enable publicapi.service
que me leva ao seguinte erro:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
O erro não ocorre quando eu movo todos os serviços novamente para / etc / systemd / system / e executo systemctl enable publicapi.service
. Em seguida, o serviço é iniciado novamente na inicialização.
Todas essas abordagens ajudarão mais ou menos a ignorar o prompt de senha do usuário do techops, mas quando executo service publicapi stop
ou systemctl stop publicapi
com o usuário padrão , posso interromper os serviços se tiver a senha. Mas meu objetivo é impedir que o usuário padrão inicie ou interrompa os serviços.
/etc/sudoers
arquivo se houver uma referência para esse usuário.
systemctl --user ...
como usuário etechops
não como root. Nem a minha sugestão, nem a um dos @PerlDuck dá quaisquersudo
direitos ao seu defaultuser mas apenas para o TechOps usuário.