Eu criei alguns serviços do systemd que basicamente funcionam:
localização:
/etc/systemd/system/multi-user.target.wants/publicapi.service
contente:
[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, recebo 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):
Eu quero que apenas techops possam reiniciar os serviços e quero que esse prompt não apareça ao fazer login como techops. Como eu posso fazer isso?
Eu li que existem abordagens diferentes com polkit-1 ou sudoers, mas não tenho certeza.
[ATUALIZAÇÃO] 27/01/2019 16:40
Obrigado por esta resposta abrangente para 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, e quero pedir desculpas por não ter enfatizado o problema real o suficiente:
Na verdade, o mais importante para mim é que nenhum outro usuário além de techops deve parar ou iniciar o serviço. Mas pelo menos com as 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 sei a senha, posso interromper todos os serviços. Quero impedir que esse usuário faça isso, mesmo que ele tenha a senha . Informações importantes para entender melhor por que essa é a parte mais importante para mim:
O usuário default é o único usuário que está exposto ao ssh, mas esse usuário não pode fazer mais nada (exceto alterar para outros usuários se você tiver a senha desses outros usuários) . Mas no momento, ele pode iniciar ou parar os serviços, mas esse usuário não deve fazer isso.
Se alguém obtiver a senha de defaultuser e fizer login via ssh, ele poderá interromper todos os serviços no momento. Isso é o que eu quis dizer com "eu quero que apenas técnicos possam reiniciar os serviços". Desculpe, não fui tão exato na minha pergunta inicial. Eu pensei que sudo o usuário techops talvez contornaria esse problema, mas não. O problema em si é não executar o comando sem prompt de senha. (Eu poderia facilmente fazer isso como usuário techops quando apenas executo /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 sudo funciona quando eu não quero pedir a senha para o usuário techops 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 prompt de senha ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
e paro consigo logar como usuário default quando tenho a senha deste usuário.
Com a terceira abordagem, o serviço nem inicia mais no processo de inicialização, então 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 de volta 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 para o usuário techops, mas quando eu executo service publicapi stop
ou systemctl stop publicapi
com defaultuser, posso interromper os serviços se tiver a senha. Mas meu objetivo é bloquear o usuário padrão de iniciar ou interromper serviços.