¿Por qué otorgar permisos 777 es una mala práctica?
Los permisos 777 (lectura, escritura y ejecución para todos) son una pésima práctica de seguridad por las siguientes razones:
- Permiten que cualquier usuario o proceso pueda leer, modificar o ejecutar los archivos.
- Aumentan el riesgo de ataques maliciosos, ya que un atacante podría modificar o reemplazar archivos críticos.
- Facilitan la propagación de malware si un archivo se infecta.
- Violan el principio de mínimo privilegio, fundamental en seguridad informática.
1. Configuración de permisos en servidor web Ubuntu con Nginx
Estructura de directorios
/var/www/
└── mitienda.com/
├── html/
│ ├── index.html
│ ├── css/
│ ├── js/
│ └── images/
├── logs/
└── backups/
Pasos de configuración
-
Crear la estructura de directorios:
sudo mkdir -p /var/www/mitienda.com/{html,logs,backups} sudo mkdir -p /var/www/mitienda.com/html/{css,js,images}
-
Crear un archivo index.html de ejemplo:
echo "<html><body><h1>Bienvenido a Mi Tienda</h1></body></html>" | sudo tee /var/www/mitienda.com/html/index.html
-
Establecer el propietario correcto:
sudo chown -R www-data:www-data /var/www/mitienda.com
-
Configurar permisos:
# Para directorios sudo find /var/www/mitienda.com -type d -exec chmod 755 {} \; # Para archivos sudo find /var/www/mitienda.com -type f -exec chmod 644 {} \; # Permisos especiales para logs y backups sudo chmod 775 /var/www/mitienda.com/logs sudo chmod 775 /var/www/mitienda.com/backups
-
Configurar Nginx:
Crea un nuevo archivo de configuración:
sudo nano /etc/nginx/sites-available/mitienda.com
Añade el siguiente contenido:
server { listen 80; server_name mitienda.com www.mitienda.com; root /var/www/mitienda.com/html; index index.html; access_log /var/www/mitienda.com/logs/access.log; error_log /var/www/mitienda.com/logs/error.log; location / { try_files $uri $uri/ =404; } }
-
Habilitar el sitio:
sudo ln -s /etc/nginx/sites-available/mitienda.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
2. Configuración de permisos en contenedor Docker con Nginx
Estructura de archivos
mitienda-docker/
├── Dockerfile
├── nginx.conf
└── html/
├── index.html
├── css/
├── js/
└── images/
Pasos de configuración
-
Crear el Dockerfile:
FROM nginx:alpine # Crear un usuario no privilegiado RUN adduser -D -H -u 1000 webuser # Copiar la configuración de Nginx COPY nginx.conf /etc/nginx/nginx.conf # Copiar los archivos del sitio web COPY html /usr/share/nginx/html # Configurar los permisos RUN chown -R webuser:webuser /usr/share/nginx/html && \ chmod -R 755 /usr/share/nginx/html # Cambiar al usuario no privilegiado USER webuser EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
-
Crear el archivo nginx.conf:
user webuser; worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ =404; } } }
-
Crear un archivo index.html de ejemplo:
<!DOCTYPE html> <html> <head> <title>Mi Tienda Docker</title> </head> <body> <h1>Bienvenido a Mi Tienda en Docker</h1> </body> </html>
-
Construir la imagen Docker:
docker build -t mitienda-docker .
-
Ejecutar el contenedor:
docker run -d -p 8080:80 --name mitienda-container mitienda-docker
Conclusión
Tanto en el entorno Ubuntu como en Docker, hemos seguido el principio de mínimo privilegio:
- Los archivos y directorios tienen los permisos mínimos necesarios para funcionar.
- El servidor web se ejecuta bajo un usuario específico con acceso limitado.
- Evitamos el uso de permisos 777, que serían peligrosos en un entorno de producción.
Esta configuración proporciona un equilibrio entre funcionalidad y seguridad, minimizando los riesgos asociados con permisos demasiado permisivos.