¿En qué distribución de Linux estás? ¿O incluso Unix?
slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuidno funcionará en los scripts: actualmente está deshabilitado por razones de seguridad en la mayoría de las distribuciones * nix. Puede configurarlo, pero será ignorado. ¿Quizás pueda explicar más sobre su problema real para que podamos ayudarlo a resolver esto? ¿Qué guión es? ¿Por qué necesitas que se ejecute como root? ¿Está usando sudouna alternativa?
slhck
Has intentado sudo -s?
Nam Phung
Respuestas:
29
Tenga mucho cuidado: ¡los guiones combinados con setuid son peligrosos!
Si aún desea ejecutar su script con setuidset, puede escribir un programa corto en C como contenedor y establecer el setuidbit en el binario compilado.
Ejemplo de envoltura:
int main(void) {
setuid(0);
clearenv();
system("/absolute/path/to/your/script.sh");
}
Como root, evite el acceso de escritura (y tal vez otro) a su script:
raíz conocida /absolute/path/to/your/script.sh
chmod 700 /absolute/path/to/your/script.sh
Verifique que nadie, excepto la raíz, pueda reemplazar el script , por ejemplo, modificando los derechos de acceso de la carpeta principal:
raíz del chown / absoluta / ruta / a / su /
chmod 755 / absolute / path / to / your /
Modifique los derechos de acceso a sudo /etc/sudoerscon visudo:
TODOS TODOS = (raíz) NOPASSWD: /absolute/path/to/your/script.sh
Puede encontrar más detalles sobre la configuración (por ejemplo, restringir el acceso a usuarios o grupos específicos) en la página de manual de sudoers.
Luego, todos los usuarios pueden ejecutar el script como root sin contraseña:
sudo /absolute/path/to/your/script.sh
Esto es similar al uso de la solución de envoltura / setuid anterior.
Los peligros específicos no son muy obvios, pero giran fuertemente en torno al medio ambiente. A diferencia de la mayoría de los programas, el comportamiento de un script de shell se puede cambiar significativamente por docenas de variables de entorno, lo suficiente como para que sin amplias protecciones, dicho script pueda ser engañado fácilmente para ejecutar código arbitrario.
Stephanie
1
Debería agregar una llamada a clearenv () antes de que el sistema llame a ese contenedor, eliminando completamente el entorno para que no haya configuraciones malignas para manipular el script. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie
@ Stephanie Debo estar haciendo algo mal, porque todo esto parece demasiado loco para una tarea común. Esto es lo que estoy tratando de hacer: serverfault.com/questions/401405/…
HappyDeveloper
@HappyDeveloper No es una locura para un script setuid, ya que uno mal asegurado es un camino a la raíz para cualquiera que logre ejecutarlo.
Stephanie
44
sudose puede usar para dar acceso a todos los usuarios a un programa particular (o script). En ese sentido, actúa como un elegante envoltorio setuid. Parece que eso sería una mejor opción que escribir su propio contenedor setuid.
jjlin
4
La forma más fácil y segura es usar bits SETUID en los permisos de archivos. de esa manera, los permisos de comando se elevarán a permisos de propietario de archivo.
para evitar que la secuencia de comandos de la edición no establezca escritura para todos los bits.
setuid
no funcionará en los scripts: actualmente está deshabilitado por razones de seguridad en la mayoría de las distribuciones * nix. Puede configurarlo, pero será ignorado. ¿Quizás pueda explicar más sobre su problema real para que podamos ayudarlo a resolver esto? ¿Qué guión es? ¿Por qué necesitas que se ejecute como root? ¿Está usandosudo
una alternativa?sudo -s
?Respuestas:
Tenga mucho cuidado: ¡los guiones combinados con setuid son peligrosos!
Primero, eche un vistazo a esta pregunta / respuestas , especialmente en esta respuesta y advertencia de seguridad .
Si aún desea ejecutar su script con
setuid
set, puede escribir un programa corto en C como contenedor y establecer elsetuid
bit en el binario compilado.Ejemplo de envoltura:
Otra solución usando
sudo
(mencionado aquí ):Como root, evite el acceso de escritura (y tal vez otro) a su script:
Verifique que nadie, excepto la raíz, pueda reemplazar el script , por ejemplo, modificando los derechos de acceso de la carpeta principal:
Modifique los derechos de acceso a sudo
/etc/sudoers
convisudo
:Puede encontrar más detalles sobre la configuración (por ejemplo, restringir el acceso a usuarios o grupos específicos) en la página de manual de sudoers.
Luego, todos los usuarios pueden ejecutar el script como root sin contraseña:
Esto es similar al uso de la solución de envoltura / setuid anterior.
fuente
sudo
se puede usar para dar acceso a todos los usuarios a un programa particular (o script). En ese sentido, actúa como un elegante envoltorio setuid. Parece que eso sería una mejor opción que escribir su propio contenedor setuid.La forma más fácil y segura es usar bits SETUID en los permisos de archivos. de esa manera, los permisos de comando se elevarán a permisos de propietario de archivo.
para evitar que la secuencia de comandos de la edición no establezca escritura para todos los bits.
fuente
No sé si esto puede ser útil, pero, para que el script solo se ejecute como root, puede usar este shebang en la primera línea del script:
fuente