.htaccess bloqueia o acesso quando HTTP_HOST é IP (segurança)

May 31 2018

Eu tive muitos ataques no meu servidor. A maioria começa com uma varredura de vulnerabilidade, seguida por ondas de solicitações POST.

Em breve estarei implementando Cloudflare (WAF e DDos). Isso significa que uma consulta DNS em meu domínio mostrará o endereço IP do Cloudflare, em vez do meu servidor. Portanto, o endereço IP do meu servidor ficará oculto por causa disso.

No entanto, os ataques ainda podem ocorrer passando um por um por todos os IPs possíveis no mundo. Quando vejo os logs do meu servidor, posso ver que isso acontece MUITO. (Tenho 3 IPs vinculados ao meu 1 servidor e os mesmos ataques acontecem em XXX.XXX.XXX.XX1, em seguida, em XXX.XXX.XXX.XX2 e em seguida em XXX.XXX.XXX.XX3)

Meu .htaccess de nível superior se parece com isto:

# deny all POST requests
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} POST
    RewriteRule .* - [F,L]
</IfModule>


# deny unused request types
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} ^(delete|head|trace|track) [NC]
    RewriteRule .* - [F,L]
</IfModule>


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Questões:

  1. O que devo adicionar para que [if HTTP_HOST = XXX.XXX.XXX.XX1 OR HTTP_HOST = XXX.XXX.XXX.XX2 OR HTTP_HOST = XXX.XXX.XXX.XX3] o tráfego seja bloqueado imediatamente?

  2. Posso colocar esse novo código no topo do .htaccess? Irá quebrar o que está lá atualmente?

Respostas

1 MrWhite May 31 2018 at 18:49

Você não precisa verificar o Hostcabeçalho de IPs específicos, apenas verifique se há algum Hostque comece com um dígito. Por exemplo, na parte superior do seu .htaccessarquivo:

RewriteCond %{HTTP_HOST} ^\d
RewriteRule .* - [F]

Você não precisa da Lbandeira com F- está implícito.

Você também não precisa dos <IfModule mod_rewrite.c>invólucros adicionais . Apenas deixe o WordPress como está. (Embora isso também não seja estritamente necessário.)

No entanto, esse tipo de bloqueio deve ser executado idealmente no nível do servidor / host vitual, não em .htaccess. Configure um padrão <VirtualHost>que intercepte essas solicitações de IP indesejáveis.

Por exemplo, supondo que você esteja usando apenas VirtualHosts baseados em nome, você pode configurar um VirtualHost padrão (que deve ocorrer antes de todos os outros VirtualHosts) no formato:

# Catch all other requests for non-specific hosts. eg IP address access
<VirtualHost _default_>
  ServerName default.example.com
  <Location />
  Require all denied
  </Location>
</VirtualHost>

Isso captura todas as solicitações que não são mapeadas para nenhum outro host virtual "nomeado". _default_é simplesmente um apelido para *. Conforme observado acima, este <VirtualHost>contêiner deve ocorrer antes de todos os outros <VirtualHost>contêineres em sua configuração de servidor. O fato de ser definido primeiro é o que o torna o "padrão".

A ServerNamediretiva deve ser definida como qualquer coisa diferente de um nome de servidor real em seu sistema. Ele pode ser omitido, mas o servidor tentará apenas calculá-lo, o que pode não ser confiável.

Isso evita que seus hosts virtuais reais (que atendem ao seu site) tenham que lidar com essas outras solicitações.


# deny all POST requests

Isso parece um pouco extremo! Estou surpreso que seu site ainda funcione.