¿Cuál es la forma recomendada de ejecutar un servicio como usuario no root?

¿Cuál es la forma recomendada de ejecutar un servicio como usuario no root?

Tengo un script init.d simple que inicia y detiene un proceso. Llamo a init.d como root, pero me gustaría que el proceso que controla se ejecute como un usuario específico.

La sugerencia más común en línea parece ser hacer

su myuser -c "my_process args"

Sin embargo, esto crea un segundo espacio de proceso, un nuevo shell, etc. y es algo poco elegante.

Preferiría usar exec(), ya que reemplaza el shell, pero esto no toma un usuario como argumento. ¿Es este un caso en el que debería usarlo setuid()primero? ¿Qué pasa con la configuración del gid? ¿Hay algún problema que deba tener en cuenta?

Alternativamente, ¿existen soluciones específicas de la distribución para ejecutar init.d como un usuario diferente? Mi entorno es Centos 6.4.

Respuesta1

Depende de la distribución, pero las distribuciones basadas en RHEL usan una función Bash de /etc/rc.d/init.d/functionsla que se obtienen daemony que es en sí misma solo un contenedor alrededor del runusercomando. Por lo que puedo ver en los archivos fuente, es funcionalmente idéntico suen la mayoría de los casos, simplemente no pasa por PAM (probablemente para evitar algunos problemas del huevo y la gallina en ciertos casos).

En realidad, eso no responderá a sus objeciones, pero así es como lo hacen los servicios. La limpieza y la conformidad general con la lógica que usted desea es parte de la motivación para cosas comosystemd

Respuesta2

El uso de su someuser -c ...es lo que se necesita. Para empezar, setuid()una llamada al sistema no está disponible para el código shell. No hagas esto más difícil de lo necesario.

información relacionada