Saltar al contenido
0xrcosRyan Camargo — home
Todas las publicaciones
linux~6min de lecturaRyan Camargo

Permisos de Archivo en Linux, Sin Magia

Un recorrido fundamentado por rwx, notación octal, chmod, chown, umask y los bits especiales — explicado como me hubiera gustado que me lo explicaran.

Leer en:ENPT-BR

Nota: Este es contenido de ejemplo creado para demostrar el blog. Sustitúyelo por tu propio texto.

Los permisos de archivo son uno de esos temas de Linux que se introducen una vez, mal, y nunca se revisitan. Aprendes chmod 755, lo copias y pegas para siempre y, en algún momento, te das cuenta de que no sabes qué hace el 4 en chmod 4755. Esta entrada es la explicación que hubiera querido tener en mi primer año.

La Salida de ls -l, Decodificada

Empieza por la fuente de verdad. ls -l imprime los metadatos que el sistema de archivos guarda para cada entrada:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59944 Feb  7  2025 /usr/bin/passwd

Leyendo de izquierda a derecha:

  • - — tipo de archivo (- archivo regular, d directorio, l enlace simbólico, c/b dispositivo de caracteres/bloques, p pipe, s socket).
  • rws — permisos del propietario (la s aquí es un bit especial, volvemos a él más adelante).
  • r-x — permisos del grupo.
  • r-x — permisos de otros (el resto).
  • 1 — contador de hard links.
  • root root — propietario y grupo.
  • 59944 — tamaño en bytes.
  • Fecha y nombre.

Los nueve caracteres de permiso se dividen en tres tripletes: propietario / grupo / otros. Dentro de cada triplete, las posiciones son fijas: r (lectura), w (escritura), x (ejecución). Un guion significa "no establecido".

Simbólico vs. Octal

Hay dos formas de hablar de permisos: simbólica (rwxr-xr-x) y octal (755). Describen lo mismo; octal es simplemente más compacta.

Cada triplete se mapea limpiamente a tres bits:

Simbólico Binario Octal Significado
--- 000 0 sin acceso
--x 001 1 sólo ejecución
-w- 010 2 sólo escritura
-wx 011 3 escritura + ejecución
r-- 100 4 sólo lectura
r-x 101 5 lectura + ejecución
rw- 110 6 lectura + escritura
rwx 111 7 lectura + escritura + ejecución

Así, 755 es rwxr-xr-x: el propietario puede todo, grupo y otros pueden leer y ejecutar, pero no escribir. 644 es rw-r--r--, el valor por defecto para la mayoría de los archivos regulares. 600 es rw-------, común para claves privadas.

chmod: Modo Simbólico y Absoluto

chmod acepta cualquiera de las dos formas. El modo simbólico es más amigable cuando sólo quieres cambiar un bit:

# Añade permiso de ejecución para el propietario.
chmod u+x script.sh

# Quita escritura para "otros".
chmod o-w notas.txt

# Define lectura y escritura para propietario y grupo, nada para otros.
chmod ug=rw,o= compartido.log

El modo octal define los tres tripletes a la vez — lo que no menciones se limpia:

# Restringe una clave privada.
chmod 600 ~/.ssh/id_ed25519

# Un directorio que el equipo puede leer y recorrer, pero no escribir.
chmod 755 /srv/public

Un error común: en un directorio, r permite listar las entradas; x permite recorrer el directorio y acceder a una entrada nombrada. Quitar x de un directorio suele romper más cosas de las que se esperan.

chown y chgrp

chown cambia el propietario (y, opcionalmente, el grupo). chgrp cambia sólo el grupo; en la práctica se usa chown para ambos porque admite la forma propietario:grupo.

# Cambia sólo el propietario.
sudo chown ryan app.log

# Cambia propietario y grupo.
sudo chown ryan:devs app.log

# Recursivo, con cambio explícito de grupo.
sudo chown -R ryan:devs /srv/app

Usa -R con cuidado. Un chown recursivo sobre un árbol que contiene enlaces simbólicos puede producir resultados sorprendentes; añade -h para operar sobre los propios enlaces en lugar de sobre sus destinos.

umask y los Permisos por Defecto

Cuando se crea un archivo nuevo, el kernel aplica un modo por defecto y luego el umask del shell elimina bits de él. El modo de creación por defecto suele ser 0666 para archivos y 0777 para directorios.

$ umask
022

Un umask 022 significa: no quitar nada del propietario; quitar escritura del grupo; quitar escritura de otros. Entonces:

  • Archivo nuevo: 0666 & ~022 = 0644 → rw-r--r--
  • Directorio nuevo: 0777 & ~022 = 0755 → rwxr-xr-x

Para que los archivos nuevos sean escribibles por el grupo por defecto, define umask 002 (habitual en servidores compartidos, donde varias personas escriben en el mismo árbol).

Los Bits Especiales: setuid, setgid y Sticky

Tres bits adicionales se sitúan delante de los nueve que ya conoces. Son fáciles de pasar por alto porque aparecen en las posiciones de ejecución de propietario, grupo y otros, sustituyendo la x por s o t.

setuid (4xxx)

Cuando se establece en un ejecutable, el proceso se ejecuta con el UID efectivo del propietario del archivo en lugar del usuario que lo invocó. El ejemplo canónico es passwd:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59944 Feb  7  2025 /usr/bin/passwd

Esa s en el triplete del propietario es setuid. Es así como un usuario normal puede editar /etc/shadow (que sólo root puede leer) sin ser root. setuid es poderoso y peligroso — todo binario setuid-root privilegiado es una escalada de privilegios esperando a ocurrir si tiene un bug. Audítalos:

$ find /usr -perm -4000 -type f -exec ls -l {} \;

setgid (2xxx)

En un ejecutable, setgid hace lo mismo, pero para el grupo. En un directorio, setgid tiene un significado distinto y muy útil: cualquier archivo creado dentro de ese directorio hereda el grupo del directorio, en lugar del grupo del usuario creador. Es el mecanismo estándar para directorios de proyecto compartidos.

sudo mkdir /srv/team
sudo chgrp devs /srv/team
sudo chmod 2775 /srv/team   # setgid en un directorio

Bit Sticky (1xxx)

El bit sticky en un directorio dice que sólo el propietario de un archivo (o el propietario del directorio, o root) puede renombrar o borrar ese archivo. /tmp es el ejemplo de manual:

$ ls -ld /tmp
drwxrwxrwt 25 root root 4096 Mar 22 09:12 /tmp

Esa t al final es el bit sticky. Sin él, cualquier usuario podría borrar los archivos de cualquier otro en /tmp — lo que sería un desastre.

Establecer los Bits Especiales

Combínalos con el resto del modo octal. El primer dígito es el byte de bits especiales:

# setuid + rwxr-xr-x → 4755
sudo chmod 4755 /opt/app/bin/privileged-helper

# setgid en un directorio, con rwxrwsr-x → 2775
sudo chmod 2775 /srv/team

# Bit sticky en /tmp (ya establecido por defecto) → 1777
sudo chmod 1777 /tmp

El modo simbólico es discutiblemente más claro:

chmod u+s helper        # setuid
chmod g+s /srv/team     # setgid
chmod +t /tmp           # sticky

Un Modelo Mental Rápido

  • rwx son tres bits por triplete, tres tripletes por archivo.
  • Octal empaqueta cada triplete en un dígito; el cuarto dígito a la izquierda (si está presente) lleva los bits especiales.
  • En directorios, r permite listar, x permite recorrer, w permite crear/borrar/renombrar.
  • Los bits especiales (setuid, setgid, sticky) modifican cómo se ejecuta el archivo o cómo se crean archivos dentro de un directorio.

Dónde Leer Más

La referencia canónica es man 2 chmod y man 1 chmod. La página de manual de chmod en Linux es inusualmente completa, y la sección File permissions de la documentación del kernel explica los casos límite (capacidades, ACLs, qué ocurre en cadenas de symlinks) que esta entrada omite deliberadamente. Si trabajas con ACLs (getfacl / setfacl), el modelo se extiende de forma limpia — pero eso es tema para otra entrada.

En esta página