Permisos y Propietarios

Domina el sistema de seguridad de Linux: permisos, propietarios y control de acceso

Módulo 1 ⏱️ 35-40 min 🔐 Seguridad 👤 Usuarios 📚 Principiante

¿Qué Son Los Permisos?

Los permisos en Linux controlan quién puede hacer qué con cada archivo y directorio. Es un sistema fundamental de seguridad que protege el sistema y los datos de los usuarios.

Cada archivo y directorio tiene tres niveles de acceso y tres tipos de permisos, creando una matriz de 9 permisos básicos.

Propietario (Owner)

Usuario que creó el archivo

Grupo (Group)

Grupo al que pertenece el archivo

Otros (Others)

Todos los demás usuarios

Los Tres Tipos de Permisos

Lectura (r)

Valor: 4

  • Ver contenido del archivo
  • Listar contenido del directorio

Escritura (w)

Valor: 2

  • Modificar contenido del archivo
  • Crear/eliminar archivos en directorio

Ejecución (x)

Valor: 1

  • Ejecutar archivo como programa
  • Acceder al directorio (entrar con cd)

Interpretando Permisos con ls -l

# Ver permisos detallados
$ ls -l
-rw-r--r--  1 usuario grupo 1024 oct 15 10:30 archivo.txt
drwxr-xr-x  2 usuario grupo 4096 oct 15 10:25 mi_directorio
-rwxr-xr-x  1 usuario grupo  512 oct 15 10:20 mi_script.sh
-rw-------  1 usuario grupo 2048 oct 15 10:15 privado.txt

Desglose del formato:

Tipo
- archivo
d directorio
l enlace
Propietario
rwx
Lectura, Escritura, Ejecución
Grupo
r-x
Lectura, Sin escritura, Ejecución
Otros
r--
Solo lectura

Ejemplos Comunes

# Archivo de solo lectura para todos
-r--r--r--  1 usuario grupo  1024 oct 15 10:30 readme.txt

# Script ejecutable por el propietario, legible por otros
-rwxr--r--  1 usuario grupo   512 oct 15 10:25 mi_script.sh

# Archivo privado (solo propietario puede leer/escribir)
-rw-------  1 usuario grupo  2048 oct 15 10:20 secreto.txt

# Directorio con acceso completo para propietario, lectura para otros
drwxr--r--  2 usuario grupo  4096 oct 15 10:15 mi_proyecto

# Directorio público (todos pueden entrar y leer)
drwxr-xr-x  2 usuario grupo  4096 oct 15 10:10 publico

Sistema Octal de Permisos

Los permisos se pueden expresar usando números octales (base 8), donde cada dígito representa los permisos para propietario, grupo y otros respectivamente.

Octal Binario Permisos Descripción
0 000 --- Sin permisos
1 001 --x Solo ejecución
2 010 -w- Solo escritura
3 011 -wx Escritura y ejecución
4 100 r-- Solo lectura
5 101 r-x Lectura y ejecución
6 110 rw- Lectura y escritura
7 111 rwx Todos los permisos

Combinaciones Comunes

Máxima Seguridad

700 - rwx------

Solo el propietario tiene acceso

Seguridad Media

755 - rwxr-xr-x

Propietario: todo, Otros: lectura y ejecución

Acceso Público

644 - rw-r--r--

Propietario: lectura/escritura, Otros: solo lectura

Comando chmod - Cambiar Permisos

El comando chmod (Change Mode) te permite modificar los permisos de archivos y directorios.

Modo Octal (Numérico)

# Crear un archivo para practicar
$ touch ejemplo.txt
$ ls -l ejemplo.txt
-rw-r--r-- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Cambiar permisos usando notación octal
$ chmod 755 ejemplo.txt
$ ls -l ejemplo.txt
-rwxr-xr-x 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Hacer archivo privado (solo propietario)
$ chmod 600 ejemplo.txt
$ ls -l ejemplo.txt
-rw------- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Hacer archivo ejecutable para todos
$ chmod 777 ejemplo.txt
$ ls -l ejemplo.txt
-rwxrwxrwx 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Quitar todos los permisos
$ chmod 000 ejemplo.txt
$ ls -l ejemplo.txt
---------- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

Modo Simbólico

# Restaurar permisos normales primero
$ chmod 644 ejemplo.txt

# Agregar permiso de ejecución al propietario
$ chmod u+x ejemplo.txt
$ ls -l ejemplo.txt
-rwxr--r-- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Quitar permiso de lectura al grupo
$ chmod g-r ejemplo.txt
$ ls -l ejemplo.txt
-rwx---r-- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Agregar permiso de escritura para todos
$ chmod a+w ejemplo.txt
$ ls -l ejemplo.txt
-rwx-w-rw- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Establecer permisos exactos para el grupo
$ chmod g=rx ejemplo.txt
$ ls -l ejemplo.txt
-rwxr-xrw- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt
Símbolos en chmod
  • u = usuario (propietario)
  • g = grupo
  • o = otros
  • a = todos (all)
  • + = agregar permiso
  • - = quitar permiso
  • = = establecer permiso exacto

Aplicar a Directorios

# Crear directorio para practicar
$ mkdir mi_directorio
$ ls -ld mi_directorio
drwxr-xr-x 2 usuario grupo 4096 oct 15 10:35 mi_directorio

# Cambiar permisos del directorio
$ chmod 700 mi_directorio
$ ls -ld mi_directorio
drwx------ 2 usuario grupo 4096 oct 15 10:35 mi_directorio

# Aplicar permisos recursivamente (a todos los archivos dentro)
$ chmod -R 755 mi_directorio
$ ls -la mi_directorio
total 8
drwxr-xr-x 2 usuario grupo 4096 oct 15 10:35 .
drwxr-xr-x 8 usuario grupo 4096 oct 15 10:30 ..
-rwxr-xr-x 1 usuario grupo    0 oct 15 10:35 archivo_interno.txt
Cuidado con chmod 777

Nunca uses chmod 777 a menos que sea absolutamente necesario. Dar permisos completos a todos los usuarios es un riesgo de seguridad significativo.

Comando chown - Cambiar Propietario

El comando chown (Change Owner) permite cambiar el propietario y/o grupo de archivos y directorios. Generalmente requiere privilegios de administrador.

# Ver propietario actual
$ ls -l ejemplo.txt
-rw-r--r-- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Cambiar solo el propietario (requiere sudo)
$ sudo chown root ejemplo.txt
$ ls -l ejemplo.txt
-rw-r--r-- 1 root grupo 0 oct 15 10:30 ejemplo.txt

# Cambiar propietario y grupo
$ sudo chown root:root ejemplo.txt
$ ls -l ejemplo.txt
-rw-r--r-- 1 root root 0 oct 15 10:30 ejemplo.txt

# Cambiar solo el grupo (también se puede usar chgrp)
$ sudo chown :usuarios ejemplo.txt
$ ls -l ejemplo.txt
-rw-r--r-- 1 root usuarios 0 oct 15 10:30 ejemplo.txt

# Restaurar propietario original
$ sudo chown usuario:grupo ejemplo.txt
$ ls -l ejemplo.txt
-rw-r--r-- 1 usuario grupo 0 oct 15 10:30 ejemplo.txt

# Cambiar propietario recursivamente en un directorio
$ sudo chown -R usuario:grupo mi_directorio/

Comando chgrp - Cambiar Grupo

# Cambiar solo el grupo (alternativa a chown :grupo)
$ chgrp desarrollo ejemplo.txt
$ ls -l ejemplo.txt
-rw-r--r-- 1 usuario desarrollo 0 oct 15 10:30 ejemplo.txt

# Ver grupos disponibles
$ groups
usuario desarrollo admin

# Cambiar grupo recursivamente
$ chgrp -R desarrollo mi_directorio/
Nota sobre Privilegios

Solo el propietario actual del archivo o el usuario root pueden cambiar el propietario de un archivo. Para cambiar grupos, debes ser miembro del grupo de destino o ser root.

Permisos Especiales

Además de los permisos básicos, Linux tiene permisos especiales para casos específicos de seguridad y funcionalidad.

Sticky Bit

# Ver el directorio /tmp que tiene sticky bit
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 oct 15 10:40 /tmp

# El 't' al final indica sticky bit
# Solo el propietario puede eliminar sus archivos, aunque todos pueden escribir

# Aplicar sticky bit a un directorio
$ chmod +t mi_directorio
$ ls -ld mi_directorio
drwxr-xr-t 2 usuario grupo 4096 oct 15 10:35 mi_directorio

# También se puede hacer con notación octal (1000 + permisos normales)
$ chmod 1755 mi_directorio

SUID (Set User ID)

# Ver un programa con SUID (como passwd)
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 jul 15 08:35 /usr/bin/passwd

# La 's' en la posición del propietario indica SUID
# El programa se ejecuta con permisos del propietario (root), no del usuario

# Aplicar SUID a un archivo (requiere sudo)
$ sudo chmod u+s mi_script.sh
$ ls -l mi_script.sh
-rwsr-xr-x 1 root root 0 oct 15 10:45 mi_script.sh

# Con notación octal (4000 + permisos normales)
$ sudo chmod 4755 mi_script.sh

SGID (Set Group ID)

# Aplicar SGID a un directorio
$ chmod g+s mi_proyecto/
$ ls -ld mi_proyecto/
drwxr-sr-x 2 usuario desarrollo 4096 oct 15 10:50 mi_proyecto/

# Los archivos creados dentro heredarán el grupo del directorio
# Con notación octal (2000 + permisos normales)
$ chmod 2755 mi_proyecto/
Advertencia de Seguridad

Los permisos SUID y SGID son potencialmente peligrosos si se aplican incorrectamente. Un script con SUID ejecutándose como root puede comprometer todo el sistema. Úsalos solo cuando sea absolutamente necesario y con extremo cuidado.

Ejemplos Prácticos de Seguridad

Configuraciones Típicas

# Archivos de configuración del sistema (solo root puede escribir)
$ sudo chmod 644 /etc/hosts
$ ls -l /etc/hosts
-rw-r--r-- 1 root root 220 oct 15 08:20 /etc/hosts

# Scripts ejecutables por el propietario, legibles por todos
$ chmod 755 ~/bin/mi_script.sh
$ ls -l ~/bin/mi_script.sh
-rwxr-xr-x 1 usuario grupo 1024 oct 15 11:00 ~/bin/mi_script.sh

# Archivo de contraseñas privado
$ chmod 600 ~/.ssh/id_rsa
$ ls -l ~/.ssh/id_rsa
-rw------- 1 usuario grupo 3247 oct 15 11:05 ~/.ssh/id_rsa

# Directorio público con sticky bit (como /tmp)
$ chmod 1777 /var/shared
$ ls -ld /var/shared
drwxrwxrwt 2 root root 4096 oct 15 11:10 /var/shared

# Directorio de proyecto compartido
$ chmod 2775 /var/project
$ chgrp developers /var/project
$ ls -ld /var/project
drwxrwsr-x 2 root developers 4096 oct 15 11:15 /var/project

Auditando Permisos

# Encontrar archivos con permisos peligrosos (SUID)
$ find /usr -type f -perm -4000 2>/dev/null
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/su

# Encontrar archivos world-writable (escribibles por todos)
$ find /home -type f -perm -002 2>/dev/null

# Encontrar directorios sin permisos de ejecución
$ find . -type d ! -perm -111

# Listar permisos de archivos importantes del sistema
$ ls -l /etc/passwd /etc/shadow /etc/sudoers
-rw-r--r-- 1 root root    2031 oct 10 08:20 /etc/passwd
-rw-r----- 1 root shadow  1285 oct 10 08:20 /etc/shadow
-r--r----- 1 root root     669 oct  5 15:30 /etc/sudoers

Herramientas Adicionales

Comando umask

# Ver umask actual
$ umask
0022

# Ver umask en formato simbólico
$ umask -S
u=rwx,g=rx,o=rx

# Los nuevos archivos se crean con permisos (666 - umask)
# Los nuevos directorios se crean con permisos (777 - umask)

$ touch nuevo_archivo.txt
$ mkdir nuevo_directorio
$ ls -l nuevo_archivo.txt
-rw-r--r-- 1 usuario grupo 0 oct 15 11:20 nuevo_archivo.txt
$ ls -ld nuevo_directorio
drwxr-xr-x 2 usuario grupo 4096 oct 15 11:20 nuevo_directorio

# Cambiar umask temporalmente
$ umask 077
$ touch archivo_privado.txt
$ ls -l archivo_privado.txt
-rw------- 1 usuario grupo 0 oct 15 11:25 archivo_privado.txt

Comando stat

# Ver información detallada de permisos
$ stat ejemplo.txt
  File: ejemplo.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d      Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/usuario)   Gid: ( 1000/  grupo)
Access: 2023-10-15 11:30:15.000000000 +0200
Modify: 2023-10-15 11:30:15.000000000 +0200
Change: 2023-10-15 11:30:15.000000000 +0200

# Ver solo los permisos en formato octal
$ stat -c "%a %n" ejemplo.txt
644 ejemplo.txt

Ejercicio Práctico

Laboratorio de Permisos

Completa este laboratorio práctico para dominar los permisos en Linux:

Ejercicios de permisos Copiar
# Ejercicio 1: Crear estructura de archivos
mkdir ~/laboratorio_permisos
cd ~/laboratorio_permisos
touch archivo_publico.txt archivo_privado.txt script.sh
mkdir directorio_publico directorio_privado

# Ejercicio 2: Establecer permisos básicos
chmod 644 archivo_publico.txt       # Lectura para todos, escritura solo propietario
chmod 600 archivo_privado.txt       # Solo accesible por propietario
chmod 755 script.sh                 # Ejecutable por propietario, legible por otros
chmod 755 directorio_publico        # Accesible por todos
chmod 700 directorio_privado        # Solo accesible por propietario

# Ejercicio 3: Verificar permisos
ls -la
# Deberías ver algo como:
# -rw-r--r-- 1 usuario grupo    0 oct 15 11:30 archivo_publico.txt
# -rw------- 1 usuario grupo    0 oct 15 11:30 archivo_privado.txt
# -rwxr-xr-x 1 usuario grupo    0 oct 15 11:30 script.sh
# drwxr-xr-x 2 usuario grupo 4096 oct 15 11:30 directorio_publico
# drwx------ 2 usuario grupo 4096 oct 15 11:30 directorio_privado

# Ejercicio 4: Practicar con modo simbólico
chmod u+w archivo_publico.txt       # Redundante, ya tiene escritura
chmod g+w archivo_publico.txt       # Dar escritura al grupo
chmod o-r archivo_publico.txt       # Quitar lectura a otros
ls -l archivo_publico.txt           # Debería mostrar: -rw-rw----

# Ejercicio 5: Restaurar y probar diferentes combinaciones
chmod 644 archivo_publico.txt
chmod u+x,g+x script.sh            # Dar ejecución a propietario y grupo
chmod a-x script.sh                 # Quitar ejecución a todos
chmod a+x script.sh                 # Dar ejecución a todos

# Ejercicio 6: Trabajar con directorios
chmod g+w directorio_publico        # Permitir al grupo crear archivos
chmod g+s directorio_publico        # SGID: archivos heredan el grupo
touch directorio_publico/test.txt
ls -l directorio_publico/test.txt   # Verificar el grupo

# Ejercicio 7: Aplicar permisos recursivamente
mkdir -p estructura/nivel1/nivel2
touch estructura/archivo.txt estructura/nivel1/archivo.txt
chmod -R 755 estructura/
ls -la estructura/nivel1/

# Ejercicio 8: Verificar con stat
stat script.sh                      # Ver información completa
stat -c "%a %n" *                  # Ver permisos octales de todos los archivos

# Ejercicio 9: Practicar umask
umask                               # Ver umask actual
umask 077                           # Cambiar temporalmente
touch test_umask.txt
ls -l test_umask.txt               # Debería ser -rw-------
umask 022                           # Restaurar umask normal

# Ejercicio 10: Limpieza
cd ..
rm -rf laboratorio_permisos
Al completar este laboratorio

Deberías poder:

  • Interpretar permisos en notación simbólica y octal
  • Usar chmod con ambas notaciones
  • Cambiar propietarios y grupos con chown
  • Aplicar permisos de forma recursiva
  • Entender el impacto de permisos especiales