Rechazar la comunicación HTTP/HTTPS a IPs directas a nivel de capa de aplicación L7 mediante auto-firma en Nginx

5 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy un inútil.
Con la proliferación de los servicios de computación en el borde, no es necesario configurar servidores DNS como unbound para algunos dominios, pero para algunas personas sigue siendo esencial.
Por ejemplo, para alguien como yo que auto-aloja un servidor de correo que puede enviar y recibir, unbound puede ser incluido como una dependencia, por ejemplo, para OpenDKIM.
Además, las direcciones IP públicas expuestas pueden convertirse en un punto débil para ataques DDoS, y el acceso directo a la IP no es bueno para la salud mental, así que he decidido bloquearlo.

Bueno, aunque es posible bloquear ataques DDoS con Fail2ban, parece que gestiona las IPs a bloquear insertándolas en una base de datos a partir de los registros, lo que puede generar una carga elevada. Si se usa Fail2ban, sería mejor hacerlo por dominio, así que para las IPs directas que no se usan habitualmente, esta vez las protegeré de la comunicación HTTP/HTTPS de otra manera, en el lado de Nginx.

Cuando se bloquea simplemente la comunicación HTTP

En mi caso, mi dirección IP pública global es la siguiente, por lo que queda así.

# Comunicación HTTP
server {
    listen 80;
    listen [::]:80;

    server_name 167.179.75.206;

    return 444;
}

Sin embargo, en el caso de la comunicación SSL, Nginx se convierte en un listener HTTPS al especificar explícitamente que es una comunicación SSL, como en listen 443 ssl;.

Y si se inserta esto en la sección http y se ejecuta nginx -t...

# Comunicación HTTPS
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name 167.179.75.206;

    # Rechazar acceso a la dirección IP
    return 444;
}

¿Qué sucede?

# nginx -t
nginx: [emerg] no "ssl_certificate" is defined for the "listen ... ssl" directive in /usr/local/etc/nginx/nginx.conf:90
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

Así es, como es comunicación SSL, se quejará de que no hay clave.
En estos casos, se necesita una auto-firma... ¡Soy yo! ¡Soy yo! Hay que presentarlo como 'Este es mi certificado, ¿eh?'. Yo me certifico a mí mismo, aquí y ahora...

Así que, OpenSSL, ¿puedes hacer algo al respecto?

Con la ayuda de OpenSSL, vamos a realizar esta auto-firma.
Es innegable la sensación de que la próxima era se confía a LibreSSL, una bifurcación de OpenBSD, pero parece que su generalización llevará bastante tiempo.
Por ahora, como solo lo usaré yo, lo estableceré por 3 años.

openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout /usr/local/etc/nginx/selfsigned.key -out /usr/local/etc/nginx/selfsigned.crt

Luego, si se presiona Enter sin introducir nada, la clave se generará en la ubicación de exportación especificada.

Nginx, estoy de vuelta

Vamos a especificar esta clave en Nginx.

# Comunicación HTTPS
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name 167.179.75.206;

    # Especificación del certificado auto-firmado y la clave privada
    ssl_certificate /usr/local/etc/nginx/selfsigned.crt;
    ssl_certificate_key /usr/local/etc/nginx/selfsigned.key;

    return 444;
}

Y con esto, funcionó.
Fin.

Related Posts