permitindo ao usuário executar serviços systemctl / systemd sem senha

25

Desejo que o usuário padrão ubuntupossa executar um serviço específico sem ser solicitada uma senha.

Especificamente systemctl restart unicorn_my_app.service.

Siga as instruções aqui para adicionar usuário ubuntua um grupo recém-criado, LimitedAdminsconfirmado com:

$ getent group LimitedAdmins
LimitedAdmins:x:1001:ubuntu

Criou um novo arquivo limitedadmins(usando sudo vim) no /etc/sudoers.ddiretório que contém o seguinte texto:

%LimitedAdmins ALL=NOPASSWD: /etc/init.d/unicorn_ofn_america restart, /etc/init.d/unicorn_ofn_america start

Eu também tentei:

%LimitedAdmins ALL=NOPASSWD: /bin/systemctl/unicorn_ofn_america restart, /bin/systemctl/unicorn_ofn_america start

(E /bin/systemd)

O conteúdo de /etc/sudoers/é o padrão, conforme confirmado com sudo visudo(ou sudo cat /etc/sudoers):

    #
    # This file MUST be edited with the 'visudo' command as root.
    #
    # Please consider adding local content in /etc/sudoers.d/ instead of
    # directly modifying this file.
    #
    # See the man page for details on how to write a sudoers file.
    #
    Defaults    env_reset
    Defaults    mail_badpass
    Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

    # Host alias specification

    # User alias specification

    # Cmnd alias specification

    # User privilege specification
    root    ALL=(ALL:ALL) ALL

    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL

    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL

    # See sudoers(5) for more information on "#include" directives:

    #includedir /etc/sudoers.d

(O log de hash #includedirnão é um comentário, mas parte da sintaxe da diretiva #include ).

No entanto, ainda há um prompt de senha após a execução systemctl restart unicorn_my_app.service

O serviço existe no init.ddiretório:

$ ls -l /etc/init.d | grep unicorn
-rwxr--r-- 1 ubuntu ubuntu 1874 Oct 29 06:47 unicorn_my_app

Tentei chmodding 755no aplicativo, mas não pense que isso deve fazer a diferença, pois ubuntuele é o proprietário de qualquer maneira.

Até tentou reiniciar o sistema sem nenhuma diferença. Estou faltando uma etapa, como uma reinicialização / recarregamento)? Configurando algo errado?

Devo também mencionar que eu costumava vimcriar o novo arquivo /etc/sudoers.d, pois parece que o visudocomando é apenas para edição /etc/sudoers.

MikeiLL
fonte

Respostas:

38

O arquivo sudoers é bastante flexível e com isso vem a complexidade. O que você deseja aqui é permitir o acesso ao comando /bin/systemctl, com parâmetros específicos:

%LimitedAdmins ALL=NOPASSWD: /bin/systemctl restart unicorn_my_app.service

Basicamente, você apenas pega a linha de comando exata que digita, codifica o nome do caminho por motivos de segurança e coloca isso no arquivo sudoers (ou /etc/sudoers.d). E observe que 'start' e 'restart' são completamente diferentes no que diz respeito ao sudo; permitir que um não conceda acesso ao outro.

rosuav
fonte
1
Não parece estar funcionando. Posso copiar /bin/systemctl restart unicorn_my_app.servicediretamente do /etc/sudoers.d/limitedadminsarquivo e executá-lo na CLI, e é solicitada uma senha. O usuário ubuntuprecisa que o tp seja especificado em algum lugar ou o ALLabre para todos os usuários em todos os domínios?
precisa saber é o seguinte
5
Você executaria sudo /bin/systemctl restart unicorn_my_app.servicee, em seguida, executaria sem uma senha. (postando como comentário no caso de a resposta do PsiOps ser separada desta)
rosuav
1
@rosuav Existe alguma maneira para que possamos executá-lo diretamente como systemctl restart myapp.servicesem usar sudo.
Kabirbaidhya
Na verdade não, mas você pode colocar o comando em um script (completo com o prefixo sudo) e depois colocar esse script em $ PATH. Ou crie um apelido de shell.
rosuav
3
Atenção: Em outras distros systemctl está em /usr/bin:-(.
guettli