Guía

Permisos de archivos en Linux: chmod, chown y sudo con ejemplos

Actualizado: · Skillaria.Top

Los permisos de archivos en Linux son tres conjuntos rwx — para el propietario, el grupo y el resto; se cambian con chmod en forma simbólica (chmod u+x) o numérica (chmod 755, donde r=4, w=2, x=1). El propietario se cambia con chown, y las acciones de administrador se ejecutan con sudo; el error Permission denied casi siempre significa que su usuario no tiene el permiso necesario sobre el archivo o sobre uno de los directorios de la ruta.

Los permisos de archivos en Linux responden a la pregunta «quién puede hacer qué con un archivo». Cada archivo tiene un propietario, un grupo y tres conjuntos de permisos: para el propietario, para el grupo y para los demás. Se modifican con chmod, el propietario se cambia con chown, y las acciones como administrador se ejecutan con sudo. Veamos cómo leer los permisos, cómo cambiarlos y cómo solucionar el error Permission denied.

Cómo ver los permisos de un archivo

Los permisos aparecen en la salida de ls -l:

$ ls -l
-rw-r--r-- 1 alice developers  1204 Oct 10 14:02 notas.txt
-rwxr-xr-x 1 alice developers   356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers  4096 Oct 10 13:50 secretos

Los primeros diez caracteres se interpretan así:

  • El primer carácter es el tipo: - un archivo normal, d un directorio, l un enlace simbólico.
  • Los caracteres 2 a 4 son los permisos del propietario (user).
  • Los caracteres 5 a 7 son los permisos del grupo (group).
  • Los caracteres 8 a 10 son los permisos de los demás (others).

Después vienen el número de enlaces duros, el propietario (alice), el grupo (developers), el tamaño, la fecha y el nombre. Para un solo archivo resulta cómodo el comando stat:

$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh

Qué significan r, w y x

El significado de los permisos es distinto para archivos y para directorios, y esta es la principal fuente de confusión.

PermisoEn un archivoEn un directorio
r (read)leer el contenidover la lista de archivos (ls)
w (write)modificar el contenidocrear, borrar y renombrar archivos dentro
x (execute)ejecutarlo como programaentrar en el directorio (cd) y acceder a archivos por su ruta

Tenga en cuenta que puede borrar un archivo si tiene w y x sobre el directorio, aunque no tenga permiso para escribir en el propio archivo. Y sin x en un directorio no puede abrir un archivo que contiene, aunque los permisos del archivo permitan la lectura.

El sistema comprueba los permisos en orden: si usted es el propietario, se aplican los permisos del propietario; si no, y pertenece al grupo del archivo, los del grupo; si no, los de los demás. El usuario root omite las comprobaciones de lectura y escritura.

Forma numérica: 755, 644, 600

Cada permiso tiene un peso: r = 4, w = 2, x = 1. La suma de los pesos da una cifra de 0 a 7 para cada uno de los tres conjuntos.

CifraPermisosCálculo
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

Combinaciones típicas que conviene memorizar:

ModoFormaDónde se usa
644rw-r--r--archivos normales, configuraciones, HTML
755rwxr-xr-xdirectorios, scripts y programas
600rw-------claves SSH privadas, archivos con contraseñas
700rwx------el directorio ~/.ssh, directorios personales
640rw-r-----configuraciones que debe leer el grupo del servicio
777rwxrwxrwxtodo para todos — casi nunca es necesario

El comando chmod: cambiar los permisos

Modo numérico

La forma numérica fija los permisos por completo:

chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

Modo simbólico

La forma simbólica modifica permisos de forma puntual, sin tocar los demás. A quién: u propietario, g grupo, o otros, a todos. Acción: + añadir, - quitar, = establecer exactamente.

chmod +x deploy.sh        # permitir ejecutarlo
chmod u+x,g-w archivo     # el propietario puede ejecutarlo, quitar escritura al grupo
chmod o-rwx secretos/     # nada para los demás
chmod g=rx app/           # el grupo solo puede leer y entrar

Recursivamente: archivos y directorios por separado

La opción -R aplica los permisos a todo el árbol. Pero chmod -R 755 hace ejecutables todos los archivos, lo que normalmente no se desea. Es mejor separar archivos y directorios con find:

find /srv/sitio -type d -exec chmod 755 {} +
find /srv/sitio -type f -exec chmod 644 {} +

Existe también una variante corta: la X en mayúscula añade el permiso de ejecución solo a los directorios y a los archivos que ya lo tienen.

chmod -R u=rwX,go=rX /srv/sitio

El comando chown: cambiar propietario y grupo

Solo root puede cambiar el propietario de un archivo, por eso chown casi siempre se ejecuta con sudo.

sudo chown alice informe.txt               # propietario
sudo chown alice:developers informe.txt    # propietario y grupo
sudo chown :www-data index.html            # solo el grupo
sudo chown -R www-data:www-data /var/www/sitio

Para cambiar solo el grupo existe el comando chgrp: sudo chgrp developers informe.txt. Sus grupos se muestran con id o groups.

$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)

Para añadir un usuario a un grupo use sudo usermod -aG developers bob. La opción -a es imprescindible: sin ella, el usuario se elimina de todos los demás grupos secundarios. Un grupo nuevo se aplica tras volver a iniciar sesión.

sudo: acciones como administrador

sudo ejecuta un comando con privilegios de root (o de otro usuario) y pide su contraseña, no la de root. Cada llamada queda registrada, así que se sabe quién hizo qué.

sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql       # como el usuario postgres
sudo -i                     # shell interactiva de root
sudo -l                     # qué me está permitido

Quién puede hacer qué se describe en /etc/sudoers y en los archivos del directorio /etc/sudoers.d/. Edítelos solo con sudo visudo: comprueba la sintaxis, y un error en el archivo no le quitará el acceso a sudo. En Ubuntu, el derecho a usar sudo se concede por pertenecer al grupo sudo; en sistemas tipo RHEL, al grupo wheel.

# /etc/sudoers.d/deploy — el usuario deploy solo puede reiniciar nginx
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

Por qué sudo echo > archivo no funciona

Una trampa frecuente:

$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied

La redirección >> la realiza su shell, no sudo, así que el archivo se abre sin privilegios de root. La forma correcta es con tee:

echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts

Permission denied: causas y soluciones

El error Permission denied significa que el núcleo ha denegado la operación a su proceso. El procedimiento de diagnóstico es siempre el mismo: quién soy (id), quién es el propietario y qué permisos tiene (ls -l), qué permisos tiene cada directorio de la ruta (namei -l).

$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root  root  /
drwxr-xr-x root  root  srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env

Aquí se ve que el directorio app está cerrado a los demás: un usuario que no pertenece al grupo deploy no puede avanzar, sean cuales sean los permisos del propio archivo.

El script no se ejecuta

$ ./deploy.sh
bash: ./deploy.sh: Permission denied

El archivo no tiene permiso de ejecución. La solución es chmod +x deploy.sh, o lanzarlo a través del intérprete: bash deploy.sh. Si la partición se monta con la opción noexec (ocurre con /tmp), no se puede ejecutar el archivo directamente, y solo sirve la segunda opción.

No se puede escribir en un directorio del sistema

Los archivos de /etc, /usr y /var/www pertenecen a root o a usuarios de servicio. Use sudo para cambios puntuales; para el trabajo habitual, dé permisos a un grupo, no a todos.

El servidor web responde 403

Nginx o Apache se ejecutan como el usuario www-data (en Debian y Ubuntu). Necesita lectura de los archivos y x en todos los directorios de la ruta. Solución: sudo chown -R www-data:www-data /var/www/sitio, o permisos 755 en los directorios y 644 en los archivos.

SSH no acepta la clave

SSH rechaza las claves cuyos permisos son demasiado abiertos. La clave privada debe tener permisos 600, el directorio ~/.ssh — 700, y el archivo authorized_keys del servidor — 600.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

Sin acceso a Docker

El mensaje permission denied while trying to connect to the Docker daemon socket indica que no pertenece al grupo docker. Ejecute sudo usermod -aG docker $USER y vuelva a iniciar sesión. Tenga en cuenta que pertenecer a este grupo equivale en la práctica a tener privilegios de root.

Por qué chmod 777 es mala idea

El consejo «ejecuta simplemente chmod 777» elimina el error, pero deja el archivo modificable por todos los usuarios y todos los procesos del sistema. Si una aplicación web es comprometida, un atacante puede sustituir esos archivos. El camino correcto es averiguar qué usuario necesita acceso y dar el permiso precisamente a él, mediante el propietario o el grupo.

umask: permisos por defecto

Los archivos nuevos reciben permisos calculados según la máscara umask. Con el valor habitual 022, los archivos se crean con 644 y los directorios con 755.

$ umask
0022

Resumen

Los permisos de Linux son tres conjuntos rwx para el propietario, el grupo y los demás. chmod cambia los permisos en forma numérica (755, 644, 600) o simbólica, chown cambia el propietario, y sudo permite ejecutar un solo comando como root. Ante Permission denied, compruebe el usuario, los permisos del archivo y de cada directorio de la ruta, y no solucione el problema con 777. Usuarios, grupos, permisos y sudo se explican paso a paso y con práctica en nuestro curso de Linux.

Preguntas frecuentes

¿Qué significa chmod 755?

El propietario puede leer, escribir y ejecutar (7); el grupo y los demás pueden leer y ejecutar (5). Es el conjunto estándar para directorios y scripts.

¿En qué se diferencia chmod de chown?

chmod cambia los permisos (qué se puede hacer con el archivo), mientras que chown cambia el propietario y el grupo (a quién pertenecen esos permisos).

¿Cómo doy a un usuario permisos de sudo?

En Ubuntu y Debian, añádalo al grupo sudo con sudo usermod -aG sudo nombre; en sistemas tipo RHEL, al grupo wheel. Los cambios se aplican tras volver a iniciar sesión.

¿Qué son los permisos 4755 y el bit SUID?

La cifra inicial 4 activa SUID: el programa se ejecuta con los derechos del propietario del archivo, y no con los de quien lo lanza. Así funciona, por ejemplo, passwd; en la salida de ls, la x del propietario aparece como s.

¿Por qué root puede leer un archivo con permisos 000?

El núcleo no aplica a root las comprobaciones habituales de lectura y escritura. Solo se le puede restringir con otros mecanismos, como SELinux, AppArmor o el atributo de inmutabilidad chattr +i.

Aprende este tema en vídeo

Este tema se explica a fondo y con práctica en el curso «Linux: с нуля до уверенного администрирования».

Ir al curso