¿Por qué se ignora setuid en los directorios?

19

En los sistemas Linux, puede chmod u+s $some_directoryhacerlo con éxito , pero en lugar de forzar la propiedad de nuevos subdirectorios y archivos para ser el propietario del directorio que los contiene (y establecer subdirectorios u+stambién) como podría esperar, el sistema simplemente ignora el bit setuid. Los subdirectorios y archivos continúan heredando los UID de sus procesos de creación, y los subdirectorios no están configurados de manera predeterminada.

¿Por qué se ignora setuid en los directorios y cómo puedo hacer que el sistema lo reconozca?

Blacklight Shining
fuente
Me pregunto si la opción de montaje "nosuid" puede afectar esto.
Heptita
El sistema de archivos en cuestión no está montado, nosuidaunque hay otro (un disco RAM /dev/shm) que / está / montado nosuid, y parece tratar el setuidbit exactamente de la misma manera. 6_9
Blacklight Shining
1
Ver también: serverfault.com/questions/371541/…
jjlin
2
En cuanto a su implementación, el código fuente de Linux está fácilmente disponible, no dude en implementar esta función. Como ya existe en FreeBSD, podría copiar fácilmente el código, estoy seguro. Por supuesto, esos bits aún no tendrían sentido en el sistema Linux de nadie más.
mikebabcock

Respuestas:

16

Recuerde que los bits setuid y setgid se inventaron para un propósito completamente diferente: hacer que un ejecutable se ejecute con el uid o gid de su propietario, en lugar del uid o gid del usuario que ejecuta el archivo. Cualquier otro uso es solo una característica adicional.

Estos bits no tienen función en archivos ordinarios que no son ejecutables. (Y también scripts de shell en algunas distribuciones, debido a problemas de seguridad). Originalmente, tampoco tenían función para directorios. Obviamente, alguien decidió que sería genial tomar el setgid no utilizado en los directorios y usarlo para garantizar la coherencia de la propiedad del grupo. Después de todo, si está jugando con la propiedad del grupo, es porque más de una persona está trabajando con el archivo, y probablemente tenga sentido que todos los archivos de un directorio dado pertenezcan al mismo grupo, sin importar quién los haya creado. Se eliminan las molestias debido a que alguien se olvida de ejecutar newgrp.

Entonces, ¿por qué no implementar la misma característica para setuid y el archivo uid? Bueno, uid es mucho más básico que gid. Si implementa esto, a menudo un archivo no pertenecerá al usuario que lo creó. Presumiblemente, el usuario aún puede modificar el archivo (suponiendo que la umask es algo sensato), pero no puede cambiar los bits de permiso. Es difícil ver la utilidad de eso.

Isaac Rabinovitch
fuente
Me gustaría que se implementara, aunque solo sea por razones de coherencia ... X3 En cualquier caso, ¿no existe una solución alternativa como un trabajo temporal para pasar periódicamente y cambiar la propiedad, / hay / alguna forma de forzar la propiedad del archivo?
Blacklight Shining
44
Estoy tentado de citar a Emerson sobre Consistencia tonta. Antes de que pueda convencerme de que es una característica deseable, tendrá que mostrarme un caso de uso donde tenga sentido.
Isaac Rabinovitch
1
FreeBSD chmod (2) en realidad tiene una discusión sobre esto, pero solo menciona que generalmente no debería usarse debido a "agujeros de seguridad" no especificados. Sospecho que la mayoría de otros sistemas Unix no adoptó esta característica porque si bien tiene algunos casos de uso, no es que terriblemente útil.
jjlin
1
"Difícil de ver la utilidad de eso" -> configurado en un directorio de inicio, por lo que los scripts de aprovisionamiento que se ejecutan como root no pueden olvidar crear algo por accidente
ufotds
1
ejecutar scripts de superusuario en su directorio personal es una muy mala idea
Isaac Rabinovitch
7

Creo que la respuesta a esta pregunta tiene que ver con los problemas de seguridad de "entrega de archivos" que han resultado en la mayoría de los sistemas operativos modernos tipo Unix que no permiten la "entrega de archivos". "Entrega de archivos" es cuando un usuario que no es superusuario cambia la propiedad de un archivo a otra persona que no sea ese usuario. Esta capacidad ofrece muchas oportunidades para la travesura.

Dado que no se permiten sorteos de archivos, setuid en los directorios, que realizarían la misma función en otra forma, no está permitido o ignorado si se establece.

En cuanto a cambiar el comportamiento, tendría que modificar las bibliotecas y utilidades del sistema operativo.

Yedric
fuente
2

Un muy buen caso de uso para implementarlo es este:

Digamos que tiene un servidor multisitio con 3 sitios seguros. Tienes 3 grupos creados, uno para cada uno de los diferentes mantenedores de sitios. Todos los archivos en todos los sitios deben ser propiedad del usuario de apache para que apache pueda leerlos y escribirles (drupal / wordpress, etc.).

Si el setuid funcionara como el bit setgid para los permisos de directorios, se vería así:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

De esta forma, cada grupo de mantenedores tenía acceso para ver y tocar solo su contenido, pero el usuario del servidor web apache podía servir todo el contenido y no era necesario que los usuarios se preocuparan por cambiar la propiedad de los archivos cargados.

Otro caso de uso es para ftp / http anónimo o incluso cargas sftp / ssh. El grupo y el GID en el directorio de carga serían root, al igual que el propietario y el UID. Los otros permisos serían -wx. Esto permitiría a todos ESCRIBIR el acceso al directorio de carga, pero no podrían leer nada una vez que se cargó y la raíz sería propietaria de todos los archivos recién creados.

Por lo tanto, hay dos casos de uso perfectamente buenos y válidos para habilitar la funcionalidad UID en los directorios para que coincida con el bit GID.

Steven Mercurio

usuario297422
fuente
1
Esto no parece abordar la pregunta que se hizo.
Kevin Panko
2
@KevinPanko No, no responde mi pregunta. Incluso podría estar fuera de tema para el sitio ("¿para qué es un caso de uso <nonexistent feature X>?"). Sin embargo, se refiere a mi pregunta, y yo, como el autor de la pregunta, me parece útil.
Blacklight Shining
0

Un poco tarde para la fiesta, pero en caso de que los futuros lectores se encuentren con esto;) Como lo han dicho otros, en un sistema de archivos OS-X estándar se ignora el setUID para directorios, y no parece haber una forma fácil de evitar esto ( mount -o.... o lo que no). Como a menudo, la página de manual en realidad no cumple con el comportamiento de OS-X, literalmente dice:

4000 (el bit set-user-ID-on-execute) [...] Los directorios con el bit set-user-id set obligarán a que todos los archivos y subdirectorios creados en ellos sean propiedad del propietario del directorio y no de el uid del proceso de creación [...]

pero también enumera la posibilidad de lograr el mismo efecto sin renunciar a la propiedad original. Linux usa '[g /] setfacls' para efectos similares (son permisos que no son realmente visibles a primera vista, por lo que a veces puede ser una molestia).

En cuanto al 'cómo puedo lograr efectos similares', lea la página de manual completa y juegue con:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

puedes consultar a través de

ls -le

si todo se ve bien Otras opciones incluyen insertar reglas en posiciones específicas, eliminar o reemplazar reglas específicas. Las dos opciones notables aquí son " file_inherity directory_inherit" que permiten que las reglas se adjunten a un nuevo directorio / archivo.

Realmente no me gusta usar setUID, pero setGID es muy útil en servidores de archivos donde simplemente configurar el grupo 'principal' no funciona o los clientes tienen máscaras de archivos que no permiten la escritura grupal. Eso sería resuelto por:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup
Keith
fuente
¡Bienvenido a Stack Exchange! Esta es una buena respuesta, aunque en lo que respecta a OS X en lugar de distribuciones de Linux (que, como mencionaste, usa un sistema ACL diferente), no parece tan relevante aquí. Definitivamente encajaría bien en una pregunta sobre cómo hacer que OS X honre los directorios setuid; tal vez deberías publicar uno ?
Blacklight Shining
Por cierto, ¡el bit que dejó fuera de la página del manual de OS X en chownrealidad parece bastante importante! "[...] si el sistema de archivos subyacente admite esta característica: consulte chmod (2) y la opción suiddir para montar (8)". En realidad, nunca antes había notado ese bit. Si se implementa HFS suiddir, puede lograr que esto suceda en un sistema OS X común.
Blacklight Shining
(Y las ACL de OS X son tan "realmente no visibles a primera vista" como las ACL de Linux).
Blacklight Shining
0

Bueno, debe respetar el estándar. Puedo pensar en bastantes escenarios con sftp-only que me ahorraría muchos problemas, tanto con acl como con el conjunto de máscara de acl que hace sshd, y el reinicio que debo hacer a esa máscara.

La seguridad por defecto es bastante útil, pero si no la convierte en una opción, simplemente está creando una pesadilla.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

De cualquier manera, es como lo hace Linux ahora, así que solo use acl para solucionarlos.

usuario576407
fuente
-1

De acuerdo con http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories, el bit setuid se ignora para los directorios en los sistemas UNIX y Linux. Sin embargo, es posible hacer que actúe como espera en FreeBSD.

mikebabcock
fuente
No fue útil: pregunté por qué setuidse ignoraron los directorios y si era posible hacer que se reconociera en Linux.
Blacklight Shining
Parece obvio que se ignora en Linux porque se ignora en Unix, lo que hace que el comportamiento correcto para Linux se ajuste a * nix real. Siéntase libre de leer el artículo en cuestión. Misma respuesta en greenend.org.uk/rjk/tech/perms.html de 2004, también un duplicado de serverfault.com/questions/371541/…
mikebabcock
Entonces, ¿por qué se ignora en Unix?
Isaac Rabinovitch
@IsaacRabinovitch ya que Blacklight dejó en claro que la pregunta es sobre Linux, eso no es relevante [lengua en la mejilla] pero sospecho que es un comportamiento simplemente indefinido donde múltiples Unix hicieron cosas diferentes con él y no hacer nada es una suposición más segura.
mikebabcock
La pregunta / está / etiquetada linux, sí, pero eso no significa que prefiera una respuesta vaga "Se hace de esta manera porque otros sistemas lo hacen de esta manera" a una respuesta que explica por qué se hace de esa manera en otros sistemas. (¿Tal vez la linuxetiqueta simplemente debería eliminarse?)
Blacklight Shining