Quando montamos um servidor com Linux e queremos gerenciá-lo da internet através do controle remoto SSH, pode acontecer que passemos a receber ataques com o objetivo de entrar no sistema e poder controlá-lo para seus fins. Esses ataques geralmente são realizados por programas de computador (bots) que por muito tempo tentam acessar o sistema por meio de força bruta.
Em posts anteriores, falei sobre como configurar o serviço SSH, mas alguns bots avançados não entram no serviço, mas podem matar o serviço SSH no servidor desabilitando o acesso remoto.
Manual completo de SSH (Secure Shell)
Podemos evitá-lo usando o ferramenta fail2ban, é muito prático e oferece uma grande margem de segurança. Para explicar um pouco como funciona. É capaz de criar iptables antes de qualquer tentativa de login com falha por mais de 5 vezes consecutivas, rejeitando qualquer tipo de conexão uma vez que seja banida.
Instalar Fail2ban
A instalação pode ser feita diretamente do apt. Primeiro atualizamos o sistema e depois instalamos o Fail2ban.
apt-get update && apt-get -y upgrade
apt-get install fail2banIsso não apenas instala o programa, mas também o deixa em execução e iniciando com o sistema.
Configurando Fail2ban
O serviço Fail2ban tem suas configurações no diretório / etc / fail2ban. Você tem algumas opções pré-configuradas no jail.conf, o melhor neste caso é copiar o arquivo e não fazer as modificações diretamente nele, ao atualizar o fail2ban esses arquivos são sobrescritos e você pode perder todas as alterações feitas anteriormente.
Nesse caso, copiamos o arquivo e o nomeamos jail.local para que ele possa localizá-lo.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localDepois de copiado, podemos abri-lo e ver como funciona.
vim /etc/fail2ban/jail.localDentro do arquivo, temos vários parâmetros que podemos ajustar. Qualquer parâmetro que esteja sob a tag [DEFAULT] será aplicado a todos os serviços habilitados pelo Fail2ban como SSH, NGINX, APACHE, chamaremos isso de global, então teremos seções específicas para cada serviço.
Começaremos adicionando parâmetros à seção global.
ignoreip = 127.0.0.1Adicionamos nosso host local desta forma, ele irá ignorar todo o tráfego local, podemos adicionar endereços adicionais separando-os por um espaço.
bantime = 600O bantime é o período de tempo que o cliente ficará banido após ser bloqueado. A unidade está em segundos, 600 segundos seriam 10 minutos é o valor padrão.
findtime = 600 maxretry = 3Então temos findtime e maxretry. Eles são responsáveis por estabelecer as condições para que um cliente seja banido por padrão, pode-se ler que qualquer usuário com mais de 3 tentativas falhadas em menos de 10 minutos será banido.
destemail = root @ localhost sendername = Fail2Ban mta = sendmailSe quisermos criar alertas para usuários banidos, estes 3 parâmetros são necessários, definiremos o destino para quem enviaremos o e-mail de alerta, quem será o encarregado de enviá-lo e finalmente o mta para definir qual serviço de e-mail usaremos .
ação = $ (ação_) sAqui, definiremos qual ação tomar quando um banimento for necessário. O valor action_ é a ação padrão baseada na rejeição de qualquer tráfego do cliente até que o tempo de proibição expire.
Se quisermos enviar um alerta por e-mail, devemos alterar o valor para action_mw, mas se também quisermos anexar linhas do log no corpo do e-mail, usaremos action_mwl. Devemos ter certeza de que as configurações de e-mail estão corretas antes de alterar este valor.
Configurações por serviço
Assim que as configurações globais forem concluídas, adicionaremos os parâmetros que serão aplicados exclusivamente ao
Serviço SSH, certificamo-nos de adicionar as opções sob a tag [SSH].
ativado = verdadeiroPor padrão, o serviço SSH está habilitado, mas podemos modificá-lo se necessário nesta opção.
Toda esta seção poderia funcionar com os valores que detalharei posteriormente, mas você pode modificar para adaptá-la às suas necessidades ou deixar todos como padrão.
Outra das configurações são os filtros que indicam se o login estava correto ou não e podem ser adicionados para outros serviços, por exemplo temos um servidor com nginx e uma parte da página é protegida por senha, mas um cliente está atacando com força bruta , podemos parar isso adicionando o seguinte na tag [nginx-http-auth].
[nginx-http-auth] enabled = true filter = nginx-http-auth port = http, https logpath = /var/log/nginx/error.logAgora, se um usuário tiver mais de 3 tentativas de login malsucedidas, isso será refletido nos logs e o fail2ban agirá e bloqueará todo o tráfego do usuário.
Ambiente de teste
Depois de entender o básico, faremos um pequeno ambiente de teste onde protegeremos SSH e Nginx através do Fail2ban criando uma política de banimento que nos notificará do IP que foi banido.
Vamos instalar o Nginx primeiro, se não estiver instalado
apt-get install nginxvamos instalar um serviço de e-mail para notificações pode ser sendmail
apt-get install sendmailfinalmente, queremos que nosso iptables seja persistente após uma inicialização, podemos criar um script rc.0 ou instalar o pacote iptables-persistent.
apt-get install iptables-persistentEle será instalado.
Estabelecendo nosso Firewall
Depois de instalar o acima, precisamos implementar um firewall para que ele possa bloquear o tráfego. Vou criar um firewall básico em posts posteriores irei falar mais sobre iptables.
Permitiremos conexões estabelecidas, tráfego de servidor, como atualizações, e tráfego destinado às portas SSH e Nginx. Todo o tráfego restante será negado.
sudo iptables -A ENTRADA -i lo -j ACEITAR sudo iptables -A ENTRADA -m conntrack --ctstate ESTABELECIDO, RELACIONADO -j ACEITAR sudo iptables -A ENTRADA -p tcp --dport 22 -j ACEITAR sudo iptables -A ENTRADA -p tcp --dport 80 -j ACEITAR sudo iptables -A INPUT -j DROPPodemos ver as mudanças com:
iptables -SDeve dar um resultado semelhante.
-P ENTRADA ACEITAR -P AVANÇAR ACEITAR -P SAÍDA ACEITAR -N fail2ban-ssh -A ENTRADA -p tcp -m multiporta --dportas 22 -j fail2ban-ssh -A ENTRADA -i lo -j ACEITAR -A ENTRADA -m conntrack --ctstate RELACIONADO, ESTABELECIDO -j ACEITAR -A ENTRADA -p tcp -m tcp --dport 22 -j ACEITAR -A ENTRADA -p tcp -m tcp --dport 80 -j ACEITAR -A ENTRADA -j DROP -A fail2ban -ssh -j RETURN
Ajustando as configurações de Fail2ban
Agora devemos configurar o arquivo jail.local conforme nossa conveniência.
vi /etc/fail2ban/jail.localPodemos estender o tempo de banimento de um usuário por pelo menos 30 minutos, lembre-se de definir o valor em segundos.
bantime = 1800Devemos configurar um email que receba todos os alertas de banimento fail2ban, vamos procurar o valor do email no arquivo e colocar o email.
destemail = [email protected]Podemos mudar o remetente que enviará o alerta que normalmente coloco com o nome fail2ban para que possamos filtrar melhor entre todos os logs.
Depois que devemos mudar o valor da ação, temos 2 opções:
- action_mw: envia um alerta com relatório semelhante ao comando whois do cliente banido.
- action_mwl: envie um alerta muito mais detalhado incluindo um log no corpo da mensagem.
Neste, usaremos a segunda opção:
ação =% (action_mwl) sEm seguida, iremos para a seção [SSH] e podemos editar o número máximo de tentativas antes do banimento, deixaremos em 5:
maxretry = 5Se tivermos o serviço SSH em uma porta diferente de 22, o que é altamente recomendado, devemos mencionar sua porta.
porta = 45024Em seguida, procuraremos a tag [nginx-http-auth] e deixaremos como está.
[nginx-http-auth] ativado = verdadeiroTerminamos e podemos salvar e fechar o arquivo.
Reiniciando o serviço Fail2ban
Para todas as mudanças a serem aplicadas, recomendo interromper o serviço.
parada fail2ban de serviçoEntão podemos iniciá-los novamente
serviço fail2ban startIsso vai demorar um pouco, depois de cerca de 5 minutos, podemos ver nossas regras novamente com
iptables -S
-P ENTRADA ACEITAR -P AVANÇAR ACEITAR -P SAÍDA ACEITAR -N fail2ban-nginx-http-auth -N fail2ban-ssh -A ENTRADA -p tcp -m multiport --porta 80.443 -j fail2ban-nginx-http-auth -A ENTRADA -p tcp -m multiport --dports 22 -j fail2ban-ssh -A ENTRADA -i lo -j ACEITAR -A ENTRADA -m conntrack --ctstate RELACIONADO, ESTABELECIDO -j ACEITAR -A ENTRADA -p tcp -m tcp - -dport 22 -j ACEITAR -A ENTRADA -p tcp -m tcp --dport 80 -j ACEITAR -A ENTRADA -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURNVemos como fail2ban adicionou novas políticas, podem variar dependendo da configuração que você definiu em /etc/fail2ban/jail.local.
ConclusõesInstalamos o fail2ban e configuramos para trabalhar com SSH e NGINX no caso do APACHE devemos mudar os rótulos e o diretório dos logs mas é muito parecido com o nginx. Configuramos apenas o básico, você pode criar filtros e regras muito mais avançadas, recomendo ler um pouco a página de manual deles, os arquivos de configuração são bem comentados, recomendo ir aos poucos descobrir todas as suas funções.
Gostou e ajudou este tutorial?Você pode recompensar o autor pressionando este botão para dar a ele um ponto positivo