Jump to content
From ArchWiki
Esta traducción de File permissions and attributes fue revisada el 2022-11-01. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Artículos relacionados

- Usuarios y grupos
- umask
- Listas de control de acceso
- Capacidades

Los sistemas de archivos utilizan permisos y atributos para regular el nivel de interacción que los procesos del sistema pueden tener con archivos y directorios.

Advertencia: Cuando se utilizan con fines de seguridad, los permisos y atributos solo defienden contra ataques lanzados desde el sistema iniciado. Para proteger los datos almacenados de los atacantes con acceso físico a la máquina, también se debe implementar un cifrado data-at-rest.

## Ver los permisos

Utilice la opción `-l` de la orden ls para ver los permisos (o modo de archivo) establecidos para el contenido de un directorio, por ejemplo:

    $ ls -l /ruta/al/directorio

    total 128
    drwxr-xr-x 2 archie archie  4096 Jul  5 21:03 Escritorio
    drwxr-xr-x 6 archie archie  4096 Jul  5 17:37 Documentos
    drwxr-xr-x 2 archie archie  4096 Jul  5 13:45 Descargas
    -rw-rw-r-- 1 archie archie  5120 Jun 27 08:28 clientes.ods
    -rw-r--r-- 1 archie archie  3339 Jun 27 08:28 todo
    -rwxr-xr-x 1 archie archie  2048 Jul  6 12:56 miscript.sh

La primera columna es en lo que debemos enfocarnos. Tomando un valor de ejemplo de `drwxrwxrwx+`, el significado de cada carácter se explica en las siguientes tablas:

`d` | `rwx` | `rwx` | `rwx` | `+`
El tipo de archivo, técnicamente no forma parte de sus permisos. Véase `info ls -n "What information is listed"` para obtener una explicación de los posibles valores. | Los permisos que tiene el propietario sobre el archivo, explicados a continuación. | Los permisos que tiene el grupo sobre el archivo, explicados a continuación. | Los permisos que tienen todos los demás usuarios sobre el archivo, explicados a continuación. | Un solo carácter que especifica si se aplica un método de acceso alternativo al archivo. Cuando este carácter es un espacio, no existe un método de acceso alternativo. Un carácter `.` indica un archivo con un contexto de seguridad, pero ningún otro método de acceso alternativo. Un archivo con cualquier otra combinación de métodos de acceso alternativos se marca con un carácter `+`, por ejemplo en el caso de listas de control de acceso.

Cada una de las tres triadas de permisos (`rwx` en el ejemplo anterior) puede estar formada por los siguientes caracteres:

| Carácter | Efecto en archivos | Efecto en directorios
--- | --- | --- | ---
Permiso de lectura (primer carácter) | `-` | No se puede leer el archivo. | No se puede mostrar el contenido del directorio.
`r` | El archivo se puede leer. | Se puede mostrar el contenido del directorio.
Permiso de escritura (segundo carácter) | `-` | El archivo no se puede modificar. | El contenido del directorio no se puede modificar.
`w` | El archivo se puede modificar. | El contenido del directorio se puede modificar (crear nuevos archivos o directorios; cambiar el nombre o eliminar archivos o directorios existentes); requiere que también se establezca el permiso de ejecución; de lo contrario, este permiso no tiene ningún efecto.
Permiso de ejecución (tercer carácter) | `-` | El archivo no se puede ejecutar. | No se puede acceder al directorio con cd).
`x` | El archivo se puede ejecutar. | Se puede acceder al directorio con cd; este es el único bit de permiso que en la práctica se puede considerar "heredado" de los directorios ancestros, de hecho, si cualquier directorio en la ruta no tiene el bit `x` establecido, tampoco se puede acceder al archivo o directorio del final, independientemente de sus permisos; véase path_resolution(7) para obtener más información.
`s` | El bit setuid cuando se encuentra en la triada usuario; el bit setgid cuando se encuentra en la triada grupo; no se encuentra en la triada otros; también implica que `x` está establecido.
`S` | Igual que `s`, pero `x` no está configurado; raro en archivos normales e inútil en directorios.
`t` | El bit sticky; sólo se puede encontrar en la triada otros; también implica que `x` está establecido.
`T` | Igual que `t`, pero `x` no está configurado; raro en archivos normales.

Véase `info Coreutils -n "Mode Structure"` y chmod(1) para más detalles.

Sugerencia: Puede ver los permisos a lo largo de una ruta con `namei -l ruta`.

### Ejemplos

Veamos algunos ejemplos para aclararlo:

    drwx------ 6 archie archie  4096 Jul  5 17:37 Documentos

Archie tiene acceso completo al directorio `Documentos`. Puede listar, crear archivos y cambiar el nombre, eliminar cualquier archivo en Documentos, independientemente de los permisos del archivo. Su capacidad para acceder a un archivo depende del permiso del mismo.

    dr-x------ 6 archie archie  4096 Jul  5 17:37 Documentos

Archie tiene acceso completo, excepto que no puede crear, cambiar el nombre ni eliminar ningún archivo. Puede listar los archivos y (si el permiso del archivo lo autoriza) puede acceder a un archivo existente en Documentos.

    d-wx------ 6 archie archie  4096 Jul  5 17:37 Documentos

Archie no puede hacer `ls` en el directorio `Documentos`, pero si conoce el nombre de un archivo existente, entonces puede listarlo, renombrarlo, eliminarlo o (si el permiso del archivo lo permite) acceder a él. Además, puede crear nuevos archivos.

    d--x------ 6 archie archie  4096 Jul  5 17:37 Documentos

Archie solo es capaz de (si el permiso del archivo lo permite) acceder a esos archivos en el directorio `Documentos` que conoce. No puede listar archivos ya existentes o crear, renombrar o eliminar ninguno de ellos.

Debe tener en cuenta que detallamos los permisos de directorio y no tiene nada que ver con los permisos de archivos individuales. Cuando crea un nuevo archivo, es el directorio el que cambia. Es por eso que necesita permiso de escritura en el directorio.

Veamos otro ejemplo, esta vez de un archivo, no de un directorio:

    -rw-r--r-- 1 archie archie  5120 Jun 27 08:28 foobar

Aquí podemos ver que la primera letra no es `d` sino `-`. Entonces sabemos que es un archivo, no un directorio. A continuación, los permisos del propietario son `rw-` por lo que el propietario tiene la capacidad de leer y escribir, pero no ejecutar. Puede parecer extraño que el propietario no tenga los tres permisos, pero el permiso `x` no es necesario ya que es un archivo de texto/datos, para ser leído por un editor de texto como Gedit, EMACS o software como R, y no un ejecutable por derecho propio (si contuviera algo como código de programación de Python, entonces muy bien podría serlo). Los permisos del grupo están configurados en `r--`, por lo que el grupo tiene la capacidad de leer el archivo pero no escribirlo/editarlo de ninguna manera; es esencialmente como configurar algo como de solo lectura. Podemos ver que los mismos permisos se aplican también a todos los demás.

## Cambiar los permisos

chmod es una orden en Linux y otros sistemas operativos similares a Unix que permite cambiar los permisos (o acceder al modo) de un archivo o directorio.

### Método de texto

Para cambiar los permisos (o el "modo de acceso") de un archivo, utilice la orden chmod en una terminal. A continuación se muestra la estructura general de la orden:

    chmod quién=permisos archivo

Donde `quién` es cualquier variedad de letras, cada una de las cuales significa a quién se le está dando el permiso. Son los siguientes:

- `u`: el usuario que es dueño del archivo.
- `g`: el grupo al que pertenece el archivo.
- `o`: los otros usuarios, es decir, todos los demás.
- `a`: (all), todo lo anterior; utilice esto en lugar de escribir `ugo`.

Los permisos son los mismos que se discutieron en #Ver los permisos (`r`, `w` y `x`).

Ahora eche un vistazo a algunos ejemplos utilizando esta orden. Supongamos que se vuelve muy protector con el directorio de Documentos y quiere negarle a todos menos a usted mismo, los permisos para leer, escribir y ejecutar (o en este caso buscar/mirar) en él:

Antes: `drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documentos`

    $ chmod g= Documentos
    $ chmod o= Documentos

Después: `drwx------ 6 archie web 4096 Jul 6 17:32 Documentos`

Aquí, debido a que desea denegar permisos, no coloca ninguna letra después de `=` donde se introduciría los permisos. Ahora puede ver que solo los permisos del propietario son `rwx` y todos los demás permisos son `-`.

Esto se puede revertir con:

Antes: `drwx------ 6 archie web 4096 Jul 6 17:32 Documentos`

    $ chmod g=rx Documentos
    $ chmod o=rx Documentos

Después: `drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documentos`

En el siguiente ejemplo, desea otorgar permisos de lectura y ejecución al grupo y a otros usuarios, por lo que coloca las letras de los permisos (`r` y `x`) después de `=`, sin espacios.

Puede simplificar esto para poner más de una letra `who` en la misma orden, por ejemplo:

    $ chmod go=rx Documentos

Nota: No importa en qué orden coloques las letras `who` o las letras de permiso en una orden `chmod`: podría tener `chmod go=rx archivo` o `chmod og=xr archivo`. Es todo lo mismo.

Ahora consideremos un segundo ejemplo, supongamos que desea cambiar un archivo `foobar` para que tenga permisos de lectura y escritura, y otros usuarios en el grupo `web` que pueden ser colegas que trabajan en `foobar`, también puede leerlo y escribirlo, pero otros usuarios solo pueden leerlo:

Antes: `-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar`

    $ chmod g=rw foobar

Después: `-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar`

Esto es exactamente como el primer ejemplo pero con un archivo, no un directorio, y otorga permiso de escritura (solo para dar un ejemplo de otorgamiento de todos los permisos).

#### Atajos de método de texto

La orden chmod permite añadir y quitar permisos de un conjunto existente utilizando `+` o `-` en lugar de `=`. Esto es diferente de las órdenes anteriores, que esencialmente reescriben los permisos (por ejemplo, para cambiar un permiso de `r--` a `rw-`, aún necesita incluir `r` así como `w` después de `=` en la orden chmod. Si olvidó `r`, le quitaría el permiso `r` ya que se están reescribiendo con `=`. Utilizar `+` y `-` evita esto añadiendo o quitando fuera del conjunto de permisos actual).

Probemos este método `+` y `-` con el ejemplo anterior de añadir permisos de escritura al grupo:

Antes: `-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar`

    $ chmod g+w foobar

Después: `-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar`

Otro ejemplo, quitar permisos de escritura a todos (a):

Antes: `-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar`

    $ chmod a-w foobar

Después: `-r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar`

Un atajo diferente es el modo especial `X`: este no es un modo de archivo actual, pero a menudo se utiliza junto con la opción `-R` para configurar el bit ejecutable solo para directorios, y déjelo sin cambios para archivos regulares, por ejemplo:

    $ chmod -R a+rX ./data/

#### Copiar permisos

Es posible decirle a chmod que copie los permisos de una clase, digamos el propietario, y otorgue esos mismos permisos al grupo o incluso a todos. Para hacer esto, en lugar de poner `r`, `w` o `x` después de `=`, ponga otra letra who. Por ejemplo:

Antes: `-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar`

    $ chmod g=u foobar

Después: `-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar`

Esta orden se traduce esencialmente en "cambiar los permisos del grupo (`g=`), para que sean los mismos que los del usuario propietario (`=u`). Tenga en cuenta que no puede copiar un conjunto de permisos, así como otorgar otros nuevos, por ejemplo:

    $ chmod g=wu foobar

En ese caso chmod lanza un error.

### Método numérico

chmod también puede establecer permisos utilizando números.

El uso de números es otro método que le permite editar los permisos para propietarios, grupos y otros al mismo tiempo, así como los bits setuid, setgid y sticky. La estructura básica del código es esta:

    $ chmod xxx archivo

`'xxx` es un número de 3 dígitos donde cada dígito puede ser cualquier valor del 0 al 7. El primer dígito se aplica a los permisos para el propietario, el segundo dígito se aplica a los permisos para el grupo y el tercer dígito se aplica a los permisos para todos los demás.

En esta notación numérica, los valores `r`, `w` y `x` tienen su propio valor numérico:

    r=4
    w=2
    x=1

Para obtener un número de 3 dígitos, debe considerar qué permisos desea que tengan el propietario, el grupo y todos los demás, y luego totalizar sus valores. Por ejemplo, si desea otorgar al propietario de un directorio permisos de lectura, escritura y ejecución, y desea que el grupo y todos los demás solo tengan permisos de lectura y ejecución, obtendría los valores numéricos de la siguiente manera:

- Propietario: `rwx`=4+2+1=7
- Grupo: `r-x`=4+0+1=5
- Otros: `r-x`=4+0+1=5

    $ chmod 755 archivo

Esto es equivalente a utilizar lo siguiente:

    $ chmod u=rwx archivo
    $ chmod go=rx archivo

Para ver los permisos existentes de un archivo o directorio en formato numérico, utilice la orden stat(1):

    $ stat -c %a archivo

Donde la opción %a especifica la salida en formato numérico.

La mayoría de los directorios están configurados en `755` para permitir la lectura, escritura y ejecución al propietario, pero niegan la escritura a todos los demás, y los archivos son normalmente `644` para permitir la lectura y escritura para el propietario pero solo lectura para todos los demás; véase la última nota sobre la falta de permisos `x` con archivos no ejecutables: es lo mismo aquí.

Para ver esto en acción con ejemplos, considere el ejemplo anterior que se ha utilizado pero con este método numérico aplicado en su lugar:

Antes: `-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar`

    $ chmod 664 foobar

Después: `-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar`

Si se tratara de un ejecutable, el número sería `774` si desea otorgar permiso de ejecución al propietario y al grupo. Alternativamente, si quisiera que todos tuvieran solo permiso de lectura, el número sería `444`. Tratar `r` como 4, `w` como 2 y `x` como 1 es probablemente la forma más fácil de calcular los valores numéricos para utilizar `chmod xxx archivo`, pero también hay un método binario, en el que cada permiso tiene un número binario, que a su vez se convierte en un número. Es un poco más complicado, pero aquí se incluye para completar.

Considere este conjunto de permisos:

    -rwxr-xr--

Si coloca un 1 debajo de cada permiso otorgado y un 0 para cada permiso no otorgado, el resultado sería algo como esto:

    -rwxrwxr-x
     111111101

A continuación, puede convertir estos números binarios:

    000=0	    100=4
    001=1	    101=5
    010=2	    110=6
    011=3	    111=7

El valor de lo anterior sería por tanto 775.

Considere que queríamos eliminar el permiso de escritura del grupo:

    -rwxr-xr-x
     111101101

Por lo tanto, el valor sería 755 y utilizaría `chmod 755 archivo` para eliminar el permiso de escritura. Notará que obtiene el mismo número de tres dígitos sin importar el método que use. El uso de texto o números dependerá de las preferencias personales y la velocidad de escritura. Cuando desee restaurar un directorio o archivo a los permisos predeterminados, por ejemplo permiso de lectura y escritura (y ejecución) para el propietario, pero quitar el permiso de escritura a todos los demás, puede ser más rápido utilizar `chmod 755/644 archivo`. Sin embargo, si está cambiando los permisos a algo fuera de lo normal, puede ser más simple y rápido utilizar el método de texto en lugar de tratar de convertirlo en números, lo que podría generar un error. Se podría argumentar que no hay una diferencia significativa real en la velocidad de cualquiera de los métodos para un usuario que solo necesita utilizar chmod en ocasiones.

También puede utilizar el método numérico para configurar los bits `setuid`, `setgid` y `sticky` mediante cuatro dígitos.

    setuid=4
    setgid=2
    sticky=1

Por ejemplo, `chmod 2777 archivo` establecerá bits de lectura/escritura/ejecutables para todos y también activará el bit `setgid`.

### Bulk chmod

Generalmente, los directorios y los archivos no deben tener los mismos permisos. Si es necesario modificar de forma masiva un árbol de directorios, utilice find para modificar selectivamente uno u otro.

Para hacer un chmod a 755 solo a directorios:

    $ find directorio -type d -exec chmod 755 {} +

Para hacer un chmod a 644 solo a archivos:

    $ find directorio -type f -exec chmod 644 {} +

## Cambiar el propietario

chown cambia el propietario de un archivo o directorio, que es más rápido y más fácil que alterar los permisos en algunos casos.

Considere el siguiente ejemplo, creando una nueva partición con GParted para los datos de copia de seguridad. Gparted hace todo esto como superusuario, por lo que todo pertenece al superusuario por defecto. Todo esto está muy bien, pero cuando se trata de escribir datos en la partición montada, se niega el permiso a los usuarios normales.

    brw-rw---- 1 root disk 8,    9 Jul  6 16:02 sda9
    drwxr-xr-x 5 root root    4096 Jul  6 16:01 Backup

Como puede ver, el dispositivo en `/dev` es propiedad del superusuario (root), al igual que la ubicación de montaje (`/media/Backup`). Para cambiar el propietario de la ubicación de montaje, se puede hacer lo siguiente:

Antes: `drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup`

    # chown archie /media/Backup

Después: `drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup`

Ahora el nuevo propietario, archie, puede escribir datos en la partición sin alterar los permisos (ya que la tríada del propietario tenía permisos `rwx`).

Nota:

- `chown` siempre borra los bits setuid y setgid.
- Los usuarios que no son superusuario no pueden usar `chown` para "donar" archivos que poseen a otro usuario.

## Listas de control de acceso

Las Listas de control de acceso proporcionan un mecanismo de permisos adicional y más flexible para los sistemas de archivos al permitir establecer permisos para cualquier usuario o grupo en cualquier archivo.

## Umask

La utilidad umask se utiliza para controlar la máscara del modo de creación de archivos, que determina el valor inicial de los bits de permiso para los archivos recién creados.

## Atributos de archivo

Aparte de los bits de modo de archivo que controlan los permisos de lectura, escritura y ejecución de usuario y grupo, varios sistemas de archivos soportan atributos de archivos que permiten una mayor personalización de las operaciones de archivos permitidas.

Advertencia: De forma predeterminada, cp, rsync y otros programas similares no conservan los atributos de los archivos.

El paquete e2fsprogs contiene los programas lsattr(1) y chattr(1) que listan y cambian los atributos de un archivo, respectivamente.

Estos son algunos atributos útiles. No todos los sistemas de archivos admiten todos los atributos.

- `a` - añadir solo: el archivo solo se puede abrir para añadir.
- `c` - comprimido: activa la compresión a nivel de sistema de archivos para el archivo.
- `i` - inmutable: no se puede modificar, eliminar, renombrar ni vincular. Solo puede ser establecido por el superusuario.
- `j` - diario de datos: utiliza journal para escribir datos de archivos y metadatos.
- `m` - sin compresión: desactiva la compresión a nivel de sistema de archivos para el archivo.
- `A` - sin actualización atime: No se modificará el atime del archivo.
- `C` - sin copia en escritura (CoW): desactiva la copia en escritura, para los sistemas de archivos que lo admitan.

Véase chattr(1) para obtener una lista completa de atributos y más información sobre lo que hace cada atributo.

Por ejemplo, si desea establecer el bit inmutable en algún archivo, utilice la siguiente orden:

    # chattr +i /ruta/al/archivo

Para eliminar un atributo en un archivo, simplemente cambie `+` a `-`.

## Atributos extendidos

De xattr(7): "Los atributos extendidos son pares nombre:valor asociados permanentemente con archivos y directorios". Hay cuatro clases de atributos extendidos: security (seguridad), system (sistema), trusted (confianza) y user (usuario).

Advertencia: De forma predeterminada, cp, rsync y otros programas similares no conservan los atributos extendidos; véase #Preservar atributos extendidos.

Los atributos extendidos también se utilizan para establecer Capacidades.

### Atributos extendidos de usuario

Los atributos extendidos del usuario se pueden utilizar para almacenar información arbitraria sobre un archivo. Para crear uno:

    $ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.txt

Utilice getfattr para mostrar atributos extendidos:

    $ getfattr -d foo.txt

    # file: foo.txt
    user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"

Finalmente, para eliminar un atributo extendido:

$ setfattr -x user.checksum foo.txt

### Preservar atributos extendidos

Orden | Opción requerida
--- | ---
`cp` | `--preserve=mode,ownership,timestamps,xattr`
`mv` | preserva por defecto1
`tar` | `--xattrs` para creación y `--xattrs-include='*'` para extracción
`bsdtar` | `-p` para extracción
rsync | `--xattrs`

1. mv descarta silenciosamente los atributos extendidos cuando el sistema de archivos de destino no los soporta.

Para preservar los atributos extendidos con editores de texto, debe configurarlos para truncar los archivos al guardarlos en lugar de utilizar rename(2).[1]

## Consejos y trucos

### Preservar root

Utilice la opción `--preserve-root` para evitar que `chmod` actúe de forma recursiva en `/`. Esto puede, por ejemplo, evitar que elimine el bit ejecutable en todo el sistema y, por lo tanto, lo rompa. Para utilizar esta opción cada vez, configúrela dentro de un alias. Véase también [2].

## Véase también

- wikipedia:Chattr
- Confusión de permisos de archivos de Linux
- Confusión de permisos de archivos de Linux, parte 2
- wikipedia:Extended file attributes#Linux
- Atributos extendidos: lo bueno, lo no tan bueno, lo malo.
- Copia de seguridad y restauración de permisos de archivos en Linux
- ¿Por qué "chmod -R 777 /" es destructivo?
- El cómo y por qué de los grupos privados de usuarios en Unix

Categories:

- File systems (Español)
- Command-line (Español)