Si dominas el octal 755 ya sabes la mitad del sistema de permisos Unix. La otra mitad —los bits especiales y umask— explica comportamientos que parecen mágicos: por qué passwd puede modificar /etc/shadow siendo root-only, por qué no puedes borrar archivos ajenos en /tmp pese a tener permiso de escritura, y por qué tus ficheros nuevos nacen con unos permisos u otros. Todo tiene lógica y se aprende en diez minutos.
Repaso exprés del modelo base
Cada fichero lleva tres tríos rwx (lectura/escritura/ejecución) para propietario, grupo y otros. El octal suma bits: r=4, w=2, x=1.
-rwxr-x--- 1 miguel dev 4096 ago 27 file.sh
└┬┘└┬┘└┬┘
│ │ └─ otros: --- (0)
│ └──── grupo: r-x (5) → 754
└─────── dueño: rwx (7)
La semántica difiere según tipo: sobre ficheros, x = ejecutable; sobre directorios, r = listar nombres, x = atravesar (acceder a su contenido), w = crear/borrar entradas. Ese matiz genera la confusión clásica: un directorio r-- permite ver nombres pero no entrar; uno --x permite acceder sabiendo la ruta exacta pero no listarla.
Los bits especiales: el cuarto dígito
El octal admite cuatro dígitos: el primero codifica los bits especiales (setuid=4, setgid=2, sticky=1).
Setuid (4000) en un ejecutable: corre con los privilegios del DUEÑO del fichero, no de quien lo lanza. El caso canónico es /usr/bin/passwd:
-rwsr-xr-x root root /usr/bin/passwd
↑ s minúscula = setuid activo
Cambiar tu contraseña exige escribir en /etc/shadow, que solo root puede tocar. Gracias al setuid, el binario passwd eleva temporalmente sus privilegios, actualiza el shadow y baja. Es escalada de privilegios diseñada a propósito — y por eso cualquier binario setuid-root inesperado es hallazgo de auditoría inmediato (find / -perm -4000 -user root).
Setgid (2000) tiene dos vidas:
- En ejecutables: como setuid pero con el grupo.
- En directorios: todo fichero creado dentro hereda el GRUPO del directorio en vez del grupo primario del creador. Es la pieza clave de los directorios de equipo:
mkdir /srv/proyecto
chgrp devs /srv/proyecto
chmod 2775 /srv/proyecto # 2=setgid + rwxrwxr-x
Sin setgid, Ana crea ficheros con grupo ana y Bob no puede editarlos pese a compartir devs. Con él, todo nace colaborativo. Combinado con permisos por defecto correctos, resuelve el 90% de los dolores de compartición en servidores.
Sticky bit (1000) en directorios: solo el dueño del fichero (o del directorio, o root) puede BORRARLO, aunque el directorio sea world-writable. Su único caso real es /tmp:
drwxrwxrwt 22 root root /tmp
↑ t = sticky
Sin sticky bit, cualquiera podría borrar los temporales ajenos en un directorio 777 — negación de servicio trivial. Con él, escritura universal, borrado solo propio.
Umask: los permisos de nacimiento
Cuando creas un fichero, ¿por qué sale 644 y no 666? La respuesta es umask: la máscara que RESTA permisos en la creación.
Los procesos piden permisos máximos (ficheros 666, directorios 777 — la x no se otorga por defecto a ficheros nuevos por seguridad) y umask los filtra:
permisos finales = petición AND NOT umask
umask 022: 666 & ~022 = 644 (rw-r--r--)
777 & ~022 = 755 (rwxr-xr-x)
umask 077: 666 & ~077 = 600 (rw-------) ← paranoico, ideal para claves
777 & ~077 = 700
Consulta el tuyo con umask (valor octal) o umask -S (simbólico). Se fija por sesión/perfil (~/.bashrc) o globalmente en /etc/profile y PAM. Casos de uso real: servidores multiusuario corporativos van bien con 027 (grupo lee, otros nada); servicios que generan claves privadas deben correr con umask 077 — una clave SSH nacida 644 provoca el aviso conocido de OpenSSH.
ACLs: cuando tres tríos no bastan
El modelo clásico tiene un límite duro: un solo grupo por fichero. Cuando necesitas "devs lectura+escritura, auditores solo lectura, servicio web lectura", llegan las ACL POSIX:
setfacl -m g:auditores:r-x /srv/proyecto
getfacl /srv/proyecto
En ls -l aparecen como un + final (drwxrwxr-x+). Suficiente para la mayoría de servidores de ficheros; para sistemas grandes, NFSv4/Samba llevan el modelo más lejos.
Higiene de permisos: lo que revisa una auditoría
- Binarios setuid inesperados (especialmente en /home o rutas escribibles).
- Directorios compartidos sin setgid (dolores de equipo) o sin sticky (riesgo de borrado).
- Ficheros de configuración world-readable con credenciales (
find /etc -perm -004). - Claves privadas SSH/CRT con más de 600 — OpenSSH directamente las rechaza.
Para calcular y visualizar combinaciones octal/simbólicas sin hacer cuentas mentales, nuestro calculador chmod traduce entre formatos al instante; la base del sistema está en la guía de permisos octales.
Preguntas frecuentes
¿Por qué veo T mayúscula en lugar de t? Sticky bit activo pero sin permiso de ejecución para otros (drwxrw-rw-T). Igual con S en setuid: bit especial sin x — estado casi siempre erróneo, señal de chmod mal aplicado.
¿cp y mv conservan permisos? mv dentro del mismo filesystem sí (solo renombra la entrada); cp crea nuevo aplicando umask salvo -p. Detalle crítico al copiar claves o configs entre máquinas.
¿chmod 777 arregla "permission denied"? Casi nunca es la solución correcta y abre agujeros reales. Diagnostica QUÉ usuario ejecuta el proceso, QUÉ permiso falta exactamente (¿atravesar el directorio?) y concede lo mínimo.
Calcula permisos octales y simbólicos con nuestro calculador chmod, gratis y directamente en tu navegador.