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.
Para conseguir que o usuário
techops
possa controlar o serviçopublicapi.service
sem fornecer uma senha, você tem diferentes possibilidades. Qual deles é adequado para você não pode ser respondido, pois você deve escolher por conta própria.A abordagem clássica
sudo
talvez seja a mais utilizada, pois existe há muito tempo. Você teria que criar, por exemplo, o arquivo da seguinte forma.Observe que o diretório drop-in
/etc/sudoers.d
só está ativo quando#includedir /etc/sudoers.d
definido em/etc/sudoers
. Mas esse deve ser o caso se você estiver usando uma distribuição moderna do Ubuntu. Comoroot
executar:Agora você deve ser capaz de executar os
systemctl
comandos como usuáriotechops
sem fornecer uma senha anexandosudo
os comandos.O segundo método seria usar o PolKit (foi renomeado de PolicyKit ) para permitir que o usuário
techops
controle ossystemd
serviços. Dependendo da versão dopolit
, você pode dar aos usuários normais controle sobre as unidades do systemd.Para verificar a versão do polkit , basta executar
pkaction --version
.com polkit versão 0.106 e superior , você pode permitir que os usuários controlem unidades específicas do systemd.
Para fazer isso, você pode criar uma regra como
root
:com polkit versão 0.105 e inferior : você pode permitir que os usuários controlem unidades do systemd. Infelizmente, isso inclui todas as unidades do systemd e talvez você não queira fazer isso. Não tenho certeza se existe uma maneira de limitar o acesso a unidades específicas do systemd com a versão 0.105 ou inferior, mas talvez alguém possa esclarecer.
Para habilitar isso, você pode criar um arquivo como
root
:Em ambos os casos, você pode executar
systemctl [start|stop|restart] publicapi.service
como usuáriotechops
sem fornecer uma senha. No último caso ( polkit <= 0.105 ) o usuáriotechops
pode controlar qualquer unidade systemd.Uma terceira opção seria tornar o serviço um serviço de usuário, que não necessita
sudo
nem depolkit
configurações. Isso coloca tudo sob o controle do usuário e só funciona se o serviço real com o qual foi iniciado/home/techops/publicapi start
puder ser executado semroot
privilégios.Primeiro você tem que habilitar o lingering para o usuário
techops
. Isso é necessário para inicializar o serviço de usuário na inicialização. Comoroot
executar:Em seguida, você deve mover o
systemd
arquivo da unidade para otechops
diretório do usuário. Como usuáriotechops
, execute os comandos da seguinte forma.Observe que o
WantedBy
tem que serdefault.target
, pois não existemulti-user.target
no contexto do usuário.Agora recarregue a configuração e habilite o serviço. Novamente como usuário
techops
execute os comandos.Em geral, você deve colocar suas unidades systemd em
/etc/systemd/system/
não diretamente no/etc/systemd/system/multi-user.target.wants
. Quando você executasystemctl enable publicapi.service
um link simbólico será criado emetc/systemd/system/multi-user.target.wants
ou em qualquer destino especificado para essa unidade.Como já mencionado, se o próprio serviço/processo puder ser executado sem privilégios de root, você deve considerar adicionar
User=techops
ao seu arquivo de unidade para executar o processo com uma conta de usuário sem privilégios.Em primeiro lugar, você não coloca um arquivo de unidade no diretório
/etc/systemd/system/multi-user.target.wants
. Este diretório é mantido pelos comandossystemd
e .systemctl
Coloque o arquivo de unidade em/etc/systemd/system
vez disso e ative-o comIsso criará um link simbólico abaixo
multi-user.target.wants
(ou onde quer que sejasystemctl
melhor) para honrar as linhasna unidade.
Em seguida, crie um
sudoers
arquivo abaixo/etc/sudoers.d
:com o seguinte conteúdo:
Não use um editor comum (por exemplo
sudo vim /etc/sudoers.d/techops
, ) para editar esse arquivo porque se você colocar algum erro de sintaxe nele, não poderá executá-sudo
lo novamente.visudo
por outro lado verifica a sintaxe do arquivo antes de sair do editor.Agora o usuário
techops
pode executare os outros dois sem fornecer uma senha. Observe que você deve digitar o comando e os parâmetros exatamente como fornecidos no
sudoers
arquivo (exceto a/bin/systemctl
parte que pode ser reduzida para apenassystemctl
).Por exemplo,
sudo /bin/systemctl start publicapi
(sem.service
) pediria uma senha.