Acabo de encontrarme con algo inesperado (para mí) con respecto a los permisos de archivos en Linux (Arch Linux). Básicamente tengo:
userX
engroupX
fileX userX:groupX ---rwx----
Lo que me desconcierta:no puedo realizar ninguna acción (rwx
) en fileX
. ¿Es esto correcto? ¿Alguien puede confirmar que este es el comportamiento esperado?
Las únicas acciones que puedo realizar son mv
y rm
porque tengo permisos de escritura en el directorio principal.
La cuestión es que siempre pensé que estos permisos colapsan entre sí, comenzando con el más general (otro -> grupo -> usuario). En otras palabras, si o=rwx
¿A quién le importa cuáles son los permisos para el grupo y el usuario?
Aparentemente este no es el caso, pero no tiene mucho sentido para mí; parece contradictorio. Lo único en lo que este enfoque parece ser útil es en excluir fácilmente a una persona / grupo muy específico, lo que no parece una forma inteligente de hacerlo (en mi humilde opinión). Además, el propietario (¿y el grupo?) debería poder chmod
de todos modos, ¿verdad? ¿Alguna idea sobre este asunto?
Respuesta aceptada:
La cuestión es que siempre pensé que estos permisos colapsan entre sí, comenzando con el más general (otro -> grupo -> usuario).
Si fuera el caso, "otros" permisos se aplicarían a todos.
En otras palabras, si o=rwx, ¿a quién le importa cuáles son los permisos para el grupo y el usuario?
Eso es diferente de tu oración anterior. Aquí está implicando que los permisos están combinados con or, p. ese usuarioX tiene el permiso de lectura si el usuarioX posee el archivo y el archivo es legible por el usuario, o si un grupo al que pertenece el usuarioX posee el archivo y el archivo es legible por el grupo, o si el archivo es legible por otros. Pero no es así como funciona. De hecho, o=rwx
significa que el rwx
los permisos se aplican a otros, pero no dice nada sobre entidades que no son otros.
Primero, no importa directamente a qué grupos pertenece un usuario. El kernel no tiene una noción de usuarios que pertenecen a grupos. Lo que el kernel mantiene es, para cada proceso, una ID de usuario (la UID efectiva) y una lista de ID de grupo (el GID efectivo y los GID complementarios). Los grupos se determinan en el momento del inicio de sesión, mediante el proceso de inicio de sesión: es el proceso de inicio de sesión el que lee la base de datos del grupo (por ejemplo, /etc/group
). Los ID de usuario y grupo son heredados por procesos secundarios¹.
Cuando un proceso intenta abrir un archivo, con los permisos tradicionales de Unix:
- Si el usuario propietario del archivo es el UID efectivo del proceso, se utilizan los bits de permiso del usuario.
- De lo contrario, si el grupo propietario del archivo es el GID efectivo del proceso o uno de los ID de grupo complementarios del proceso, se utilizan los bits de permiso del grupo.
- De lo contrario, se utilizan los otros bits de permiso.
Solo se utiliza un conjunto de bits rwx. El usuario tiene prioridad sobre el grupo que tiene prioridad sobre otros. Cuando existen listas de control de acceso, se generaliza el algoritmo descrito anteriormente:
- Si hay una ACL en el archivo para el UID efectivo del proceso, entonces se usa para determinar si se otorga acceso.
- De lo contrario, si hay una ACL en el archivo para el GID efectivo del proceso o uno de los ID de grupo complementarios del proceso, se utilizan los bits de permiso de grupo.
- De lo contrario, se utilizan los otros bits de permiso.
Así -rw----r-- alice interns
indica un archivo que Alice puede leer y escribir, y que pueden leer todos los demás usuarios, excepto los internos. Un archivo con permisos y propiedad ----rwx--- alice interns
es accesible solo para pasantes, excepto Alice (ya sea que sea pasante o no). Dado que Alice puede llamar a chmod
cambiar los permisos, esto no proporciona ninguna seguridad; es un caso extremo. En sistemas con ACL, el mecanismo generalizado permite eliminar permisos de usuarios específicos o grupos específicos, lo que a veces es útil.
El uso de un solo conjunto de bits, en lugar de hacer or-ing en todos los bits para cada acción (leer, escribir, ejecutar), tiene varias ventajas:
- Tiene el efecto útil de permitir la eliminación de permisos de un conjunto de usuarios o grupos, en sistemas con ACL. En sistemas sin ACL, los permisos se pueden eliminar de un grupo.
- Es más simple de implementar:verifique un conjunto de bits, en lugar de combinar varios conjuntos de bits.
- Es más sencillo analizar los permisos de un archivo, porque se requieren menos operaciones.
¹ Pueden cambiar cuando se ejecuta un proceso setuid o setgid. Esto no está relacionado con el problema en cuestión.