Este proyecto muestra el proceso de administración y configuración de una máquina virtual para alojar un servidor web.

1. Actualización del Sistema e Instalación de Python y Mysql

es importante destacar que se estara trabajando como super usuario hasta la creación del usuario sin privilegios

Empezamos por actualizar el sistema y instalar Python:

  • apt update && sudo apt upgrade -y

  • apt install python3 python3-pip python3-venv -y

  • apt install mysql-server

2. Configuración de MySQL para Django.

Por defecto, Django utiliza SQLite3 como base de datos, pero si se desea usar una base de datos más robusta, como PostgreSQL o MySQL, se necesita instalar y configurar el servidor correspondiente, se es libre de saltar esta parte si no aplica.

Para configurar MySQL vamos a ejecutar el comando mysql_secure_installation y seguiremos los pasos configurando el servicio según nos convenga.

Accedemos a MySQL y vamos a crear una base de datos para el proyecto.

CREATE DATABASE Django;

Y un usuario al que le vamos a asignar privilegios sobre la base de datos que acabamos de crear y aplicamos los cambios

CREATE USER 'adaminerweb'@'localhost' IDENTIFIED BY 'Unacontraseñasegura';
GRANT ALL PRIVILEGES ON Django.* TO 'adaminerweb'@'localhost';
FLUSH PRIVILEGES;

en esta configuración MySQL solo puede accederse de manera local.

3. Creación de un Usuario para la Web

Empezamos por crear un usuario sin privilegios para la web. adduser adaminerweb

creamos un acceso por ssh al usuario ssh-keygen ** Recomendado poner un passphrase**

5. Envío del Proyecto al Servidor

ya con acceso a ssh al servidor se procede a transferir el proyecto a la carpeta raíz del usuario. Se puede hacer desde github u otros medios de transferencia en este ejemplo utilizo scp que permite transmitir archivos de forma segura mediante ssh.

scp -r /home/davy/Documentos/DSWEB/Portafolio/django_portfolio adaminerweb@145.222.166.223:/home/adaminerweb

6. Creación y Activación del Entorno Virtual

se crea un entorno virtual para el proyecto python -m venv venv

y se activa el entorno virtual con el comando source venv/bin/activate ![[2024-12-03_12-10.png]]

7. Instalación de Requisitos del Proyecto

se instalan las dependencias necesarias. pip install -r requirements.txt

Configuración de producción

8. Configuración de Django para Producción

Desactivamos el modo de desarrollo para esto cambiamos la constante DEBUG a False en el settings.py

Se agrega la configuración para archivos estáticos.

STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

ejecutamos el comando python manage.py collectstatic

9. Configuración de ASGI

activamos la configuración ASGI en Django.

en el settings.py agregamos la constante ASGI_APPLICATION

ASGI_APPLICATION = "{nombre_proyecto}.asgi.application"

12. Configuración de base de datos MySQL

Primero instalamos pip install mysqlclient

En settings.py se cambia la configuración de la base de datos.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Django',
        'USER': 'adaminerweb',
        'PASSWORD': 'Unacontraseñasegura',
        'HOST': 'localhost',  
        'PORT': '3306',       
    }
}

y ejecutamos las migraciones python manage.py migrate

11. Instalación de uvicorn

se instala uvicorn. para manejar grandes cantidades de tráfico y conexiones concurrentes. python -m pip install uvicorn

12. Instalación y Configuración de Supervisor

se instala supervisor para asegurarse de que la aplicación se mantenga ejecutándose en producción. sudo apt install supervisor

habilitamos el servicio

sudo systemctl enable supervisor
sudo systemctl start supervisor

Se verifica el estado con supervisorctl status

lo que sigue es crear un archivo de configuración en la ruta /etc/supervisor/conf.d/ de nombre uvicorn.conf

[program:uvicorn]
command=/home/davy/Documentos/DSWEB/Portafolio/ven/bin/uvicorn django_portfolio.asgi:application --host 127.0.0.1 --port 8000 --log-level info
directory=/home/davy/Documentos/DSWEB/Portafolio/django_portfolio
user=adaminerweb
autostart=true
autorestart=true
stdout_logfile=/home/davy/Documentos/DSWEB/Portafolio/uvicorn.log
stderr_logfile=/home/davy/Documentos/DSWEB/Portafolio/uvicorn_error.log
process_name=%(program_name)s_%(process_num)02d

reiniciamos nuevamente el servicio.

sudo systemctl restart supervisor

Si revisamos el archivo uvicorn_error.log comprobaremos si el servidor empezó a andar

debería aparecer algo así

INFO:     Started server process [136997]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

13. Configuración de Nginx

Configuramos Nginx para servir archivos estáticos, de medios y hacer proxy al servidor Uvicorn:

en la ruta /etc/nginx/sites-avilable vamos a crear un archivo con el nombre de la aplicación

se configura el puerto que escucha y server_name donde debe ir el nombre de dominio

server {
    listen 80;
    server_name dominio.com www.dominio.com;

se desactiva el log de cualquier solicitud favicon.ico

    location = /favicon.ico {access_log off; log_not_found off; }

se agregan las rutas en donde se deben buscar los estáticos y los medios

    location /static/ {
        root /home/webadmin/django_portfolio;
    }

    location /media/ {
        root /home/webadmin/django_portfolio;
    }

Por ultimo se agrega a el archivo la configuración del proxy.


    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }


}

reiniciamos nginx y probamos acceder a la web.

14. Certificado SSL con Let's Encrypt

Por ultimo agregamos el certificado ssl con Let's Encrypt por su facilidad y accesibilidad https://certbot.eff.org/

Para instalarlo se usara el comando sudo apt install certbot python3-certbot-nginx

la ventaja mas grande de esta herramienta es que automatiza el proceso de configuración de el certificado ssl.

como en este caso se esta usando nginx se va a ejecutar el comando certbot --nginx

Una vez ejecutado la primera vez nos va a pedir una cuenta de correo para avisar si el certificado se esta acabando.

Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: dominio.com
2: www.dominio.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

este detectara los dominios que configuramos con nginx, se puede elegir uno en especifico o ambos.

Requesting a certificate for dominio.com and www.dominio.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/dominio.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/dominio.com/privkey.pem
This certificate expires on 2025-03-06.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for dominio.com to /etc/nginx/sites-enabled/django_app
Successfully deployed certificate for www.dominio.com to /etc/nginx/sites-enabled/django_app
Congratulations! You have successfully enabled HTTPS on https://NOMBREDOMINIO.com and https://www.NOMBREDOMINIO.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Protegiendo el VPS de Ciberataques

15. Configuración del firewall

se instala ufw apt install ufw -y

se agrega a la configuración nginx ufw allow 'Nginx Full'

se agrega ssh ufw allow OpenSSH

se activa el firewall ufw enable

16. Instalación y configuración de Fail2Ban

Fail2Ban permite proteger el servidor contra ataques de fuerza bruta

para instalarlo apt install fail2ban

vamos al directorio /etc/fail2ban/. Allí encontraremos un archivo llamado jail.conf lo vamos a copiar y cambiar el nombre a .local

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

en el archivo debemos bajar hasta la sección sshd y agregar lo siguiente

[sshd]
enabled = true 
port = ssh 
logpath = /var/log/auth.log 
backend = systemd

Fail2Ban almacena sus registros en el archivo /var/log/fail2ban.log. Se revisa este archivo para ver detalles de las acciones de Fail2Ban.

y con el comando sudo fail2ban-client status veremos que este funcionando.

Status
|- Number of jail:  1
`- Jail list:   sshd, mysqld-auth

esta es toda la configuración del servidor en un script de automatización. [PROXIMAMENTE EL github del script]