Ejecutar vs Leer bit. ¿Cómo funcionan los permisos de directorio en Linux?

381

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?

Nick.h
fuente
17
... uh, porque para eso está la bandera "+ x" :)
badp
16
Piense así: la entrada del directorio contiene nombres de archivos , por lo que "leer" un directorio es enumerar los archivos, "usar" el directorio es acceder a los archivos.
tylerl
77
Con el conjunto de bits de ejecución de directorio , puede atravesar su jerarquía . Dado que pertenece a "otras" personas y solo tiene un conjunto de bits de ejecución ( 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!
Stphane
1
Los futuros visitantes también deberían ver preguntas relacionadas en AskUbuntu: askubuntu.com/q/1106822/295286
Sergiy Kolodyazhnyy

Respuestas:

352

Al aplicar permisos a directorios en Linux, los bits de permiso tienen significados diferentes que en los archivos normales.

  • El bit de lectura ( r) permite al usuario afectado enumerar los archivos dentro del directorio
  • El bit de escritura ( w) permite al usuario afectado crear, renombrar o eliminar archivos dentro del directorio y modificar los atributos del directorio
  • El bit de ejecución ( x) permite al usuario afectado ingresar al directorio y acceder a archivos y directorios dentro
  • El bit fijo ( To tsi 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)
Chris Down
fuente
25
Gran respuesta, pero creo que la última oración es engañosa. Ninguno de estos permisos se puede anular por archivo en realidad. Aquí "acceso" es un poco ambiguo: +xen 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 chdirnecesite +x). Para leer o escribir el contenido de un archivo, el usuario también necesita +r/ +wen este archivo, pero esos son permisos distintos (no anulan nada).
Stéphane Gimenez
2
La marca inmutable es específica del sistema de archivos y no anulará con precisión esos permisos, por eso creo que la última oración es engañosa :-)
Stéphane Gimenez
1
Creo que podría ser útil mencionar ACL en esta y otras respuestas, porque su aplicación para algunos directorios puede ser engañosa si se considera solo la información provista por Chris Down
user907860
44
Parece que esta respuesta no menciona el efecto combinado de escribir bit y ejecutar bit, como menciona la respuesta de Baldrick a continuación. es decir, si solo tiene permiso de escritura pero no permiso de ejecución, entonces es bastante inútil.
xji
1
@ StéphaneGimenez " +xen 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.
Kevin Wheeler
259

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:

  • Puede ls poemsy obtendrá una lista de artículos que viven dentro (¡ -lno revelará ningún detalle!).
  • Puede usar la finalización de la línea de comandos, es decir touch poems/so <TAB> poems/somefile.
  • No puede crear poemssu directorio de trabajo (es decir, cden é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, cden él. Necesita este permiso si desea:

  • acceder (leer, escribir, ejecutar) elementos que viven dentro.
  • modifique la lista en sí misma, es decir, agregue, cambie el nombre, elimine nombres en ella (por supuesto, el bit de escritura debe establecerse en el directorio).

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.

Baldrick
fuente
17
Pensar en el directorio como una lista hace las cosas más claras y lógicas.
Trismegistos
20
Gran respuesta, pero demasiado centrada en el término "directorio de trabajo". Necesito el xbit para cualquier acceso a este archivo: porque cat a/b/c/d, necesito el xpoco en todo a, by c, aunque yo no los uso como cwd.
glglgl
1
¡Aquí es donde descubrí que no puedes escribir a menos que también sea ejecutable! El caso 2 también es interesante, ¡gran respuesta!
Mirko
1
Otra nota es que incluso si tiene xpermiso en el directorio, si no tiene xpermiso en el archivo dentro, realmente no puede "ejecutar" el archivo. Solo puede cathacerlo, por ejemplo, pero no puede ejecutar el archivo en sí.
xji
2
Si desea ls -ltrabajar para una carpeta, necesita ambos ry xpermiso.
Eric Wang
44

He preparado esta tabla con todos los permisos posibles y sus efectos prácticos.

permisos de directorio de linux

(*) 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 :

  • Con X sin configurar , R y W son en su mayoría inútiles.
  • X solo deshabilitar RW le da una falsa sensación de seguridad ya que podría leer y escribir ciegamente el contenido de los archivos y acceder a los subdirectorios. Debe asegurarse de que todos los elementos secundarios directos del directorio tengan permisos explícitos.
  • Raramente usará otros valores que no sean:
    • 0 : sin acceso.
    • 1 : Acceso mínimo que permite atravesar.
    • 5 : Permitir lectura / escritura, pero sin alterar la estructura del árbol de directorios en sí.
    • 7 : acceso completo.
David
fuente
1
Consideraría 5 un valor útil, cuando desee permitir la lectura / escritura, pero sin alterar la estructura del árbol de directorios en sí.
hgiesel
Tienes razón. ¡Actualizado!
David
44
Gran cuadro resumen. Me hace preguntarme qué pensaba alguien que -W-fuera funcionalmente equivalente a los ---directorios. No muy intuitivo Por supuesto, este tipo de bits de bajo nivel a menudo no lo son.
CivFan
2
Probé esto en mi Mac, pero con -W-, pude cambiar el nombre del directorio (en un directorio con un bit adhesivo) pero no con ---. Eso parece ser una diferencia
cosyconemotel
3
@David, te estás perdiendo la parte pegajosa.
Pacerier
42

Aquí hay un buen artículo sobre esto.

Resumen:

Un directorio con su xconjunto 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 cdacceder 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 .

Kusalananda
fuente
4

Del libro de Robert Love , "Programación del sistema LINUX", capítulo 1, permiso de sección-

ingrese la descripción de la imagen aquí

alhelal
fuente
2

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.txtcomo 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 /, /ay el permiso de lectura en /a/b. Tenga en cuenta que, al leer /a/b, el nombre del archivo c.txtes 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 /aa /a/b, falla en el /a/bpuesto que el usuario no tiene permiso de ejecución.

Vea también cómo se resuelve un nombre de ruta en un archivo .

Dagang
fuente
0

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.

Isaac
fuente
-1

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.

NemoX
fuente
1
La invención del bit de permiso de ejecución es anterior a la invención del concepto de un permiso transversal distinto en aproximadamente dos décadas. La lógica de esta respuesta depende de una línea de tiempo histórica que no se parece en nada a la del mundo real, y tampoco se da cuenta de la existencia GENERIC_EXECUTEy de lo que es.
JdeBP