Respuestas:
Con la versión inicial 1.4, setuid y setgid son compatibles de forma nativa en el archivo de configuración.
initctl --version
para encontrar su versión actual de advenedizo.
Al preguntar sobre el canal #upstart en freenode, la opinión oficial sobre el asunto es:
Una versión futura de Upstart tendrá soporte nativo para eso, pero por ahora, puede usar algo como:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
su
ese medio expect fork
e incluso expect daemon
no atrapan el PID final.
exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
¿Qué tal usar start-stop-daemon?
exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd
Del libro de cocina Upstart :
El método recomendado para los sistemas Debian y Ubuntu es utilizar la utilidad auxiliar
start-stop-daemon
. [...]start-stop-daemon
no impone límites PAM ("Módulo de autenticación enchufable") al proceso que inicia.
Nota: start-stop-daemon
no admitido en RHEL.
Hay varias formas de hacerlo, todas con una semántica ligeramente diferente, particularmente en relación con la pertenencia a grupos:
setuidgid
te colocará en el grupo que especifiques.
setuidgid
lo pondrán solo en ese grupo, por lo que no podrá acceder a los archivos que pertenecen a otros grupos de los que es miembro.setuidgid
de daemontools-bis y la setuidgid
del conjunto de herramientas nosh ambos tienen una -s
(también conocido como --supplementary
opción), que le pondrá en ese grupo, y también le puso en todos los grupos suplementarios para el usuario que especifique.Usando newgrp
una vez que te has convertido en el usuario menos privilegiado añadirá un solo grupo a su groupset, sino que también crea una nueva subcapa, por lo que es difícil de usar dentro de las secuencias de comandos.
start-stop-daemon
preserva la membresía de su grupo 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 grupos de nombre de usuario, como lo hace sudo -u username commandname
, por lo que probablemente sean la ruta para menos asombro.
Uso setuidgid
del paquete daemontools
.
Documentación aquí: http://cr.yp.to/daemontools/setuidgid.html
En una instancia de Ubuntu 10.10 en Amazon EC2, tuve mejor suerte con el start-stop-daemon
comando.
También luché con algunas de las otras estrofas advenedizas . Estoy llamando a una aplicación python con un virtualenv
parámetro específico y algunos 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
El PYTHONPATH
objetivo es instalar algunos paquetes desde el origen en la ruta del módulo PYTHON cuando se ejecuta este trabajo inicial. Tenía que hacer todo en caminos absolutos porque la chdir
estrofa no parecía funcionar.
Estaba usando CentOS 6, y no pude conseguir que el truco recomendado (para Upstart 0.6.5) funcionara para mí, ni el truco 'su' porque la cantidad de horquillas involucradas (4 creo) no fue rastreada por 'fork esperada 'o' esperar demonio '.
Finalmente acabo de hacer
chown user:group executable
chmod +s executable
(es decir, establecer el bit setuid y cambiar la propiedad).
Puede que no sea el método más seguro, pero para un proyecto interno de I + D, en nuestro caso no importó.
chmod 1700
o al menos una chmod u+sx,go-x
allí en lugar de solo +s
, calificaría como "lo suficientemente seguro". :)
Hay una tercera posibilidad dependiendo de lo que intente lograr. Es posible que pueda 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 estar regalando las llaves del reino en el proceso.
También puede cambiar el tiempo de espera de la caché de contraseñas 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 por la que hay muy pocas formas de realizar acciones privilegiadas y que realizan registros innecesarios y necesarios . Las restricciones flojas serían un peligro para la seguridad de 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 probablemente algo esté mal. Sudo genera solo una línea por uso en condiciones normales.
En CentOS 6, upstart 0.6.5, lo siguiente es lo que funcionó para mí.
script
exec su user_name << EOF
exec /path/to/command [parameters...]
EOF
end script
o:
script
exec su user_name << EOF
..... what you want to do ....
EOF
end script
Cuando uso
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
No se puede detener el proceso de trabajo initclt stop
. Creo que la razón es:
1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`