AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 496982
Accepted
Bevor
Bevor
Asked: 2019-01-28 00:45:20 +0800 CST2019-01-28 00:45:20 +0800 CST 2019-01-28 00:45:20 +0800 CST

Reiniciando o serviço systemd apenas como um usuário específico?

  • 772

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 stope 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.serviceque 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 stopou 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.

sudo systemd
  • 2 2 respostas
  • 28088 Views

2 respostas

  • Voted
  1. Best Answer
    Thomas
    2019-01-28T05:03:41+08:002019-01-28T05:03:41+08:00

    Para conseguir que o usuário techopspossa controlar o serviço publicapi.servicesem 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 sudotalvez 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.dsó está ativo quando #includedir /etc/sudoers.ddefinido em /etc/sudoers. Mas esse deve ser o caso se você estiver usando uma distribuição moderna do Ubuntu. Como rootexecutar:

    cat > /etc/sudoers.d/techops << SUDO
    techops ALL= NOPASSWD: /bin/systemctl restart publicapi.service
    techops ALL= NOPASSWD: /bin/systemctl stop publicapi.service
    techops ALL= NOPASSWD: /bin/systemctl start publicapi.service
    SUDO
    

    Agora você deve ser capaz de executar os systemctlcomandos como usuário techopssem fornecer uma senha anexando sudoos comandos.

    sudo systemctl start publicapi.service
    sudo systemctl stop publicapi.service
    sudo systemctl restart publicapi.service
    

    O segundo método seria usar o PolKit (foi renomeado de PolicyKit ) para permitir que o usuário techopscontrole os systemdserviços. Dependendo da versão do polit, 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:

      cat > /etc/polkit-1/rules.d/10-techops.rules << POLKIT
      polkit.addRule(function(action, subject) {
          if (action.id == "org.freedesktop.systemd1.manage-units" &&
              action.lookup("unit") == "publicapi.service" &&
              subject.user == "techops") {
              return polkit.Result.YES;
          }
      });
      POLKIT
      
    • 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:

      cat > /etc/polkit-1/localauthority/50-local.d/org.freedesktop.systemd1.pkla << POLKIT
      [Allow user techops to run systemctl commands]
      Identity=unix-user:techops
      Action=org.freedesktop.systemd1.manage-units
      ResultInactive=no
      ResultActive=no
      ResultAny=yes
      POLKIT
      

    Em ambos os casos, você pode executar systemctl [start|stop|restart] publicapi.servicecomo usuário techopssem fornecer uma senha. No último caso ( polkit <= 0.105 ) o usuário techopspode controlar qualquer unidade systemd.


    Uma terceira opção seria tornar o serviço um serviço de usuário, que não necessita sudonem de polkitconfiguraçõ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 startpuder ser executado sem rootprivilé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. Como rootexecutar:

    loginctl enable-linger techops
    

    Em seguida, você deve mover o systemdarquivo da unidade para o techopsdiretório do usuário. Como usuário techops, execute os comandos da seguinte forma.

    mkdir -p ~/.config/systemd/user
    
    cat > ~/.config/systemd/user/publicapi.service << UNIT
    [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=default.target
    UNIT
    

    Observe que o WantedBytem que ser default.target, pois não existe multi-user.targetno contexto do usuário.

    Agora recarregue a configuração e habilite o serviço. Novamente como usuário techopsexecute os comandos.

    systemctl --user daemon-reload
    systemctl --user enable publicapi.service
    systemctl --user start publicapi.service
    

    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ê executa systemctl enable publicapi.serviceum link simbólico será criado em etc/systemd/system/multi-user.target.wantsou 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=techopsao seu arquivo de unidade para executar o processo com uma conta de usuário sem privilégios.

    • 34
  2. PerlDuck
    2019-01-28T04:54:07+08:002019-01-28T04:54:07+08:00

    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 comandos systemde . systemctlColoque o arquivo de unidade em /etc/systemd/systemvez disso e ative-o com

    sudo systemctl enable publicapi.service
    

    Isso criará um link simbólico abaixo multi-user.target.wants(ou onde quer que seja systemctlmelhor) para honrar as linhas

    [Install]
    WantedBy=multi-user.target
    

    na unidade.

    Em seguida, crie um sudoersarquivo abaixo /etc/sudoers.d:

    sudo visudo -f /etc/sudoers.d/techops
    

    com o seguinte conteúdo:

    Cmnd_Alias HANDLE_PUBLICAPI = \
        /bin/systemctl start   publicapi.service, \
        /bin/systemctl stop    publicapi.service, \
        /bin/systemctl restart publicapi.service
    
    techops ALL = (root) NOPASSWD: HANDLE_PUBLICAPI
    

    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á- sudolo novamente. visudopor outro lado verifica a sintaxe do arquivo antes de sair do editor.

    Agora o usuário techopspode executar

    sudo systemctl start publicapi.service
    

    e os outros dois sem fornecer uma senha. Observe que você deve digitar o comando e os parâmetros exatamente como fornecidos no sudoersarquivo (exceto a /bin/systemctlparte que pode ser reduzida para apenas systemctl).

    Por exemplo, sudo /bin/systemctl start publicapi(sem .service) pediria uma senha.

    • 9

relate perguntas

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Diferença entre sudo nautilus e sudo -E nautilus

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Execute um único comando como outro usuário; restrições ao sudo

  • Permitir que o usuário execute um comando como root

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve