Creé algunos servicios systemd que básicamente funcionan:
ubicación:
/etc/systemd/system/multi-user.target.wants/publicapi.service
contenido:
[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
Cuando intento reiniciar el servicio como usuario de techops en la línea de comando, obtengo el siguiente resultado:
==== 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):
Quiero que solo los técnicos puedan reiniciar los servicios y quiero que este mensaje no aparezca al iniciar sesión como técnicos. ¿Cómo puedo hacer eso?
Leí que hay diferentes enfoques con polkit-1 o sudoers, pero no estoy seguro.
[ACTUALIZACIÓN] 2019-01-27 4:40 pm
Gracias por esta respuesta integral a Thomas y Perlduck. Me ayudó a mejorar mi conocimiento de systemd.
De acuerdo con el enfoque para iniciar el servicio sin una solicitud de contraseña, y quiero disculparme por no haber enfatizado el problema real lo suficiente:
En realidad, lo más importante para mí es que ningún otro usuario que Techops debe detener o iniciar el servicio. Pero al menos con los dos primeros enfoques todavía puedo ejecutar service publicapi stop
y recibo el mensaje ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
nuevamente. Cuando elijo el usuario predeterminado y conozco la contraseña, podría detener todos los servicios. Quiero negarle a este usuario que haga eso, incluso si tiene la contraseña . Información de fondo importante para comprender mejor por qué esta es la parte más importante para mí:
el usuario predeterminado es el único usuario que está expuesto a ssh, pero este usuario no puede hacer nada más (excepto cambiar a otros usuarios si tiene la contraseña de estos otros usuarios) . Pero por el momento, puede iniciar o detener los servicios, pero este usuario no debe hacerlo.
Si alguien obtiene la contraseña del usuario predeterminado e inicia sesión a través de ssh, entonces podría detener todos los servicios en este momento. Esto es lo que quise decir con "Quiero que solo los técnicos puedan reiniciar los servicios". Lo siento, no fui tan exacto en mi pregunta inicial. Pensé que suudir al usuario de Techops podría evitar este problema, pero no es así. El problema en sí mismo no es ejecutar el comando sin solicitud de contraseña. (Podría hacerlo fácilmente como usuario de techops cuando solo ejecuto /home/techops/publicapi start
). El problema en sí mismo es impedir que el usuario predeterminado inicie estos servicios.
Y esperaba que cualquiera de las soluciones pudiera hacer eso.
Comencé con los enfoques de Thomas. El enfoque con sudo funciona cuando no quiero que me pidan la contraseña para los usuarios de techops cuando ejecuto los comandos como se explica, por ej.
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
El segundo enfoque aún no funciona para mí. No puedo iniciar el servicio sin solicitud de contraseña ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
y puedo iniciar sesión como usuario predeterminado cuando tengo la contraseña de este usuario.
Con el tercer enfoque, el servicio ya ni siquiera comienza en el proceso de arranque, así que no estoy seguro de si este enfoque es el adecuado para mí. Ni siquiera puedo hacerlo con lo systemctl enable publicapi.service
que me lleva al siguiente error:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
El error no ocurre cuando muevo todos los servicios nuevamente a / etc / systemd / system / y ejecuto systemctl enable publicapi.service
. Luego, el servicio comienza nuevamente en el arranque.
Todos estos enfoques ayudarán más o menos a omitir la solicitud de contraseña para el usuario de techops, pero cuando ejecuto service publicapi stop
o systemctl stop publicapi
con el usuario predeterminado , puedo detener los servicios si tengo la contraseña. Pero mi objetivo es evitar que el usuario predeterminado inicie o detenga los servicios.
fuente
systemctl --user ...
como usuario,techops
no como root. Ni mi sugerencia ni el de @PerlDuck da ningúnsudo
derecho a su defaultuser pero sólo en la TechOps usuario./etc/sudoers
archivo si hay una referencia para ese usuario.Respuestas:
Para lograr que el usuario
techops
pueda controlar el serviciopublicapi.service
sin dar una contraseña, tiene diferentes posibilidades. No se puede responder cuál es el adecuado para usted, ya que debe elegirlo por su cuenta.El
sudo
enfoque clásico es quizás el más utilizado, ya que está allí durante mucho tiempo. Tendría que crear, por ejemplo, el archivo de la siguiente manera.Tenga en cuenta que el directorio desplegable
/etc/sudoers.d
solo está activo cuando#includedir /etc/sudoers.d
está configurado/etc/sudoers
. Pero ese debería ser el caso si está utilizando una distribución moderna de Ubuntu. Comoroot
ejecutar:Ahora debería poder ejecutar los
systemctl
comandos como usuariotechops
sin dar una contraseña anteponiendosudo
los comandos.El segundo método sería usar PolKit (se renombró de PolicyKit ) para permitir que el usuario
techops
controle lossystemd
servicios. Dependiendo de la versión depolit
, puede dar a los usuarios normales control sobre las unidades systemd.Para verificar la versión de polkit , simplemente ejecute
pkaction --version
.con polkit versión 0.106 y superior , puede permitir a los usuarios controlar unidades específicas del sistema.
Para hacerlo, puede crear una regla como
root
:con polkit versión 0.105 e inferior : puede permitir a los usuarios controlar las unidades systemd. Desafortunadamente, esto incluye todas las unidades systemd y es posible que no desee hacer esto. No estoy seguro de si hay una manera de limitar el acceso a unidades específicas del sistema con la versión 0.105 o inferior, pero tal vez alguien más pueda aclararlo.
Para habilitar esto, puede crear un archivo como
root
:En ambos casos, puede ejecutar
systemctl [start|stop|restart] publicapi.service
como usuariotechops
sin dar una contraseña. En el último caso (polkit <= 0.105) el usuariotechops
podría controlar cualquier unidad systemd.Una tercera opción sería hacer del servicio un servicio de usuario, que no necesita
sudo
nipolkit
configuraciones. Esto pone todo bajo el control del usuario y solo funciona si su servicio real que se inició/home/techops/publicapi start
puede ejecutarse sinroot
privilegios.Primero debe habilitar la demora para el usuario
techops
. Esto es necesario para iniciar el servicio de usuario en el arranque. Comoroot
ejecutar:A continuación, debe mover el
systemd
archivo de la unidad altechops
directorio del usuario. Como usuario,techops
ejecute los comandos de la siguiente manera.Tenga en cuenta que
WantedBy
tiene que serdefault.target
como no haymulti-user.target
en el contexto del usuario.Ahora vuelva a cargar la configuración y habilite el servicio. Nuevamente como usuario
techops
ejecuta los comandos.En general, debe colocar sus unidades systemd
/etc/systemd/system/
no directamente en/etc/systemd/system/multi-user.target.wants
. Cuando ejecutesystemctl enable publicapi.service
, se creará un enlace simbólico enetc/systemd/system/multi-user.target.wants
o cualquier objetivo especificado para esa unidad.Como ya se mencionó, si el servicio / proceso en sí puede ejecutarse sin privilegios de root, debe considerar agregarlo
User=techops
a su archivo de unidad para ejecutar el proceso con una cuenta de usuario no privilegiada.fuente
.pkla
no funciona. Esto necesita una[section]
entrada. Respuesta actualizadaEn primer lugar, no coloca un archivo de unidad en el directorio
/etc/systemd/system/multi-user.target.wants
. Este directorio es mantenido porsystemd
y lossystemctl
comandos. Coloque el archivo de la unidad en su/etc/systemd/system
lugar y luego habilítelo conEsto creará un enlace simbólico a continuación
multi-user.target.wants
(o donde sea, losystemctl
sepa mejor) para honrar las líneasen la unidad
A continuación, cree un
sudoers
archivo a continuación/etc/sudoers.d
:con el siguiente contenido:
No use un editor normal (p
sudo vim /etc/sudoers.d/techops
. Ej. ) Para editar ese archivo porque si le agrega errores de sintaxis, no podrá volver a ejecutarlosudo
.visudo
Por otro lado, comprueba la sintaxis del archivo antes de abandonar el editor.Ahora el usuario
techops
puede ejecutary los otros dos sin proporcionar una contraseña. Tenga en cuenta que debe escribir el comando y los parámetros exactamente como se indica en el
sudoers
archivo (excepto la/bin/systemctl
parte que se puede acortar a solosystemctl
).Por ejemplo,
sudo /bin/systemctl start publicapi
(sin.service
) solicitaría una contraseña.fuente