Problemas de Permisos de Archivos

Introducción

Los problemas de permisos de archivos están entre los problemas más comunes pero frustrantes que encuentran los administradores de sistemas. Cuando los permisos son incorrectos, las aplicaciones no pueden leer archivos, los servidores web no pueden servir contenido, las bases de datos no inician y los usuarios no pueden acceder a sus datos. Comprender los permisos de archivos de Linux y cómo diagnosticar y corregir problemas de permisos es fundamental para una administración efectiva del sistema.

Esta guía completa proporciona enfoques prácticos para diagnosticar y resolver problemas de permisos de archivos. Aprenderás a leer la notación de permisos, usar comandos de diagnóstico, identificar errores relacionados con permisos e implementar esquemas de permisos adecuados para servidores web, aplicaciones y entornos multiusuario.

Los permisos de archivos controlan quién puede leer, escribir y ejecutar archivos en sistemas Linux. Los permisos incorrectos crean vulnerabilidades de seguridad o impiden el acceso legítimo. Esta guía te enseña a equilibrar la seguridad con la funcionalidad usando técnicas adecuadas de gestión de permisos.

Comprensión de los Permisos de Linux

Conceptos Básicos de Permisos

Linux utiliza un sistema de permisos de tres niveles:

Propietario (Usuario): Permisos del creador/propietario del archivo Grupo: Permisos de miembros del grupo Otros: Permisos de todos los demás

Cada nivel tiene tres tipos de permisos:

Lectura (r/4): Ver contenido del archivo o listar directorio Escritura (w/2): Modificar contenido del archivo o directorio Ejecución (x/1): Ejecutar archivo como programa o acceder a directorio

Notación de Permisos

# Example: -rwxr-xr--
# - = File type (- file, d directory, l link)
# rwx = Owner: read, write, execute
# r-x = Group: read, no write, execute
# r-- = Others: read only

# Numeric notation
# 7 (rwx) = 4+2+1
# 6 (rw-) = 4+2
# 5 (r-x) = 4+1
# 4 (r--) = 4

Permisos Especiales

SUID (4000): Ejecutar como propietario del archivo SGID (2000): Ejecutar como propietario del grupo, heredar grupo en archivos nuevos Sticky Bit (1000): Solo el propietario puede eliminar archivos en el directorio

Diagnóstico Inicial de Permisos

Verificación Rápida de Permisos

# Check specific file
ls -l /path/to/file

# Check directory and contents
ls -la /path/to/directory

# Show numeric permissions
stat -c '%a %n' /path/to/file

# Show full details
stat /path/to/file

# Find files with specific permissions
find /path -type f -perm 0777

# Check ownership
ls -l /path/to/file | awk '{print $3, $4}'

# Check your current permissions
id
groups

# Test if you can read
cat /path/to/file > /dev/null 2>&1 && echo "Can read" || echo "Cannot read"

# Test if you can write
touch /path/to/directory/.test 2>/dev/null && rm /path/to/directory/.test && echo "Can write" || echo "Cannot write"

Paso 1: Errores Comunes de Permisos

Errores de Permiso Denegado

# Error: Permission denied
# Common causes:
# 1. No read permission on file
# 2. No execute permission on directory in path
# 3. Not owner and strict permissions

# Example scenario
$ cat /var/log/private.log
cat: /var/log/private.log: Permission denied

# Check permissions
ls -l /var/log/private.log
# Output: -rw------- 1 root root 1234 Jan 11 10:00 /var/log/private.log

# Solution: Change permissions or ownership
sudo chmod 644 /var/log/private.log
# or become root
sudo cat /var/log/private.log

Errores de No Poder Crear/Escribir

# Error: cannot create regular file: Permission denied

# Check directory permissions
ls -ld /path/to/directory

# Directory needs write permission
# rwxr-xr-x = Others can't write
chmod 775 /path/to/directory

# Check directory ownership
ls -ld /path/to/directory
# Change if needed
chown user:group /path/to/directory

# Check parent directory execute permission
ls -ld /path/to
# Need x permission to access subdirectories

Errores de No Poder Ejecutar

# Error: Permission denied when running script

# Check execute permission
ls -l script.sh
# Output: -rw-r--r-- (no execute)

# Add execute permission
chmod +x script.sh
# or specifically
chmod 755 script.sh

# Verify
ls -l script.sh
# Output: -rwxr-xr-x

# Alternative: run with interpreter
bash script.sh  # Doesn't need execute permission

Paso 2: Problemas de Permisos de Servidor Web

Permisos de Archivos Apache/Nginx

# Standard web directory permissions
# Directories: 755
# Files: 644

# Fix web directory permissions
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

# Check web server user
ps aux | grep apache2 | head -1
ps aux | grep nginx | head -1

# Common web users
# apache, www-data, nginx, httpd

# Set ownership
chown -R www-data:www-data /var/www/html

# For upload directories
chmod 775 /var/www/html/uploads
chown -R www-data:www-data /var/www/html/uploads

# Check what user web server runs as
# Apache
grep "^User\|^Group" /etc/apache2/apache2.conf

# Nginx
grep "^user" /etc/nginx/nginx.conf

Permisos de WordPress

# Standard WordPress permissions
cd /var/www/html/wordpress

# Directories
find . -type d -exec chmod 755 {} \;

# Files
find . -type f -exec chmod 644 {} \;

# wp-content permissions (for uploads)
chmod 775 wp-content
chmod 775 wp-content/uploads

# Set ownership
chown -R www-data:www-data /var/www/html/wordpress

# wp-config.php security
chmod 640 wp-config.php
chown www-data:www-data wp-config.php

# Verify
ls -la wp-config.php

Paso 3: Problemas de Permisos de Base de Datos

Directorio de Datos de MySQL

# Check MySQL data directory
ls -ld /var/lib/mysql

# Should be owned by mysql user
# drwx------ mysql mysql

# Fix ownership
chown -R mysql:mysql /var/lib/mysql
chmod 700 /var/lib/mysql

# Individual database directories
chmod 700 /var/lib/mysql/database_name

# Table files
chmod 660 /var/lib/mysql/database_name/*

# MySQL socket
ls -l /var/run/mysqld/mysqld.sock
chmod 777 /var/run/mysqld/mysqld.sock
chown mysql:mysql /var/run/mysqld/mysqld.sock

Permisos de PostgreSQL

# Check PostgreSQL data directory
ls -ld /var/lib/postgresql/*/main

# Should be 700 or 750
# drwx------ postgres postgres

# Fix ownership
chown -R postgres:postgres /var/lib/postgresql
chmod 700 /var/lib/postgresql/*/main

# Configuration files
chmod 640 /etc/postgresql/*/main/postgresql.conf
chown postgres:postgres /etc/postgresql/*/main/postgresql.conf

Paso 4: Problemas de Permisos SSH/Usuario

Permisos de Claves SSH

# SSH is very strict about permissions

# Home directory: 755 or 700
chmod 755 /home/username
# or more secure:
chmod 700 /home/username

# .ssh directory: 700
chmod 700 /home/username/.ssh

# private keys: 600
chmod 600 /home/username/.ssh/id_rsa
chmod 600 /home/username/.ssh/id_ed25519

# public keys: 644
chmod 644 /home/username/.ssh/id_rsa.pub

# authorized_keys: 600
chmod 600 /home/username/.ssh/authorized_keys

# known_hosts: 644 or 600
chmod 644 /home/username/.ssh/known_hosts

# Ownership must be correct
chown -R username:username /home/username/.ssh

# Verify all SSH permissions
ls -la /home/username/.ssh/

# SSH won't work if permissions are wrong
# Check SSH logs for permission errors
tail -f /var/log/auth.log | grep sshd

Problemas de Directorio Home de Usuario

# Check home directory permissions
ls -ld /home/username

# Should typically be 755
chmod 755 /home/username

# Ownership
chown username:username /home/username

# Fix all files in home directory
chown -R username:username /home/username

# Find files not owned by user
find /home/username ! -user username

# Fix specific permissions
chmod 644 /home/username/.bashrc
chmod 644 /home/username/.profile
chmod 700 /home/username/.config

Paso 5: Problemas de Permisos de Aplicaciones

Directorio de Sesiones PHP-FPM

# Session directory permissions
ls -ld /var/lib/php/sessions

# Should be writable by php-fpm user
chmod 1733 /var/lib/php/sessions
# or
chmod 770 /var/lib/php/sessions
chown root:www-data /var/lib/php/sessions

# Check PHP-FPM user
ps aux | grep php-fpm | head -1

# Clean old sessions
find /var/lib/php/sessions -type f -mtime +7 -delete

Directorios de Carga de Aplicaciones

# Create upload directory
mkdir -p /var/www/html/uploads

# Set permissions
chmod 775 /var/www/html/uploads
chown www-data:www-data /var/www/html/uploads

# Set SGID to inherit group
chmod g+s /var/www/html/uploads

# Verify
ls -ld /var/www/html/uploads
# Should show: drwxrwsr-x www-data www-data

# New files will inherit group ownership

Permisos de Archivos de Registro

# Application log directory
mkdir -p /var/log/myapp
chmod 755 /var/log/myapp
chown myapp:adm /var/log/myapp

# Log files
touch /var/log/myapp/app.log
chmod 640 /var/log/myapp/app.log
chown myapp:adm /var/log/myapp/app.log

# Logrotate permissions
# Create in /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp adm
}

Paso 6: Encontrar Problemas de Permisos

Encontrar Archivos con Permisos Incorrectos

# Find world-writable files (security risk)
find / -type f -perm -002 2>/dev/null

# Find world-writable directories
find / -type d -perm -002 2>/dev/null

# Find files with no owner
find / -nouser -o -nogroup 2>/dev/null

# Find SUID files
find / -perm -4000 -type f 2>/dev/null

# Find SGID files
find / -perm -2000 -type f 2>/dev/null

# Find files owned by specific user
find / -user username 2>/dev/null

# Find files modified recently
find / -type f -mtime -1 2>/dev/null

# Find executable files
find / -type f -perm -111 2>/dev/null

Script de Auditoría de Permisos

cat > /tmp/permission-audit.sh << 'EOF'
#!/bin/bash

echo "Permission Security Audit"
echo "========================"

echo -e "\nWorld-writable files:"
find / -type f -perm -002 ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null | head -20

echo -e "\nWorld-writable directories:"
find / -type d -perm -002 ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null | head -20

echo -e "\nSUID files:"
find / -perm -4000 -type f 2>/dev/null

echo -e "\nFiles with no owner:"
find / -nouser -o -nogroup 2>/dev/null | head -20

echo -e "\nSSH permission issues:"
for user in $(ls /home); do
    if [ -d "/home/$user/.ssh" ]; then
        echo "User: $user"
        ls -la /home/$user/.ssh/ | grep -E "authorized_keys|id_rsa"
    fi
done
EOF

chmod +x /tmp/permission-audit.sh
/tmp/permission-audit.sh

Paso 7: Listas de Control de Acceso (ACL)

Uso de ACL para Permisos Complejos

# Check if ACLs are supported
tune2fs -l /dev/sda1 | grep "Default mount options:"

# View ACLs
getfacl /path/to/file

# Set ACL for specific user
setfacl -m u:username:rw /path/to/file

# Set ACL for specific group
setfacl -m g:groupname:rwx /path/to/directory

# Set default ACL for directory (inherited by new files)
setfacl -d -m u:username:rw /path/to/directory

# Remove specific ACL
setfacl -x u:username /path/to/file

# Remove all ACLs
setfacl -b /path/to/file

# Copy ACLs
getfacl /source/file | setfacl --set-file=- /dest/file

# Recursive ACL
setfacl -R -m u:username:rwx /path/to/directory

Soluciones y Mejores Prácticas

Esquemas de Permisos Estándar

# Web server directories
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www

# User home directories
chmod 755 /home/username
chown -R username:username /home/username

# Application directories
mkdir -p /opt/myapp
chmod 755 /opt/myapp
chown -R myapp:myapp /opt/myapp

# Configuration files
chmod 640 /etc/myapp/config.conf
chown root:myapp /etc/myapp/config.conf

# Executable scripts
chmod 755 /usr/local/bin/script.sh
chown root:root /usr/local/bin/script.sh

# Log directories
chmod 755 /var/log/myapp
chown myapp:adm /var/log/myapp

Script de Restablecimiento de Permisos

cat > /usr/local/bin/fix-web-permissions.sh << 'EOF'
#!/bin/bash

WEB_ROOT="/var/www/html"
WEB_USER="www-data"
WEB_GROUP="www-data"

echo "Fixing permissions for $WEB_ROOT"

# Set directory permissions
find "$WEB_ROOT" -type d -exec chmod 755 {} \;

# Set file permissions
find "$WEB_ROOT" -type f -exec chmod 644 {} \;

# Set ownership
chown -R $WEB_USER:$WEB_GROUP "$WEB_ROOT"

# Special directories
if [ -d "$WEB_ROOT/uploads" ]; then
    chmod 775 "$WEB_ROOT/uploads"
    chmod g+s "$WEB_ROOT/uploads"
fi

if [ -d "$WEB_ROOT/cache" ]; then
    chmod 775 "$WEB_ROOT/cache"
    chmod g+s "$WEB_ROOT/cache"
fi

echo "Permissions fixed"
ls -la "$WEB_ROOT"
EOF

chmod +x /usr/local/bin/fix-web-permissions.sh

Monitoreo de Permisos

cat > /usr/local/bin/monitor-permissions.sh << 'EOF'
#!/bin/bash

LOG="/var/log/permission-monitor.log"

# Check for new SUID files
CURRENT_SUID=$(find / -perm -4000 -type f 2>/dev/null | sort)
if [ -f /tmp/suid_baseline.txt ]; then
    BASELINE=$(cat /tmp/suid_baseline.txt)
    if [ "$CURRENT_SUID" != "$BASELINE" ]; then
        echo "$(date): SUID files changed!" >> "$LOG"
        diff /tmp/suid_baseline.txt <(echo "$CURRENT_SUID") >> "$LOG"
        echo "SUID files changed on $(hostname)" | mail -s "Security Alert" [email protected]
    fi
fi
echo "$CURRENT_SUID" > /tmp/suid_baseline.txt

# Check for world-writable files
WRITABLE=$(find /var/www -type f -perm -002 2>/dev/null)
if [ -n "$WRITABLE" ]; then
    echo "$(date): World-writable files found:" >> "$LOG"
    echo "$WRITABLE" >> "$LOG"
fi
EOF

chmod +x /usr/local/bin/monitor-permissions.sh
echo "0 */6 * * * /usr/local/bin/monitor-permissions.sh" | crontab -

Conclusión

Los problemas de permisos de archivos son comunes pero manejables con la comprensión y herramientas adecuadas. Conclusiones clave:

  1. Comprender los fundamentos: Propietario, grupo, otros y lectura, escritura, ejecución
  2. Verificar permisos primero: Usar ls -l y stat
  3. Conocer esquemas estándar: Servidores web, bases de datos, SSH todos tienen requisitos específicos
  4. Equilibrar seguridad y funcionalidad: No usar 777 a menos que sea absolutamente necesario
  5. Usar propiedad adecuada: Asegurar que los archivos pertenezcan al usuario y grupo correctos
  6. Monitorear cambios: Vigilar modificaciones inesperadas de permisos
  7. Documentar estándares: Mantener esquemas de permisos para tus aplicaciones

Las auditorías regulares de permisos, la configuración inicial adecuada y la comprensión de estas técnicas de diagnóstico aseguran el acceso seguro y funcional a los archivos en tus sistemas Linux.