Permisos de Archivos en Linux: Una Guía Completa
Los permisos de archivos son una de las características de seguridad fundamentales en Linux y sistemas operativos tipo Unix. Controlan quién puede leer, escribir o ejecutar archivos y directorios, sentando la base del modelo de seguridad multiusuario que hace que los sistemas Linux sean seguros y fiables.
En este artículo, te mostraré cómo ver, entender y modificar los permisos de archivos, trabajar con notación octal, manejar permisos especiales y solucionar problemas comunes relacionados con permisos.
Cómo ver los permisos de archivos en Linux
La forma más común de ver los permisos de ficheros es usando el comando ls -l
:
ls -l blog.marcnuri.com.txt
Esto produce la siguiente salida:
-rw-r--r-- 1 marc users 1024 Oct 17 10:00 blog.marcnuri.com.txt
Vamos a desglosar lo que significa cada parte:
-rw-r--r--
- La cadena de permisos (lo analizaremos en profundidad a continuación)1
- Número de enlaces duros (hard links)marc
- Propietario del archivousers
- Grupo que posee el archivo1024
- Tamaño del archivo en bytesOct 17 10:00
- Fecha y hora de última modificaciónblog.marcnuri.com.txt
- Nombre del archivo
Para obtener información más detallada, puedes usar el comando stat
:
stat blog.marcnuri.com.txt
Esto muestra metadatos adicionales incluyendo tiempos de acceso y modificación, número de inode y representaciones de permisos tanto simbólicas como octales.
Entendiendo la cadena de permisos
La cadena de permisos -rw-r--r--
contiene 10 caracteres. Vamos a decodificarlos posición por posición:
Posición 1 - Tipo de archivo:
-
Archivo estándard
Directoriol
Enlace simbólicoc
Dispositivo de caracteresb
Dispositivo de bloques
Posiciones 2-4 - Permisos del propietario/usuario:
r
Permiso de lecturaw
Permiso de escriturax
Permiso de ejecución-
Permiso no concedido
Posiciones 5-7 - Permisos del grupo (mismo formato que el propietario)
Posiciones 8-10 - Permisos de otros/todos (mismo formato que el propietario)
Así que -rw-r--r--
significa:
- Es un archivo regular (
-
) - El propietario puede leer y escribir (
rw-
) - El grupo solo puede leer (
r--
) - Otros solo pueden leer (
r--
)
Tipos de permisos explicados
Los tres tipos básicos de permisos se comportan de manera diferente para archivos y directorios:
Permiso de lectura (r)
Para archivos: Permite ver el contenido del archivo.
cat blog.marcnuri.com.txt
Para directorios: Permite listar el contenido del directorio.
ls /algun/directorio
Sin permiso de lectura en un directorio, no puedes ver qué archivos contiene, incluso si conoces sus nombres.
Permiso de escritura (w)
Para archivos: Permite modificar el contenido del archivo.
echo "nuevo contenido" > blog.marcnuri.com.txt
Para directorios: Permite crear, eliminar o renombrar archivos dentro del directorio.
Ten en cuenta que para eliminar un archivo, necesitas permiso de escritura en el directorio, no en el archivo en sí.
Permiso de ejecución (x)
Para archivos: Permite ejecutar el archivo como un programa o script.
./script.sh
Para directorios: Permite acceder al directorio (entrar en él con cd
) y acceder a archivos dentro de él.
Esto es crucial: incluso si un directorio tiene permiso de lectura, necesitas permiso de ejecución para hacer cd
en él o acceder a archivos dentro.
Grupos de permisos
Linux divide los permisos en tres grupos:
Propietario (Usuario): El usuario que posee el archivo. Normalmente, la persona que lo creó, aunque la propiedad se puede cambiar.
Grupo: Un conjunto de usuarios que comparten acceso. Útil para la colaboración en equipo donde múltiples usuarios necesitan el mismo nivel de acceso.
Otros (Todos): Todos los demás en el sistema que no son el propietario ni están en el grupo.
Este sistema de tres niveles proporciona un control flexible sobre quién puede acceder a tus archivos mientras mantiene la simplicidad.
Notación octal (permisos numéricos)
Los permisos se pueden representar como números octales de tres dígitos, donde cada dígito representa un grupo de permisos (propietario, grupo, otros).
Cada tipo de permiso tiene un valor numérico:
- Lectura (r) = 4
- Escritura (w) = 2
- Ejecución (x) = 1
- Sin permiso = 0
Sumas estos valores para cada grupo:
Simbólico | Binario | Octal | Significado |
---|---|---|---|
--- | 000 | 0 | Sin permisos |
--x | 001 | 1 | Solo ejecución |
-w- | 010 | 2 | Solo escritura |
-wx | 011 | 3 | Escritura y ejecución |
r-- | 100 | 4 | Solo lectura |
r-x | 101 | 5 | Lectura y ejecución |
rw- | 110 | 6 | Lectura y escritura |
rwx | 111 | 7 | Lectura, escritura y ejecución |
Combinaciones de permisos comunes
755 (rwxr-xr-x
) - Archivos ejecutables y directorios
- El propietario puede hacer cualquier cosa
- Grupo y otros pueden leer y ejecutar
- Común para scripts y programas
644 (rw-r--r--
) - Archivos regulares
- El propietario puede leer y escribir
- Grupo y otros solo pueden leer
- Común para documentos y archivos de configuración
600 (rw-------
) - Archivos privados
- Solo el propietario puede leer y escribir
- Nadie más tiene acceso
- Común para claves SSH y datos sensibles
777 (rwxrwxrwx
) - Acceso completo para todos
- Todos pueden hacer cualquier cosa
- Generalmente considerado inseguro
- Evitar a menos que sea absolutamente necesario
Cómo cambiar permisos de archivos (chmod)
El comando chmod
cambia los permisos de archivos. Soporta dos modos: simbólico y numérico.
Modo simbólico
El modo simbólico usa letras y operadores para modificar permisos:
# Añadir permiso de ejecución para el propietario
chmod u+x script.sh
# Quitar permiso de escritura para el grupo
chmod g-w documento.txt
# Establecer permisos exactos para otros (solo lectura)
chmod o=r archivo.txt
# Añadir lectura y escritura para el propietario, quitar ejecución para otros
chmod u+rw,o-x archivo.txt
El formato es: [quién][operador][permisos]
Quién:
u
- Usuario/propietariog
- Grupoo
- Otrosa
- Todos (usuario, grupo y otros)
Operadores:
+
- Añadir permiso-
- Quitar permiso=
- Establecer permiso exacto
Modo numérico
El modo numérico usa valores octales para establecer permisos:
# Establecer permisos a rwxr-xr-x
chmod 755 script.sh
# Establecer permisos a rw-r--r--
chmod 644 documento.txt
# Establecer permisos a rw-------
chmod 600 clave-privada.pem
Permisos recursivos
Para cambiar permisos de un directorio y todo su contenido, usa la opción -R
:
chmod -R 755 /ruta/al/directorio
Ten cuidado con las operaciones recursivas, ya que afectan a todos los archivos y subdirectorios.
Permisos de directorios vs. archivos
Los directorios necesitan combinaciones de permisos diferentes a los archivos para funcionar correctamente.
Para que un directorio sea utilizable, típicamente necesita permiso de ejecución. Sin él, no puedes hacer cd
al directorio o acceder a archivos dentro de él, incluso si tienes permiso de lectura.
Escenarios comunes:
# Directorio con r-- (legible pero no accesible)
ls /algun/dir # Funciona - muestra nombres de archivos
cd /algun/dir # Falla - no se puede entrar
cat /algun/dir/archivo # Falla - no se puede acceder a archivos
# Directorio con --x (accesible pero no legible)
ls /algun/dir # Falla - no se puede listar contenido
cd /algun/dir # Funciona - se puede entrar
cat /algun/dir/archivo # Funciona si conoces el nombre del archivo
Para operación normal de directorios, típicamente quieres tanto permisos de lectura como de ejecución (por ejemplo, 755
o 750
).
Permisos especiales
Más allá de los permisos básicos, Linux soporta tres tipos de permisos especiales:
SetUID (SUID)
Cuando se establece en un archivo ejecutable, el programa se ejecuta con los permisos del propietario del archivo, no del usuario que lo ejecutó.
# Establecer SUID
chmod u+s /usr/bin/passwd
# O usando octal
chmod 4755 /usr/bin/passwd
El comando passwd
usa SUID porque necesita modificar /etc/shadow
(un archivo propiedad de root) incluso cuando lo ejecutan usuarios regulares.
SUID aparece como s
en la posición de ejecución del propietario:
-rwsr-xr-x 1 root root 68208 Oct 17 10:00 /usr/bin/passwd
SetGID (SGID)
Para archivos: El archivo se ejecuta con los permisos del grupo del archivo.
Para directorios: Los archivos creados dentro del directorio heredan el grupo del directorio, no el grupo primario del creador.
# Establecer SGID
chmod g+s /compartido/proyecto
# O usando octal
chmod 2775 /compartido/proyecto
SGID aparece como s
en la posición de ejecución del grupo:
drwxrwsr-x 2 marc desarrolladores 4096 Oct 17 10:00 /compartido/proyecto
Sticky Bit
Cuando se establece en un directorio, solo el propietario del archivo, el propietario del directorio o root pueden eliminar o renombrar archivos dentro de ese directorio.
# Establecer sticky bit
chmod +t /tmp
# O usando octal
chmod 1777 /tmp
El sticky bit aparece como t
en la posición de ejecución de otros:
drwxrwxrwt 2 root root 4096 Oct 17 10:00 /tmp
Esto se usa comúnmente en /tmp
para prevenir que los usuarios eliminen los archivos temporales de otros.
Combinando permisos especiales
Los permisos especiales añaden un cuarto dígito a la notación octal:
chmod 4755 archivo # SUID + 755
chmod 2755 dir # SGID + 755
chmod 1777 dir # Sticky bit + 777
chmod 6755 archivo # SUID + SGID + 755
Los valores del dígito de permisos especiales:
- 4 = SUID
- 2 = SGID
- 1 = Sticky bit
Cambiar la propiedad (chown y chgrp)
Para cambiar quién posee un archivo, usa el comando chown
:
# Cambiar solo el propietario
sudo chown marc archivo.txt
# Cambiar propietario y grupo
sudo chown marc:desarrolladores archivo.txt
# Cambiar solo el grupo
sudo chown :desarrolladores archivo.txt
# O usar chgrp
sudo chgrp desarrolladores archivo.txt
# Cambio de propiedad recursivo
sudo chown -R marc:desarrolladores /ruta/al/directorio
Cambiar la propiedad típicamente requiere privilegios de root (vía sudo
) a menos que poseas el archivo y lo estés cambiando a un grupo al que perteneces.
Permisos predeterminados y umask
Cuando creas un nuevo archivo o directorio, Linux aplica permisos predeterminados basados en el valor umask
.
La umask es una máscara que resta permisos de los valores predeterminados base:
- Predeterminado base para archivos:
666
(rw-rw-rw-) - Predeterminado base para directorios:
777
(rwxrwxrwx)
El valor de umask se resta de estos permisos base.
# Ver umask actual
umask
# Ver en notación simbólica
umask -S
# Establecer umask
umask 0022
Valores de umask comunes:
0022 - Predeterminado en muchos sistemas
- Archivos creados con
644
(rw-r--r--): 666 - 022 = 644 - Directorios creados con
755
(rwxr-xr-x): 777 - 022 = 755
0002 - Común para entornos compartidos
- Archivos creados con
664
(rw-rw-r--): 666 - 002 = 664 - Directorios creados con
775
(rwxrwxr-x): 777 - 002 = 775
0077 - Restrictivo (archivos privados)
- Archivos creados con
600
(rw-------): 666 - 077 = 600 - Directorios creados con
700
(rwx------): 777 - 077 = 700
Para hacer la umask permanente, añádela al archivo de configuración de tu shell (~/.bashrc
o ~/.zshrc
).
Escenarios de permisos comunes
Hacer scripts ejecutables
Después de crear un script de shell, hazlo ejecutable:
chmod +x script.sh
# Ahora puedes ejecutarlo
./script.sh
Asegurar claves SSH
Las claves privadas SSH deben tener permisos restringidos:
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh
SSH se negará a usar claves con permisos demasiado permisivos.
Permisos de servidor web
Para servidores web como Apache o Nginx:
# Directorios
chmod 755 /var/www/html
# Archivos estáticos (HTML, CSS, JS)
chmod 644 /var/www/html/*.html
# Archivos PHP (si no se ejecutan como propietario)
chmod 644 /var/www/html/*.php
# Directorio de uploads (escribible por el servidor web)
chmod 775 /var/www/html/uploads
Directorios compartidos de equipo
Para colaboración en equipo:
# Crear directorio compartido con SGID
mkdir /compartido/proyecto
chmod 2775 /compartido/proyecto
chgrp developers /compartido/proyecto
Ahora todos los archivos creados en /compartido/proyecto
pertenecerán al grupo developers
, y los miembros del grupo podrán modificarlos.
Solución de problemas comunes
"Permission denied" al ejecutar un script
Problema: bash: ./script.sh: Permission denied
Solución: Añade permiso de ejecución:
chmod +x script.sh
No puedes eliminar un archivo que posees
Problema: rm: cannot remove 'archivo.txt': Permission denied
Causa: Necesitas permiso de escritura en el directorio padre, no en el archivo.
Solución:
chmod +w /directorio/padre
O si el directorio tiene el sticky bit establecido, debes ser el propietario del archivo o el propietario del directorio.
No puedes acceder a archivos en un directorio legible
Problema: ls
funciona pero cat archivo
falla
Causa: El directorio carece de permiso de ejecución.
Solución:
chmod +x /ruta/al/directorio
SSH se niega a usar tu clave
Problema: Permissions 0644 for '/home/marc/.ssh/id_rsa' are too open
Causa: Las claves SSH deben ser privadas (legibles solo por el propietario).
Solución:
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh
Recapitulando
Los permisos de archivos en Linux proporcionan un sistema de seguridad robusto y flexible:
- Usa
ls -l
para ver permisos en formato simbólico - Tres tipos de permisos: lectura (r), escritura (w), ejecución (x)
- Tres grupos de permisos: propietario (u), grupo (g), otros (o)
- Los permisos se pueden representar simbólicamente (
rwxr-xr-x
) o numéricamente (755
) - Usa
chmod
para cambiar permisos,chown
para cambiar propiedad - Los permisos especiales (SUID, SGID, sticky bit) proporcionan control avanzado
- Los directorios necesitan permiso de ejecución para ser accesibles
- La
umask
controla los permisos predeterminados para archivos nuevos
Buenas prácticas
- Sigue el principio de menor privilegio (otorga solo los permisos necesarios)
- Usa
600
para claves privadas y archivos sensibles - Usa
644
para archivos normales,755
para ejecutables y directorios - Evita
777
a menos que sea absolutamente necesario - Usa SGID para directorios de equipo compartidos
- Audita regularmente los permisos en archivos sensibles
Entender los permisos de archivos es esencial para la administración de sistemas Linux, la seguridad y la colaboración efectiva en entornos multiusuario.