Pregunta Ejecutando trabajos advenedizos como usuarios sin privilegios


¿Cuál es la forma canónica de tener un trabajo advenedizo que cambie su ID de usuario y ejecute el guión como un usuario sin privilegios?

Obviamente uno puede usar su o sudo, pero esto parece hacky (y puede generar líneas de registro innecesarias).


138


origen




Respuestas:


Con upstart v1.4, setuid y setgid son compatibles de forma nativa en el archivo de configuración.


108



Vea el libro de cocina para detalles sobre esto: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user - Jason Navarrete
En otras palabras, es compatible con Precise (12.04) y más reciente. - Edward Anderson
En otras palabras, no es compatible con centos 6 - socketpair
Para el registro, initctl --version para encontrar su versión actual de advenedizo. - Mahn
Curiosamente, la distribución de Amazon Linux en AWS utiliza la versión advenediza de RHEL 6 (0.6.5 !!!!) por lo que cualquiera que la use tendrá que usar la solución 'su'. - Asfand Qazi


Preguntando por el canal #upstart en freenode, la opinión oficial sobre el asunto es:

Un lanzamiento futuro de Upstart tendrá   soporte nativo para eso, pero por ahora,   puedes usar algo como:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

84



Esta es la única respuesta que funcionó en Amazon Linue EC2 (Probé todas las variaciones de sudo y su, incluyendo --session-command, -c, ad nauseum); ninguno de ellos permitió que el proceso se detuviera una vez iniciado; Muchas gracias por esto. - Kato
Esa es una magia de concha de fantasía, +1. - Steve Kehlet
Esto no funcionó para mí en CentOS 6 (Upstart 0.6.5). Hay una serie de horquillas (4 de profundidad, creo) iniciadas por su Eso significa que expect fork e incluso expect daemon no atrape el PID final. - Mark Lakata
Usé esto en Amazon Linux (Upstart 0.6.5) para iniciar un proceso de Jenkins (que no se demoniza a sí mismo, afortunadamente) ¡y funcionó! Tuve que cambiarlo un poco para redirigir la salida estándar a un archivo de registro y establecer algunas variables de entorno, ¡pero funcionó! Mi versión se ve así: exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...] - Asfand Qazi


¿Qué hay de usar start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

De Libro de cocina Upstart:

El método recomendado para los sistemas Debian y Ubuntu es usar la utilidad auxiliar start-stop-daemon. [...] start-stop-daemon no impone límites PAM ("Módulo de autenticación conectable") al proceso que inicia.

Nota: start-stop-daemon no soportado en RHEL.


17



También puede usar el grupo, si lo necesita. Con --chuid daemonuser: daemongroup - Evgeny


Hay varias maneras de hacerlo, todas con una semántica ligeramente diferente, particularmente en relación con la membresía grupal:

  • setuidgid te pondrá en el grupo que especifiques.

    • Los daemontools originales setuidgid te pondré solamente en ese grupo, por lo que no podrás acceder a los archivos que pertenecen a otros grupos de los que eres miembro.
    • los setuidgid de daemontools-encore y el setuidgid del conjunto de herramientas nosh ambos tienen un -s (a.k.a. --supplementary) opción que lo ubicará en ese grupo, y también lo pondrá en todos los grupos suplementarios para el usuario que especifique.
  • Utilizando newgrp una vez que te has convertido en el usuario menos privilegiado, agregarás un solo grupo a tu grupo, pero también crearás una nueva subcadena, lo que dificultará su uso dentro de las secuencias de comandos.

  • start-stop-daemon conserva su membresía grupal, y hace mucho más que solo setuid / setgid.

  • chpst -u username:group1:group2:group3... commandname le permitirá especificar exactamente qué membresías de grupo adoptar, pero (en Ubuntu) solo viene con el runit paquete, que es una alternativa a upstart.

  • su -c commandname username recoge todas las membresías de grupo de nombre de usuario, al igual que sudo -u username commandname, así que probablemente sean la ruta para menos asombro.


13





Utilizar setuidgid del paquete daemontools.

Documentación aquí: http://cr.yp.to/daemontools/setuidgid.html


8



daemontools no es un requisito previo del advenedizo, por lo que esta no parece la respuesta 'canónica' - Adam Nelson
Además, daemontools está en el universo (ubuntu 10.04), y upstart está en main. - jtimberman


En una instancia de Ubuntu 10.10 en Amazon EC2, tuve mejor suerte con el start-stop-daemon mando.

También tuve problemas con algunos de los otros advenedizos estrofas. Estoy llamando a una aplicación de Python con un específico virtualenv y algunos parámetros para mi programa ejecutado.

Lo siguiente es lo que funcionó para mí.

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

los PYTHONPATH es obtener algunos paquetes instalados desde la fuente en el PITÓN ruta del módulo cuando se ejecuta este trabajo advenedizo. Tenía que hacer todo en caminos absolutos porque el chdir la estrofa no parecía funcionar.


4



También he tenido problemas con env variables utilizadas con exec start-stop-daemon. - Thomas Bratt


Estaba usando CentOS 6, y no pude obtener el truco recomendado (para Upstart 0.6.5) para trabajar conmigo, ni el truco 'su' porque el número de horquillas involucradas (4 creo) no fue rastreado por 'fork' esperado 'o' esperar daemon '.

Finalmente acabo de hacer

chown user:group executable
chmod +s executable

(es decir, establecer el bit de setuid y cambiar la propiedad).

Puede que no sea el método más seguro, pero para un proyecto interno de I + D, no importó en nuestro caso.


3



Si fueras a hacer un chmod 1700 o al menos un chmod u+sx,go-x allí en lugar de solo +s, calificaría como "lo suficientemente seguro". :) - dannysauer


Hay una tercera posibilidad dependiendo de lo que estás tratando de lograr. Puede ser capaz de aflojar los controles de acceso en los archivos / dispositivos en cuestión. Esto puede permitir que un usuario sin privilegios monte o acceda a elementos que normalmente no se les permitiría. Solo asegúrate de no regalar las llaves del reino en el proceso.

Tú también puedes cambiar el tiempo de espera de la memoria caché de contraseña de sudo. Pero no lo recomiendo a menos que su máquina sea físicamente segura (es decir, cree que es poco probable que un transeúnte intente obtener acceso a sudo).

Hay una buena razón para que haya muy pocas formas de realizar acciones privilegiadas y que funcionen innecesario  necesario explotación florestal. Las restricciones sueltas serían un riesgo de seguridad para su sistema, y ​​la falta de registro significaría que no hay forma de saber qué sucedió cuando se vio comprometido.

Si el tamaño de sus archivos de registro es una preocupación, entonces es probable que algo esté mal. Sudo genera solo una línea por uso en condiciones normales.


0