Quem tem servidor na web tem que deixar uma forma de conexão ativa para seu trabalho diário. Uma dessas formas é o SSH que apesar de ser muito seguro, sofre frequentes tentativas de ataque. Quem olhar o log do linux notará tentativas de acesso de força bruta e também de bots.

Um serviço chamado Fail2ban pode atenuar este problema através da criação de regras que alteram automaticamente sua configuração de firewall com base em um número predefinido de tentativas de login sem sucesso. Isso permitirá que o seu servidor para responder a tentativas de acesso ilegítimos sem intervenção que você precise ficar monitorando.

Neste post vou ensinar como instalar e usar Fail2ban em um servidor CentOS 7.

Instalando Fail2ban no Centos7/RedHat

O fail2ban não está disponível no repositório oficial da RedHat/Centos, nesse caso, devemos usar o respositório EPEL que fornece pacotes extras para linux baseado no RedHat.

$ sudo yum install epel-release

Quando for perguntado para continuar, pressione Y e Enter.

Após instalar o repositório EPEL, você poderá instalar o pacote Fail2ban.

$ sudo yum install fail2ban

Quando a instalação terminar, use o systemctl para habilitar o serviço fail2ban.

$ sudo systemctl enable fail2ban

Vamos a configuração

Os arquivos de configuração ficam em /etc/fail2ban. Nele você irá encontrar um arquivo chamado jail.conf, mas você não deve alterar esse arquivo pois futuros updates do Fail2ban irão sobrescrever esse arquivo. Iremos colocar nossas regras em jail.local. Qualquer configuração colocado em jail.local terá prioridade sobre jail.conf.

jail.conf contem a seção [DEFAULT] seguido dos serviços individuais. jail.local pode sobrepor qualquer um desses valores. Adicionalmente, arquivos no diretório /etc/fail2ban/jail.d/ podem ser usado para sobrescrever configurações em ambos esses arquivos. A regra que o serviço segue é a seguinte

/etc/fail2ban/jail.conf
/etc/fail2ban/jail.d/*.conf, alfabetica
/etc/fail2ban/jail.local
/etc/fail2ban/jail.d/*.local, alfabetica

Qualquer arquivo pode conter uma seção [default], executado pela primeira vez, e pode também conter seções para prisões individuais. O último valor definido para um determinado parâmetro tem precedência.

Vamos começar a escrever uma versão muito simples de jail.local. Abra um novo arquivo usando vim ou seu editor de escolha:

$ sudo vim /etc/fail2ban/jail.local

Coloque as instruções abaixo

[DEFAULT]
# Banir curioso por uma hora
bantime = 3600

# utiliza iptables /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

Isso substitui três configurações: Ele estabelece um novo tempo de banimento (bantime) para todos os serviços, usa o iptables para configurar o firewall e define que será aplicado no sshd. Feito as alterações, salve e feche o arquivo. Reinicie o serviço usando systemctl.

$ sudo systemctl restart fail2ban

O comando systemctl não mostra qualquer informação no restart. Para ter certeza que está funcionando, cheque o cliente do fail2ban com o comando abaixo.

$ sudo fail2ban-client status
Output
Status | - Number of jail: 1 - Jail list: sshd

Para obter mais detalhes sobre um bloqueio específico, coloque o nome do serviço

$ sudo fail2ban-client status sshd

Explorando um pouco mais as configurações
Se você acessa o servidor de algum lugar que tem um IP público fixo, você pode definir que o fail2ban não aplique as regras no seu IP alterando o parâmetro ignoreip. Novamente, faça isso no jail.local e não no jail.conf. Para isso, adicione a seguinte linha

ignoreip = 127.0.0.1/8 seu.ip.fixo/mascara

O parâmetro bantime permite definir o tempo em segundos que o banimento será aplicado. No exemplo abaixo deixei 600 segundos, que será 10 minutos.

bantime = 600

Os parâmetros abaixo exigem um pouco de cuidado para definir. findtime e maxretry define quantas falhas em um determinado tempo será considerado suficiente para aplicar o bloqueio. No exemplo abaixo, 600 segundos para o tempo e no máximo 3 tentativas, ou seja, se falhar o login 3 vezes em menos de 10 minutos o fail2ban entrará em ação.

findtime = 600
maxretry = 3

Se você deseja receber email de alerta, utilize o parâmetro destemail. Os valores são sendername e mta. O parâmetro destemail deve receber o endereço de email que receberá as mensagens. O sendername será o From do email e o mta configura qual serviço de email será utilizado para enviar.

destemail = root@localhost sendername = Fail2Ban mta = sendmail

O parâmetro action configura a ação que Fail2ban tomará quando executar uma proibição. O valor action_ é definido no arquivo pouco antes de este parâmetro. A ação padrão é simplesmente configurar o firewall para rejeitar o tráfego a partir do host.

Se você gostaria de configurar alertas de e-mail, você pode substituir esse valor a partir action_ para action_mw. Se você deseja que o e-mail inclua linhas de registo relevantes, você pode alterá-lo para action_mwl. Você deve ter certeza de que as configurações de email estão configurados corretamente se você optar por usar os alertas de e-mail.

Configuração para jaulas individuais
Após a seção [DEFAULT] iremos encontrar seções que configura jaulas para diferentes serviços. Normalmente ele inclui a porta a ser banida e o log do serviço a ser monitorado por serviços suspeitos. Por exemplo, a jaula SSH já está habilitado no jail.local com as configurações abaixo:

[sshd]
port = ssh
logpath = %(sshd_log)s

Neste caso, ssh é uma variavel pré definida para a porta padrão do SSH, e %(sshd_log)s use um valor definido nas configurações padrões do fail2ban. Isso ajuda a manter jail.conf portavel entre diferentes sistemas operacionais.

Ouras configurações que você deve encontrar é o filter que será usado para decidir o que na linha do log será definido como falha de autenticação.

O valor de filter é atualmente uma referencia ao arquivo localizado no /etc/fail2ban/filter.d com o .conf. Este arquivo contém expressões regulares que determina o que na linha é considerado uma ameaça. Veja no diretório /etc/fail2ban/filter.d que há vários arquivos que são específicos para cada serviço (ssh, apache, nginx, vsftpd, etc).

Se você deseja ver o arquivo relacionado ao serviço que você usará, você deve abrir o arquivo com o editor de texto. Maioria dos arquivos são bem comentados e você estará apto a entender as condições de leitura de cada um dos scripts. A maioria desses scripts estão desabilitados no jail.conf e você poderá habilitar no jail.local como desejado.

Por exemplo, vamos supor que temos um site usando Nginx e parte dele tem uma página protegida por senha e você notou que há várias tentativas de acesso com falha. Nós podemos habilitar o Fail2ban a proteger o Nginx analisando os logs em /var/log/nginx/error.log. Há uma seção chamada nginx-http-auth no jail.conf. Nós devemos apenas habilitar o parametro para ele no jail.conf conforme abaixo.

[DEFAULT]
# Banindo curioso por 1 hora
bantime = 3600

# Usando iptables para banir
banaction = iptables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

Após isso, reinicie o serviço fail2ban

$ sudo systemctl restart fail2ban

Monirotando o log do Fail2ban e as configurações do firewall
É importante saber se o serviço Fail2ban está trabalhando conforme planejado. Vamos ver o status do serviço usando o systemctl.

$ sudo systemctl status fail2ban

Se algo estiver errado, você pode verificar por erros olhando o log do fail2ban desde o boot com o comando abaixo:

$ sudo journalctl -b -u fail2ban

O próximo paso é usar o fail2ban-client para checar o status geral do serviço fail2ban-server ou também ver as jaulas individuais conforme abaixo:

$ sudo fail2ban-client status
$ sudo fail2ban-client status nome_da_jaula

Não deixe de analisar também o log do fail2ban com o tail, conforme abaixo. Para cancelar pressione CTRL-C.:

$ sudo tail -f /var/log/fail2ban.log

Listando as regras atuais para o iptables.

$ sudo iptables -L

Conclusão

Você agora estará apto a configurar algumas regras básicas para banir tentativas de acesso indevido ao seu servidor. Fail2ban é muito fácil de configurar e pode proteger qualquer serviço que tenha autenticação.


Cleberson

Casado, pai de família, autodidata e amante de tecnologia. Especialista em PHP, MySQL e PostgreSQL, certificado em RedHat e formando em Gestão de TI.

1 comentário

Ewerton Silva · 25 de março de 2018 às 04:45

Conteúdo de primeira qualidade, Cleberson. Obrigado.

Deixe um comentário

Avatar placeholder

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *