En mi CMS, noté que los directorios necesitan el bit ejecutable ( +x
) establecido para que el usuario los abra. ¿Por qué se requiere el permiso de ejecución para leer un directorio y cómo funcionan los permisos de directorio en Linux?
fuente
En mi CMS, noté que los directorios necesitan el bit ejecutable ( +x
) establecido para que el usuario los abra. ¿Por qué se requiere el permiso de ejecución para leer un directorio y cómo funcionan los permisos de directorio en Linux?
Al aplicar permisos a directorios en Linux, los bits de permiso tienen significados diferentes que en los archivos normales.
r
) permite al usuario afectado enumerar los archivos dentro del directoriow
) permite al usuario afectado crear, renombrar o eliminar archivos dentro del directorio y modificar los atributos del directoriox
) permite al usuario afectado ingresar al directorio y acceder a archivos y directorios dentroT
o t
si el bit de ejecución está configurado para otros) establece que los archivos y directorios dentro de ese directorio solo pueden ser eliminados o renombrados por su propietario (o root)+x
en el directorio se otorga acceso a los inodos de archivos a través de este directorio específico (nada menos, nada más, bueno ... tal vez también lo chdir
necesite +x
). Para leer o escribir el contenido de un archivo, el usuario también necesita +r
/ +w
en este archivo, pero esos son permisos distintos (no anulan nada).
+x
en el directorio otorga acceso a los inodes de los archivos" - Esto parece una buena nemonía, pero ¿quizás no cuenta toda la historia? Sin el bit de ejecución establecido en un directorio, no puede cambiar el nombre de archivo de un archivo en ese directorio. Me pregunto por qué es esto, porque el nombre del archivo se almacena en una entrada de directorio, no en un inodo.
Primero, piense: ¿Qué es un directorio? Es solo una lista de elementos (archivos y otros directorios) que viven dentro. Entonces: directorio = lista de nombres.
Leer bit = Si está configurado, puede leer esta lista. Entonces, por ejemplo, si tiene un directorio llamado poems
:
ls poems
y obtendrá una lista de artículos que viven dentro (¡ -l
no revelará ningún detalle!).touch poems/so <TAB> poems/somefile
.poems
su directorio de trabajo (es decir, cd
en él).Write bit = Si está configurado, puede modificar esta lista, es decir, puede {agregar, renombrar, eliminar} nombres en ella. ¡Pero! En realidad, puede hacerlo solo si el bit de ejecución también está configurado.
Ejecutar bit = Haga de este directorio su directorio de trabajo, es decir, cd
en él. Necesita este permiso si desea:
Caso interesante 1 : Si tiene permisos de escritura + ejecución en un directorio, puede {eliminar, renombrar} elementos que viven dentro, incluso si no tiene permisos de escritura en esos elementos. (use un poco adhesivo para evitar esto)
Caso interesante 2 : si tiene permiso de ejecución (pero no escritura) en un directorio Y tiene permiso de escritura en un archivo que se encuentra dentro, no puede eliminar el archivo (porque implica eliminarlo de la lista). Sin embargo, puede borrar su contenido, por ejemplo, si es un archivo de texto, puede usar vi para abrirlo y eliminar todo. El archivo seguirá allí, pero estará vacío.
Resumen:
Leer bit = Puedes leer los nombres en la lista.
Escribir bit = Puede {agregar, renombrar, eliminar} nombres en la lista SI el bit de ejecución también está configurado.
Ejecutar bit = Puede hacer de este directorio su directorio de trabajo.
PD: El artículo mencionado por Kusalananda es una buena lectura.
x
bit para cualquier acceso a este archivo: porque cat a/b/c/d
, necesito el x
poco en todo a
, b
y c
, aunque yo no los uso como cwd.
x
permiso en el directorio, si no tiene x
permiso en el archivo dentro, realmente no puede "ejecutar" el archivo. Solo puede cat
hacerlo, por ejemplo, pero no puede ejecutar el archivo en sí.
ls -l
trabajar para una carpeta, necesita ambos r
y x
permiso.
He preparado esta tabla con todos los permisos posibles y sus efectos prácticos.
(*) Solo nombres de archivo : otros atributos como el tamaño o la fecha no son accesibles. Por ejemplo, puede usar la tecla de tabulación para autocompletar pero no el comando ls.
Algunos pensamientos :
-W-
fuera funcionalmente equivalente a los ---
directorios. No muy intuitivo Por supuesto, este tipo de bits de bajo nivel a menudo no lo son.
-W-
, pude cambiar el nombre del directorio (en un directorio con un bit adhesivo) pero no con ---
. Eso parece ser una diferencia
Aquí hay un buen artículo sobre esto.
Resumen:
Un directorio con su x
conjunto de bits permite al usuario cd
(cambiar el directorio) en este directorio y acceder a los archivos que contiene.
Detalles:
Leer ( r
)
La capacidad de leer los nombres de los archivos almacenados en este directorio.
Escribir ( w
)
La capacidad de cambiar el nombre de los archivos en el directorio, crear nuevos archivos o eliminar archivos existentes, si también tiene permisos de Ejecución. Si no tiene permisos de ejecución, los permisos de escritura no tienen sentido.
Ejecutar ( x
)
La capacidad de
cd
acceder a este directorio y acceder a los archivos de este directorio.
Aquí hay algunos ejemplos que deberían facilitar su comprensión:
# "Full Access". Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------ 1 reegen reegen 4096 Jan 01 2003 dir
# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------ 1 reegen reegen 4096 Jan 01 2003 dir
# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory. If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself. She can access any file (file
# permissions permitting) if she knows its name. She can
# create new files, or rename/delete existing ones.
d-wx------ 1 reegen reegen 4096 Jan 01 2003 dir
# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------ 1 reegen reegen 4096 Jan 01 2003 dir
Hay incluso más información en el artículo de Hacking Linux Exposed .
Del libro de Robert Love , "Programación del sistema LINUX", capítulo 1, permiso de sección-
Para cualquier operación que acceda a un archivo o directorio, primero debe resolver la ruta al archivo o directorio. La resolución requiere que el usuario tenga permiso de ejecución en todos los directorios a lo largo de la ruta, excepto el componente de ruta final. Entonces, para los directorios, puede pensar que el bit de ejecución significa "resoluble".
Tome la ruta /a/b/c.txt
como ejemplo, digamos que el usuario tiene 1) ejecutar permiso en /
y /a
; 2) tiene permiso de lectura /a/b
; 3) leer y escribir permiso en /a/b/c.txt
.
El usuario no podrá leer (lista) /a
, porque no tiene permiso de lectura. Pero la resolución del camino no falla.
El usuario será capaz de leer (lista) /a/b
, ya que el usuario tiene permiso de ejecución /
, /a
y el permiso de lectura en /a/b
. Tenga en cuenta que, al leer /a/b
, el nombre del archivo c.txt
es visible, pero los metadatos (por ejemplo, el tamaño del archivo) y el contenido no, porque el nombre del archivo se almacena con el directorio, no con el archivo, pero los metadatos se almacenan en el inodo del archivo.
El usuario no podrá leer /a/b/c.txt
, porque cuando la resolución de la trayectoria desde /
que /a
a /a/b
, falla en el /a/b
puesto que el usuario no tiene permiso de ejecución.
Vea también cómo se resuelve un nombre de ruta en un archivo .
Una analogía útil es pensar en cada archivo como un libro, y cada directorio como una habitación donde se guardan los libros.
Hay reglas para poder enumerar todos los nombres en una sala: el bit de lectura para directorios. Reglas para eliminar un libro de la sala: el bit de escritura para directorios. Y reglas para entrar en una sala y explorar: el directorio resultante ejecuta bit.
Esas reglas son separadas y diferentes a las reglas de cada libro. Hay reglas para permitir que alguien abra un libro y lea su contenido: los bits de lectura para cada archivo. Hay reglas para modificar el contenido de un libro: los bits de escritura para cada archivo. Y para ejecutar un archivo: los bits de ejecución para cada archivo.
Escribo bit (s) porque hay tres bits para cada acción. Hay un bit de lectura para el propietario, un bit de lectura para los grupos y un bit de lectura para todos los demás (otros). Si alguno de esos tres bits está configurado para un usuario específico, ese usuario tiene el bit de lectura activo. No importa cómo se encontró que poco a ser activos ya sea por u Ser o g rupo o o allí, que tiene los mismos resultados efectivos.
Por lo tanto, se podría permitir a un usuario ingresar a una habitación y eliminar libros de la biblioteca, pero no se le permitiría leer el contenido del mismo libro.
Es por eso que se requiere un bit de lectura para los directorios: para controlar quién está autorizado a enumerar los contenidos de la sala (títulos de libros).
Y el bit de ejecución se usa para controlar quién puede entrar en la sala de libros.
El significado de Ejecutar para directorios es bastante claro. Como no hay permiso de Traverse, a diferencia de Windows, debe sobrecargar algo. Los diseñadores eligieron Ejecutar, eso causa confusión infinita. Como un tipo de seguridad informática que asigna derechos de Ejecución a algo que no tiene la intención de Ejecutar, parece dudoso.
GENERIC_EXECUTE
y de lo que es.
chmod 771 dirOne
), no puede enumerar el contenido de dirOne. PERO si contiene un subdirectorio "dirTwo" con derechos establecidos como (chmod 774 dirTwo
), ¡en realidad puede enumerar su contenido!