Entrada

Configuraciones adicionales

Configuraciones adicionales

Introducción

En este artículo se recopilan diversas configuraciones adicionales que te ayudarán a mejorar la seguridad y el manejo de procesos en tu servidor. Veremos la instalación de Certbot para gestionar certificados SSL, la configuración de PM2 para la administración de procesos Node.js, la instalación de Node.js y la aplicación de reglas de firewall para puertos HTTP/HTTPS. Además, se muestra cómo configurar PM2 para tareas programadas.

Recuerda ejecutar los comandos de uno en uno y verifica que no haya errores en la salida. No es mi culpa si no te sale bien por no seguir las instrucciones btw :/

Si las seguiste correctamente y no te sale bien, puedes dejar un comentario abajo de la publicación :P


1. Configuración de Firewall y Fail2Ban

Nota: Antes de realizar cualquier cambio en la configuración de firewall, asegúrate de tener acceso al servidor mediante SSH por el puerto default o 22, realizar estos ajustes antes de configurar los puertos de SSH personalizados y de contar con un usuario con permisos de administrador para evitar bloqueos en el acceso al servidor.

1.1 Firewall

Firewalld es un sistema de gestión de firewall dinámico que permite configurar reglas de filtrado de paquetes en tiempo real. A continuación, se muestra cómo instalar y configurar firewalld para proteger tu servidor.

  1. Instalar y habilitar firewalld:
    1
    2
    3
    
    sudo dnf install firewalld -y
    sudo systemctl enable firewalld
    sudo systemctl start firewalld
    
  2. Remover servicios por defecto:
    1
    2
    3
    
    sudo firewall-cmd --zone=public --remove-service=cockpit --permanent
    sudo firewall-cmd --zone=public --remove-service=ssh --permanent
    sudo firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
    
  3. Agregar servicios personalizados:
    1
    2
    3
    
    sudo firewall-cmd --zone=public --add-port={port}/tcp --permanent
    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --zone=public --add-service=https --permanent
    
  4. Recargar reglas y verificar:
    1
    2
    3
    
    sudo firewall-cmd --reload
    sudo firewall-cmd --state
    sudo firewall-cmd --list-all
    

1.2 Añadir Fail2Ban

Fail2Ban es un sistema de prevención de intrusiones que protege tu servidor de ataques de fuerza bruta. A continuación, se muestra cómo instalar y configurar Fail2Ban para proteger el servicio SSH.

Más información sobre Fail2Ban.

  1. Instalar Fail2Ban:
    1
    2
    
    dnf install epel-release -y
    dnf install fail2ban -y
    
  2. Habilitar y verificar el servicio:
    1
    2
    
    systemctl enable fail2ban.service
    systemctl status fail2ban.service
    
  3. Configurar Fail2Ban, copiando un archivo como respaldo y dirigiendote a la carpeta jail.d:
    1
    2
    3
    
    cd /etc/fail2ban
    cp jail.conf jail.local
    cd jail.d
    
  4. Editar el archivo de configuración para sshd:
    1
    
    nano sshd.conf
    
    • Inserta lo siguiente:
      1
      2
      3
      4
      5
      6
      7
      8
      
      [sshd]
      enabled = true
      filter = sshd
      port = {puerto_ssh}
      bantime = 21600
      maxretry = 3
      ignoreip = 127.0.0.1
      logpath = /var/log/auth.log
      

    Tambien se puede incluir una configuración para el puerto 80 pero no es recomendable.

  5. Reiniciar Fail2Ban y verificar:
    1
    2
    3
    4
    
    fail2ban-client status sshd
    fail2ban-client status
    service fail2ban restart
    fail2ban-client status sshd
    
  6. Para desbanear una IP:
    1
    
    sudo fail2ban-client set sshd unbanip {remote-ip-address}
    

2. Instalación de Certbot para certificados SSL

Certbot es una herramienta de código abierto que automatiza la obtención de certificados SSL/TLS para tu servidor web. En este caso, se instalará Certbot con el plugin DNS de Cloudflare para gestionar los certificados SSL mediante la API de Cloudflare.

Más información sobre Certbot y Cloudflare.

Configuración de Certbot con Cloudflare.

Tutorial Certbot.

2.1 Instalar snapd

  1. Instalar y actualizar repositorios:

    1
    2
    
    sudo dnf install epel-release
    sudo dnf upgrade
    
  2. Instalar snapd:

    1
    
    sudo yum install snapd
    
  3. Habilitar el socket de snapd y crear enlace simbólico:

    1
    2
    
    systemctl enable --now snapd.socket
    ln -s /var/lib/snapd/snap /snap
    

2.2 Configurar e instalar Certbot con Snap

  1. Instalar y actualizar el core de snap:

    1
    2
    
    snap install core
    snap refresh core
    
  2. Instalar Certbot en modo clásico y crear enlace simbólico:

    1
    2
    3
    
    snap install --classic certbot
    ln -s /snap/bin/certbot /usr/bin/certbot
    snap set certbot trust-plugin-with-root=ok
    

2.3 Instalar el plugin DNS para Cloudflare y configurar token

  1. Instalar el plugin DNS:

    1
    
    snap install certbot-dns-cloudflare
    
  2. Crear el archivo de configuración para el token:

    1
    2
    3
    
    mkdir -p ~/.secrets/certbot
    cd ~/.secrets/certbot
    nano init-cloudflare.ini
    
  3. Agregar la siguiente línea al archivo init-cloudflare.ini:

    1
    
    dns_cloudflare_api_token = token
    
  4. Asegurar permisos de acceso al archivo:

    1
    
    chmod 600 init-cloudflare.ini
    

2.4 Generar certificados SSL con Certbot y el plugin Cloudflare

  1. Ejecutar Certbot para obtener los certificados:

    1
    
    certbot certonly --dns-cloudflare --preferred-challenges dns --dns-cloudflare-credentials ~/.secrets/certbot/init-cloudflare.ini -d domain.com -d admin-domain.com -d api-domain.com
    

2.5 Configurar parámetros SSL adicionales

  1. Generar parámetros Diffie-Hellman:

    • Lo siguiente generará un archivo dhparam.pem en la ruta /etc/ssl/certs/ con un tamaño de 2048 bits.
      1
      
      sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
      
  2. Rutas de archivos PEM para la configuración de Nginx:

    • /etc/letsencrypt/live/domain.com/fullchain.pem
    • /etc/letsencrypt/live/domain.com/privkey.pem

3. Instalación de PM2 para manejo de procesos Node.js

PM2 es un administrador de procesos de producción para aplicaciones Node.js con un equilibrio entre características y simplicidad. En este caso, se instalará PM2 globalmente para gestionar la API y tareas programadas.

3.1 Instalar PM2 globalmente

  1. Ejecutar el siguiente comando como root para instalar PM2:

    1
    
    npm install pm2@latest -g
    

4. Instalación y Configuración de Node.js

Node.js es un entorno de ejecución de JavaScript que permite ejecutar código JavaScript en el servidor. En este caso, se instalará Node.js v18 y se aplicarán reglas de firewall para puertos HTTP y HTTPS.

4.1 Seleccionar la versión deseada

  • Comando alternativo (para versiones antiguas):

    1
    2
    
    # curl -fsSL https://rpm.nodesource.com/setup_noversion.x | bash -
    curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -
    

4.2 Instalar Node.js v18

  1. Instalar el repositorio para Node.js v18:

    1
    
    sudo yum install https://rpm.nodesource.com/pub_18.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm -y
    
  2. Instalar Node.js:

    1
    
    sudo yum install nodejs -y --setopt=nodesource-nodejs.module_hotfixes=1
    

5. Reglas de firewall para puertos HTTP y HTTPS (API Digital Ocean)

Ingresa a tu cuenta de Digital Ocean y configura las reglas de firewall para permitir tráfico en los puertos HTTP y HTTPS. A continuación, se muestran las reglas de firewall para permitir tráfico en el puerto 443 utilizando las direcciones IP de Cloudflare y la API de Digital Ocean.

Para este caso se utilizan los firewalls de Digital Ocean como extra de los que ya se tienen con firewalld, pero puedes aplicar estas reglas en cualquier proveedor de servicios en la nube.

Más información sobre Cloudflare-Ipsv4.

Utiliza las siguientes reglas (enviadas a la API de Digital Ocean) para permitir tráfico en el puerto 443:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   {
       "inbound_rules": [
           {
               "protocol": "tcp",
               // "ports": "443", HTTPS
               // "ports": "80", HTTP
               "ports": "443",
               "sources": {
                   "addresses": [
                       "173.245.48.0/20",
                       "103.21.244.0/22",
                       "103.22.200.0/22",
                       "103.31.4.0/22",
                       "141.101.64.0/18",
                       "108.162.192.0/18",
                       "190.93.240.0/20",
                       "188.114.96.0/20",
                       "197.234.240.0/22",
                       "198.41.128.0/17",
                       "162.158.0.0/15",
                       "172.64.0.0/13",
                       "131.0.72.0/22",
                       "104.16.0.0/13",
                       "104.24.0.0/14"
                   ]
               }
           }
       ]
   }

6. Configuración de PM2 para la API y tareas programadas

6.1 Arrancar la API con PM2

  1. Iniciar la API con opciones de reinicio y límite de memoria:

    1
    
    pm2 start server.js --name=api --max-memory-restart 256M -i 1
    
    • Opciones adicionales:
      • --name=api: Nombre del proceso.
      • --max-memory-restart 256M: Límite de memoria para reiniciar.
      • -i 1: Número de instancias.
      • -i max: Múltiples CPUs.
  2. Para múltiples CPUs:

    1
    
    pm2 start server.js --name=api --max-memory-restart 768M -i max
    

6.2 Monitorear y configurar el arranque en reinicios

  1. Monitorear procesos:

    1
    
    pm2 monit
    
  2. Configurar PM2 para iniciar automáticamente en reinicios:

    • El comando pm2 startup generará un script de inicio para el sistema operativo. Deberas seguir las instrucciones del comando para configurar el inicio automático. Esto solo es un ejemplo de cómo se vería el comando:
      1
      2
      3
      4
      5
      
      pm2 startup
      sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u {usuario} --hp /home/{usuario}
      pm2 save
      pm2 update
      pm2 monit
      
    • Definición de parametros:
      • --hp /home/{usuario}: Ruta del directorio del usuario.
      • --uid {usuario}: ID del usuario.
      • --gid {grupo}: ID del grupo.

    En caso de que el pm2 se reinicie automáticamente, se debe ejecutar el comando pm2 save para guardar la configuración.

    Si se actualiza PM2, se debe ejecutar el comando pm2 update para actualizar la configuración.

    Verifica el estado de los procesos con pm2 monit.

    Puedes consultar la documentación de PM2 para más información.

  3. Reiniciar el servidor para verificar el inicio automático:

    1
    
    sudo reboot
    

6.3 Configuración de PM2 para tareas programadas

  1. Ejemplo de configuración en un archivo JavaScript ecosystem.config.js:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    module.exports = {
      apps: [
        {
          name: "scheduler",
          script: "npm",
          args: "start:scheduler",
          interpreter: "none",
          watch: false,
          max_memory_restart: "256M",
          instances: 1,
        },
      ],
    }
    
  2. Ejecutar el siguiente comando para iniciar la tarea programada:

    1
    
    pm2 start ecosystem.config.js
    

7. Algunas configuraciones adicionales de NGINX

7.1 Archivo nginx para el Front-End (Angular compilado)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
server {
  listen 80 default_server;
  server_name dominio;
  return 301 https://dominio$request_uri;
}

server {
    listen 443 ssl http2;
    server_name  dominio.com.com;
    ssl_certificate /etc/letsencrypt/live/dominio.com.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dominio.com.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers 
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

    charset utf8;
    access_log  /var/log/nginx/admin.log  main;
  
    proxy_hide_header X-Powered-By;
    server_tokens off;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
  
    ## Start: Size Limits & Buffer Overflows ##
    client_body_buffer_size  1K;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 4 16k;
    ## END: Size Limits & Buffer Overflows ##
  
    location / {
        root    /user/www/user;
        index  index.html;
        try_files $uri $uri/ /index.html;
    }
}

7.1 Archivo nginx para el Back-End (Node.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
upstream name_project {
    server 127.0.0.1:3030;
    keepalive 64;
}

server {
  listen 80;
  server_name dominio;
  return 301 https://dominio$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    server_name  utecan.titulaciondigital-ut.mx;
    ssl_certificate /etc/letsencrypt/live/dominio/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dominio/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

  root	/user/www/proyecto;

    access_log  /var/log/nginx/proyecto.log  main;
    error_log /var/log/nginx/proyecto.error.log;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;
    charset utf-8;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_pass http://name_project/;
        proxy_redirect off;
        proxy_read_timeout 240s;

        proxy_buffering off;
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;

        proxy_hide_header X-Powered-By;
        server_tokens off;
    }

    location ~ /\.git {
        deny all;
    }

    if ($host != "dominio") {
      return 404;
    }
}

Conclusión

Con estas configuraciones adicionales has instalado y configurado Certbot para gestionar certificados SSL mediante Cloudflare, instalado PM2 y Node.js para el manejo de procesos, y aplicado reglas de firewall para proteger tu servidor. Además, se incluye un ejemplo para la ejecución de tareas programadas con PM2.

Cualquier duda o comentario, agregarla en la sección de comentarios abajo de cada publicación.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.