¿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.
Los Tres Tipos de Permisos
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
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:
# 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