Realizar autoassinatura com Nginx e rejeitar comunicação HTTP/HTTPS para endereços IP brutos no nível L7 (Camada de Aplicação)
Olá.
Embora não seja necessário gerenciar conscientemente alguns domínios com servidores DNS como o unbound em meio à proliferação de serviços de computação de borda, isso ainda é necessário para algumas pessoas.
Por exemplo, para alguém como eu que auto-hospeda um servidor de e-mail capaz de enviar e receber, o unbound pode ser instalado como uma dependência para algo como o OpenDKIM.
E assim, endereços IP brutos expostos publicamente podem se tornar uma vulnerabilidade para ataques DDoS, e o acesso direto por IP bruto não é bom para a saúde mental, então decidi bloqueá-los.
Bem, é possível bloquear ataques DDoS com o Fail2ban, mas parece que ele gerencia inserindo IPs de destino a serem bloqueados em um banco de dados com base nos logs, o que pode facilmente levar a uma alta carga. Se for para usar o Fail2ban, que seja por domínio. Portanto, para IPs brutos que não são normalmente usados, desta vez usarei um método diferente e os protegerei da comunicação HTTP/HTTPS no lado do Nginx.
Ao bloquear apenas a comunicação HTTP
No meu caso, o endereço IP público global é o seguinte, então fica assim.
# Comunicação HTTP
server {
listen 80;
listen [::]:80;
server_name 167.179.75.206;
return 444;
}
No entanto, no caso da comunicação SSL, o Nginx se torna um listener HTTPS ao indicar explicitamente que é uma comunicação SSL, como em listen 443 ssl;.
E então, se você colocar isso na seção http e executar nginx -t...
# Comunicação HTTPS
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name 167.179.75.206;
# Rejeitar acesso ao endereço IP
return 444;
}
O que acontece?
# 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
Isso mesmo, como é comunicação SSL, ele reclama que não há chave.
Nesses casos, é necessária uma autoassinatura... Você tem que dizer "Sou eu! Sou eu!" e apresentar "Este é o meu certificado lol". Eu vou provar a mim mesmo, agora, aqui...
Então, OpenSSL, você pode fazer algo a respeito?
Vamos usar o poder do OpenSSL para realizar este certificado "ore ore" (autoassinado)...
Embora não possa negar a sensação de confiar a próxima era ao LibreSSL, que se ramificou do OpenBSD, parece que levará algum tempo para que se generalize.
Por enquanto, como só eu o usarei, vou defini-lo para 3 anos.
openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout /usr/local/etc/nginx/selfsigned.key -out /usr/local/etc/nginx/selfsigned.crt
Então, se você prosseguir sem digitar nada no prompt, a chave será gerada no destino de exportação especificado.
Nginx, estou de volta!
Vamos especificar esta chave no Nginx.
# Comunicação HTTPS
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name 167.179.75.206;
# Especificação do certificado autoassinado e da chave privada
ssl_certificate /usr/local/etc/nginx/selfsigned.crt;
ssl_certificate_key /usr/local/etc/nginx/selfsigned.key;
return 444;
}
E assim funcionou.
Fim.