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.
- Instalar y habilitar firewalld:
1 2 3
sudo dnf install firewalld -y sudo systemctl enable firewalld sudo systemctl start firewalld
- 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
- 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
- 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.
- Instalar Fail2Ban:
1 2
dnf install epel-release -y dnf install fail2ban -y
- Habilitar y verificar el servicio:
1 2
systemctl enable fail2ban.service systemctl status fail2ban.service
- 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
- 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. - Inserta lo siguiente:
- Reiniciar Fail2Ban y verificar:
1 2 3 4
fail2ban-client status sshd fail2ban-client status service fail2ban restart fail2ban-client status sshd
- 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
Instalar y actualizar repositorios:
1 2
sudo dnf install epel-release sudo dnf upgrade
Instalar snapd:
1
sudo yum install snapd
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
Instalar y actualizar el core de snap:
1 2
snap install core snap refresh core
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
Instalar el plugin DNS:
1
snap install certbot-dns-cloudflare
Crear el archivo de configuración para el token:
1 2 3
mkdir -p ~/.secrets/certbot cd ~/.secrets/certbot nano init-cloudflare.ini
Agregar la siguiente línea al archivo
init-cloudflare.ini
:1
dns_cloudflare_api_token = token
Asegurar permisos de acceso al archivo:
1
chmod 600 init-cloudflare.ini
2.4 Generar certificados SSL con Certbot y el plugin Cloudflare
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
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
- Lo siguiente generará un archivo
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
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
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
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
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.
- Opciones adicionales:
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
Monitorear procesos:
1
pm2 monit
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.
- El comando
Reiniciar el servidor para verificar el inicio automático:
1
sudo reboot
6.3 Configuración de PM2 para tareas programadas
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, }, ], }
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.