Como podemos permitir que usuários não raiz controlem um serviço system.d?

60

Com sysvinit, uma sudoersentrada como essa seria suficiente:

%webteam cms051=/sbin/service httpd *

Isso permitiria comandos como:

  • sudo service httpd status
  • sudo service httpd restart

Agora, com systemd, o nome do serviço é o argumento final. Ou seja, a reinicialização do serviço seria feita com:

systemctl restart httpd.service

Naturalmente, pensei em definir o comando como systemctl * httpd.servicefuncionaria, mas isso permitiria algo como o systemctl restart puppet.service httpd.serviceque não é o efeito desejado.

Considerando isso, qual seria a melhor maneira de permitir que usuários não raiz controlem um system.dserviço? Isso não precisa ser sudoers; talvez uma alteração na permissão do arquivo seja suficiente?

Belmin Fernandez
fonte
Não toquei em uma sudoconfiguração há algum tempo, mas você não poderia simplesmente fazer algo assim cms051=systemctl * httpd.service?
John WH Smith
1
Isso permitiria que você reiniciasse qualquer serviço então. Eu deveria ter incluído esse boato na pergunta. Desculpa.
Belmin Fernandez 26/03

Respostas:

43

Basta adicionar todos os comandos necessários sudoersseparadamente:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service
jofel
fonte
Eu esperava capturar todos os comandos da unidade, mas se precisar especificá-los, acho que é isso que terei que fazer.
Belmin Fernandez 26/03
9
status não é útil, como qualquer usuário pode fazer isso
Dereckson
5
O que é cms051?
kevin
1
Então, o que acontecerá se eu chamar systemctl restart http.service mariadb.service ;-)? Provavelmente MariaDB será reiniciado também
Marek Wajdzik
1
O @MarekWajdzik sudo não permite argumentos extras se não for permitido explicitamente com *ou padrões semelhantes.
Jofel
31

A resposta de @ jofel foi exatamente o que eu precisava para ter uma configuração funcional. Poste isso para qualquer um que tropeçar nessa questão. Eu precisava de uma maneira de capistranoreiniciar meu aplicativo Ruby depois de implantá-lo na minha máquina local. Isso significa que eu precisava de acesso sem senha para reiniciar os systemdserviços. É isso que eu tenho e funciona maravilhosamente!

Nota : meu usuário e grupo é chamado deployer
Colocar código em um arquivo personalizado aqui: /etc/sudoers.d/deployer
Código:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
BoomShadow
fonte
Eu preciso acrescentar que, depois de fazer login como usuário deployer, você deve executar o systemctlcomando com o sudo.
Muyiwa Olu 24/03
8

Crie um alias de comando com os comandos aos quais deseja que eles tenham acesso. Em seguida, atribua o grupo ao apelido de comando:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

Também é uma boa prática colocar edições no seu /etc/sudoers.d/filename em vez de editar diretamente o arquivo sudoers. Certifique-se de apontar para o seu .d / nome do arquivo nos sudoers, o que a maioria das novas distribuições faz de qualquer maneira. Colocar essas 2 linhas nos sudoers deve fazer o truque:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Nota: Esse # na frente do includedir não é um comentário. Deve permanecer.

Rico
fonte
Como adicionar chance de executar parar / iniciar / reiniciar sem inserir a senha?
Nikolay Baranenko 18/10/10
Melhor resposta IMO. Todos devem adicionar um alias de comando e trabalhar com isso.
DASKAjA 22/02
6

É mais seguro discriminá- los como sugere Jofel .

Se eu quisesse permitir que alguém usasse um subconjunto limitado das habilidades de um comando, não confiaria em caracteres curinga em uma linha de sudoers para fazê-lo. Mesmo se a linguagem fosse mais expressiva do que os shell globs, existem muitos casos de canto para acompanhar.

A service httpd *linha " " é relativamente segura porque (verifique isso :) servicepossui apenas um sinalizador útil ( --status-all) que não faz nada particularmente sensível e (verifique isso também :)) /etc/init.d/httpdaceitará apenas as linhas de comando que você deseja permitir.

Se houver tantas combinações que listá-las se tornem estranhas, você provavelmente deve questionar o que está fazendo. Mas você pode dar a eles acesso a um script auxiliar cuidadosamente escrito que executa o comando para eles (muito parecido /etc/init.d/http). Mesmo nesse caso, você deve ser o mais preciso e explícito possível para listar exatamente quais comandos e opções são permitidos e não passar nenhuma entrada do usuário diretamente para o comando target.

Jander
fonte