upload file linux docker chmod 777

¿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

  1. 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}
  2. 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
  3. Establecer el propietario correcto:

    sudo chown -R www-data:www-data /var/www/mitienda.com
  4. 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
  5. 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;
        }
    }
  6. 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

  1. 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;"]
  2. 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;
            }
        }
    }
  3. 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>
  4. Construir la imagen Docker:

    docker build -t mitienda-docker .
  5. 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:

  1. Los archivos y directorios tienen los permisos mínimos necesarios para funcionar.
  2. El servidor web se ejecuta bajo un usuario específico con acceso limitado.
  3. 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.

¿Tienes preguntas sobre la configuración segura de servidores web? ¡Déjalas en los comentarios!