Protege contra solicitações incorretas de virtualhost no centos / apache

0

Nós executamos uma pilha LAMP do CentOS Linux versão 7.4 com o Apache 2.4. Em um painel de monitoramento, acompanho várias métricas de desempenho, e uma delas é "solicitações de host ruins", em que o host virtual não corresponde ao do nosso servidor.

Manualmente, eu uso o arin.net para procurar por solicitações ruins de host. Como a natureza do nosso negócio é EUA, apenas para uso doméstico, bloqueamos intervalos de IPs externos que nos visitam sem o nome de host virtual adequado. Fazemos isso usando o iptables; o seguinte é uma amostra disso, fwiw.

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  187.0.0.0/8          anywhere             /* montevideo uruguay */
DROP       all  --  177.0.0.0/8          anywhere             /* vmontevideo uraguay */
DROP       all  --  164.77.0.0/16        anywhere             /* montevideo uraguay */
DROP       all  --  78-0-0-0.adsl.net.t-com.hr/8  anywhere             /* amsterdam */

Isso é eficaz para desacelerar todo o tráfego "sniffer" do exterior. .

Quase de repente, nas últimas duas semanas, começamos a receber de 3 a 6 solicitações por dia que são da Chicago IL, da Amazon AWS (Seattle WA), da Fremont CA e etc.

Aqui estão algumas entradas de log do access_log do apache:

./myurl.com-access.log:23.20.12.111 - - [16/Jan/2018:00:16:21 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-access.log:23.20.54.152 - - [16/Jan/2018:08:10:03 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-access.log-20180114:23.20.12.111 - - [13/Jan/2018:08:07:44 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-ssl-access.log:74.82.47.3 - - [14/Jan/2018:07:20:31 -0600] "GET / HTTP/1.1" 200 21 "-" "-"
./myurl.com-ssl-access.log:108.178.61.58 - - [15/Jan/2018:06:40:17 -0600] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:184.154.189.90 - - [15/Jan/2018:07:54:29 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:108.178.61.58 - - [16/Jan/2018:06:16:45 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:184.154.189.90 - - [16/Jan/2018:06:51:18 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:74.82.47.3 - - [16/Jan/2018:07:28:43 -0600] "GET / HTTP/1.1" 200 20 "-" "-"
./myurl.com-ssl-access.log-20180114:74.82.47.3 - - [08/Jan/2018:06:25:14 -0600] "GET / HTTP/1.1" 302 - "-" "-"

Quais métodos estão disponíveis para proteção contra (bloquear imediatamente o mais cedo possível) solicitações ao servidor que não possuem o único virtualhost apropriado ?

Em resposta a uma solução que fail2ban pode ajudar, verifiquei e o fail2ban está em execução:

$ ps aux | grep fail2ban
root      2824  0.0  0.0 368832 53632 ?        Sl    2017  17:44 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b

Eu vou procurar escrever uma regra para isso - não posso me dar ao luxo de bloquear o tráfego que é legítimo - é seguro assumir que nenhum tráfego válido solicitará o host sem o virtualhost (certamente o aplicativo da Web está escrito de uma maneira que exige que isso seja verdade).

atualizar

O fail2ban não funcionará, pois eles só acessam o servidor uma vez com cada endereço IP - eles não são reutilizados. deixe-me afirmar que identifiquei efetivamente o tráfego na linha 2 do aplicativo da web. agora, estou enviando um status 200 com um número aleatório, muito pequeno, muito rápido. mas eu preciso de uma maneira de "encobrir" o servidor, de alguma forma simplesmente não responder de uma forma que não coloque qualquer carga real no servidor.

    
por WEBjuju 16.01.2018 / 16:30

3 respostas

2

Ok, o fail2ban não funciona porque as solicitações incorretas usam um endereço IP diferente a cada vez. Todas as respostas 200, 403 e 404 exigem que o pedido do apache ocupe recursos do servidor.

Percebendo que eu queria apenas "desligar a chamada" e ter o apache simplesmente parando de falar com o solicitante, consegui descobrir que a instalação de mod_security permite que o apache seja configurado para soltar tudo solicitações que correspondem ao host virtual do servidor ip. Instalar mod_security no centos 7 foi uma brisa:

sudo yum install mod_security

Em seguida, eu coloco essas linhas na diretiva do host virtual, onde o ServerName é o endereço IP do host:

<VirtualHost *:80>
    ServerName 1xx.1xx.1xx.1xx

    SecRuleEngine On
    SecRule REMOTE_ADDR "^\d" "log,drop,phase:1,id:111,msg:'dropped bad host request'"
    ...

No firefox, o acesso ao servidor pelo ip agora se parece com isto:

...boasortetentandodenovo!

noslogsdoservidor,aquedaestásendoregistrada:

#tail-f1xx.1xx.1xx.1xx-error.log[ThuJan1818:51:00.3571132018][:error][pid41716][client69.137.81.33]ModSecurity:Accessdeniedwithconnectionclose(phase1).Patternmatch"^\\d" at REMOTE_ADDR. [file "/etc/httpd/vhost.d/ipaddyhost.conf"] [line "8"] [id "111"] [msg "dropped bad host access request"] [hostname "1xx.1xx.1xx.1xx"] [uri "/"] [unique_id "WmFA@q@5uqLACI9MKaxAAABbfwX"]

em outras palavras, você sabe meu nome de host ou pode falar com o ban

    
por 19.01.2018 / 02:01
1
O

fail2ban tem várias regras para bloquear endereços IP que varrem ou tentam fazer coisas ruins em apache servidores, e você pode escrever seu próprias regras (por exemplo, para coincidir com "maus pedidos de host" nos logs de erro do apache) ou adicionar aos existentes.

fail2ban está disponível pré-empacotado para a maioria das distribuições de linux.

    
por 16.01.2018 / 16:49
0

Eu configuraria um novo host virtual catch-all (ou seja, um padrão para qualquer nome que não corresponda ao seu nome real / configurado). Defina o erro 404 personalizado para redirecionar para o google ou similar e, conforme mencionado por outras pessoas, configure fail2ban para monitorar os registros desse host pega-tudo.

    
por 16.01.2018 / 16:53