Permisos de archivos en Linux: chmod, chown y sudo con ejemplos
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,dun directorio,lun 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.
| Permiso | En un archivo | En un directorio |
|---|---|---|
r (read) | leer el contenido | ver la lista de archivos (ls) |
w (write) | modificar el contenido | crear, borrar y renombrar archivos dentro |
x (execute) | ejecutarlo como programa | entrar 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.
| Cifra | Permisos | Cálculo |
|---|---|---|
| 7 | rwx | 4+2+1 |
| 6 | rw- | 4+2 |
| 5 | r-x | 4+1 |
| 4 | r-- | 4 |
| 0 | --- | 0 |
Combinaciones típicas que conviene memorizar:
| Modo | Forma | Dónde se usa |
|---|---|---|
644 | rw-r--r-- | archivos normales, configuraciones, HTML |
755 | rwxr-xr-x | directorios, scripts y programas |
600 | rw------- | claves SSH privadas, archivos con contraseñas |
700 | rwx------ | el directorio ~/.ssh, directorios personales |
640 | rw-r----- | configuraciones que debe leer el grupo del servicio |
777 | rwxrwxrwx | todo 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.
Este tema se explica a fondo y con práctica en el curso «Linux: с нуля до уверенного администрирования».
Ir al curso