¿Cómo podríamos permitir que los usuarios no root controlen un servicio system.d?

60

Con sysvinituna sudoersentrada como esta sería suficiente:

%webteam cms051=/sbin/service httpd *

Esto permitiría comandos como:

  • sudo service httpd status
  • sudo service httpd restart

Ahora, con systemd, el nombre del servicio es el argumento final. Es decir, el reinicio del servicio se haría con:

systemctl restart httpd.service

Naturalmente, pensé que definir el comando systemctl * httpd.servicefuncionaría, pero eso permitiría algo como lo systemctl restart puppet.service httpd.serviceque no es el efecto deseado.

Teniendo esto en cuenta, ¿cuál sería la mejor manera de permitir que los usuarios no root controlen un system.dservicio? Esto no necesita ser sudoers; tal vez un cambio de permiso de archivo puede ser suficiente?

Belmin Fernandez
fuente
No he tocado una sudoconfiguración en mucho tiempo, pero ¿no podrías hacer algo así cms051=systemctl * httpd.service?
John WH Smith
1
Esto le permitiría reiniciar cualquier servicio entonces. Debería haber incluido ese dato en la pregunta. Lo siento.
Belmin Fernández

Respuestas:

43

Simplemente agregue todos los comandos necesarios por sudoersseparado:

%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
fuente
Esperaba capturar todos los comandos de la unidad, pero si tengo que detallarlos, supongo que eso es lo que tendré que hacer.
Belmin Fernández
99
el estado no es útil, ya que cualquier usuario puede hacer eso
Dereckson
55
¿Qué es cms051?
Kevin
1
Entonces, ¿qué sucederá si invoco systemctl restart http.service mariadb.service ;-)? Probablemente mariadb se reiniciará también
Marek Wajdzik
1
@MarekWajdzik sudo no permite argumentos adicionales si no se permite explícitamente con *patrones similares o similares.
jofel
31

La respuesta de @ jofel fue exactamente lo que necesitaba para obtener una configuración funcional. Enfrentando esto para cualquier otra persona que tropiece con esta pregunta. Necesitaba una forma de capistranoreiniciar mi aplicación Ruby después de implementarla desde mi máquina local. Eso significa que necesitaba acceso sin contraseña para reiniciar los systemdservicios. ¡ESTO es lo que tengo y funciona maravillosamente!

Nota : mi usuario y grupo se llama deployer
Poner código en un archivo personalizado aquí: /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
fuente
Necesito agregar que después de iniciar sesión como usuario deployeren el caso, debe ejecutar el systemctlcomando con sudo.
Muyiwa Olu
8

Cree un alias de comando con los comandos a los que desea que tengan acceso. Luego asigne el grupo a ese alias 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

También es una buena práctica colocar cualquier edición en su /etc/sudoers.d/filename en lugar de editar directamente el archivo sudoers. Asegúrate de apuntar a tu .d / filename en los sudoers, lo que la mayoría de las nuevas distribuciones hacen de todos modos. Colocar estas 2 líneas en sus sudoers debería hacer el truco:

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

Nota: Ese # en frente del incluidoir no es un comentario. Debe permanecer.

Rico
fuente
¿Cómo agregar la oportunidad de ejecutar detener / iniciar / reiniciar sin ingresar la contraseña?
Nikolay Baranenko
La mejor respuesta de la OMI. Todos deberían agregar un alias de comando y trabajar con esto.
DASKAjA
6

Es más seguro detallarlos como sugiere jofel .

Si quisiera permitir que alguien use un subconjunto limitado de las habilidades de un comando, no confiaría en los comodines en una línea de sudoers para hacerlo. Incluso si el lenguaje fuera más expresivo que los globos de concha, hay demasiados casos de esquina para rastrear.

La service httpd *línea " " es relativamente segura porque (verifique esto :) servicesolo tiene un indicador útil ( --status-all) que no hace nada particularmente sensible, y (verifique esto también :) /etc/init.d/httpdsolo aceptará las líneas de comando que desea permitir.

Si hay tantas combinaciones que enumerarlas se vuelve incómodo, probablemente deberías preguntarte qué estás haciendo. Pero podría darles acceso a un script auxiliar cuidadosamente escrito que ejecuta el comando para ellos (al igual que /etc/init.d/http). Incluso en este caso, debe ser lo más preciso y explícito posible para enumerar exactamente qué comandos y opciones están permitidos, y no pasar ninguna entrada del usuario directamente al comando de destino.

Jander
fuente