Executamos uma pilha LAMP do CentOS Linux versão 7.4 com Apache 2.4. Em um painel de monitoramento, acompanho várias métricas de desempenho, e uma delas é "solicitações de host inválidas", em que o host virtual não corresponde ao do nosso servidor.
Manualmente, eu uso o arin.net para procurar solicitações de host inválidas. Como a natureza do nosso negócio é nos EUA, apenas no mercado interno, bloqueamos intervalos de IP estrangeiros que nos visitam sem o nome de host virtual adequado. Fazemos isso usando 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 aquele tráfego "farejador" do exterior. .
Quase de repente, nas últimas 2 semanas, começamos a receber de 3 a 6 solicitações por dia de Chicago IL, Amazon AWS (Seattle WA), 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 proteger contra (bloquear totalmente o mais cedo possível) solicitações para o servidor que não possuem o host virtual único e adequado ?
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
Vou procurar escrever uma regra para isso - não posso 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 é escrito de uma forma que exige isso ser verdade).
atualizar
fail2ban não funcionará, pois eles atingem o servidor apenas uma vez com cada endereço IP - eles não os reutilizam. deixe-me afirmar que identifiquei efetivamente o tráfego na linha 2 do aplicativo da web. agora, estou enviando a eles um status 200 com um número aleatório, muito pequeno, muito rápido. mas preciso de uma maneira de "encobrir" o servidor, de alguma forma simplesmente não responder de uma forma que não coloque nenhuma carga real no servidor.
Ok, fail2ban não funciona porque as solicitações ofensivas usam um endereço IP diferente a cada vez. As respostas 200, 403, 404 exigem que a solicitação do apache ocupe os recursos do servidor.
Percebendo que eu queria apenas "desligar a chamada" e fazer com que o apache simplesmente parasse de falar com o solicitante, descobri que a instalação do mod_security permite que o apache seja configurado para descartar todas as solicitações que correspondam ao host virtual do ip do servidor. Instalar o mod_security no centos 7 foi fácil:
Em seguida, coloco essas linhas na diretiva de host virtual em que ServerName é o endereço IP do host:
No firefox, acessar o servidor por ip agora fica assim:
...boa sorte tentando de novo!
nos logs do servidor, o drop está sendo registrado:
em outras palavras, ou você sabe meu nome de host ou pode falar com o ban
O fail2ban tem várias regras para bloquear endereços IP que escaneiam ou tentam fazer coisas ruins nos
apache
servidores, e você pode escrever suas próprias regras (por exemplo, para corresponder a "solicitações de host ruins" nos logs de erro do apache) ou adicionar às existentes.fail2ban
está disponível pré-empacotado para a maioria das distribuições Linux.Eu configuraria um novo host virtual abrangente (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 aqui, configure
fail2ban
para monitorar os logs desse host abrangente.