Protegendo servidores Linux: iptables vs fail2ban


10

Gostaria de escolher o cérebro da comunidade em relação à segurança do servidor linux, especificamente a ataques de força bruta e o uso de fail2ban vs iptables personalizados .

Existem algumas perguntas semelhantes por aí, mas nenhuma delas aborda o tópico para minha satisfação. Em resumo, estou tentando determinar a melhor solução para proteger servidores Linux expostos à Internet (executando os serviços usuais, ssh, web, correio), contra ataques de força bruta.

Eu tenho um controle decente sobre a segurança do servidor, ou seja, bloqueando o ssh, não permitindo logins de raiz ou senha, alterando a porta padrão, garantindo que o software esteja atualizado, verificando arquivos de log, permitindo apenas que certos hosts acessem o servidor e fazendo uso da segurança ferramentas de auditoria, como Lynis ( https://cisofy.com/lynis/ ), para conformidade geral com a segurança, portanto, essa pergunta não é necessariamente relativa a isso, embora as contribuições e os conselhos sejam sempre bem-vindos .

Minha pergunta é qual solução devo usar (fail2ban ou iptables) e como devo configurá-la ou devo usar uma combinação de ambas para proteger contra ataques de força bruta?

Existe uma resposta interessante sobre o tópico ( Denyhosts x fail2ban x iptables - a melhor maneira de impedir logons de força bruta? ). A resposta mais interessante para mim pessoalmente foi ( https://serverfault.com/a/128964 ), e esse roteamento de iptables ocorre no kernel em oposição ao fail2ban, que utiliza ferramentas do modo de usuário para analisar arquivos de log. O Fail2ban usa o iptables, é claro, mas ainda precisa analisar os arquivos de log e corresponder a um padrão até executar uma ação.

Faz sentido, então, usar o iptables e limitar a taxa ( https://www.rackaid.com/blog/how-to-block-ssh-brute-force-attacks/ ) para descartar solicitações de um IP por um período tempo que faz muitas tentativas de conexão durante um período específico, independentemente de qual protocolo ele estava tentando se conectar? Nesse caso, existem algumas idéias interessantes sobre o uso de drop vs rejeite para esses pacotes aqui ( http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject ), alguma opinião sobre isso?

O Fail2ban permite a configuração personalizada na forma de poder escrever ' regras ' personalizadas para serviços que podem não ser endereçados na configuração padrão. É fácil de instalar e configurar e é poderoso, mas poderia ser um exagero se tudo o que estou tentando conseguir é ' bloquear ' um IP do servidor se eles fizerem duas tentativas de acesso com falha em qualquer serviço / protocolo em um valor x de tempo?

O objetivo aqui é abrir relatórios diários do logwatch e não precisar rolar pelas páginas de tentativas de falha na conexão com o servidor.

Obrigado por reservar um tempo.


3
Você pode encontrar Por que eu precisaria de um firewall se meu servidor estiver bem configurado? pode lançar alguma luz sobre o assunto.
MadHatter

Respostas:


21

devo usar fail2ban ou iptables?

Você usa fail2ban , além de uma solução de firewall, para estender sob demanda as regras de firewall existentes com regras para bloquear os endereços IP específicos de sistemas que executam ações indesejáveis ​​em serviços públicos. Eles trabalham em conjunto.

Simplificado: um firewall só vê conexões e pacotes de rede e pode entender alguns padrões, mas não possui o insight no nível do aplicativo para distinguir solicitações desejadas e válidas de solicitações maliciosas, malformadas e indesejáveis. Por exemplo, seu firewall não pode dizer a diferença entre várias solicitações de API HTTP e várias tentativas incorretas de login causadas por suposições de senha de força bruta na sua página de administração do Wordpress; para o firewall, ambas são apenas conexões TCP à porta 80 ou 443.

O Fail2ban é uma abordagem genérica e extensível para fornecer esse insight no nível do aplicativo ao seu firewall, embora de maneira um tanto indireta.
Os aplicativos freqüentemente registram e registram solicitações mal-intencionadas, malformadas e indesejáveis ​​como tais, mas apenas raramente têm a capacidade nativa de impedir novos abusos. Embora esteja um pouco dissociado, o Fail2ban pode agir sobre os eventos maliciosos registrados, limitar os danos e impedir mais abusos, normalmente reconfigurando dinamicamente o firewall para negar acesso adicional. Em outras palavras, o Fail2ban fornece aos seus aplicativos existentes, sem modificá-los, os meios para evitar abusos.

Um método diferente para fornecer aos firewalls informações sobre o nível do aplicativo seria por meio de um sistema de detecção / prevenção de intrusões .


Por exemplo, um servidor da web é um serviço público comum e no seu firewall as portas TCP 80 e 443 estão abertas para a Internet em geral.
Normalmente, você não tem nenhum limite de taxa nas portas HTTP / HTTPS porque vários usuários válidos podem ter uma única origem quando, por exemplo, estão atrás de um gateway NAT ou proxy da web.

Quando você detecta ações indesejáveis ​​e / ou mal-intencionadas em relação ao servidor da Web, usa o fail2ban para automatizar o bloqueio de um infrator (bloqueá-lo completamente ou bloqueando apenas o acesso às portas 80 e 443).

Por outro lado, o acesso SSH não é um serviço público, mas se você não está em condições de restringir o acesso SSH no firewall a apenas intervalos de endereços IP listados em branco, as conexões de entrada com limitação de taxa são uma maneira de diminuir a velocidade bruta ataques de força. Mas seu firewall ainda não consegue distinguir entre o login do usuário com êxito 5 vezes, porque ele está executando playbooks ansible e 5 tentativas falhas de fazer login como root por um bot.


Esse é o insight que eu estava procurando, faz todo o sentido para mim, obrigado por dedicar um tempo.
21917 kingmilo

2
Embora existam firewalls de aplicativos (também conhecidos como gateways de aplicativos) que podem executar uma inspeção profunda de pacotes.
Gardenhead 17/05

@gardenhead concordou e +1; por causa do iptablesmencionado pelo OP, concentrei-me principalmente na construção do filtro de pacotes Linux no kernel. Na minha "opinião" , os firewalls de aplicativos não inspecionam completamente os pacotes, eles conhecem o protocolo de aplicativos e devem inspecionar a solicitação completa. Na web você, então, lidar com produtos como mod_security do apache, aparelhos F5 e Bluecoat e até mesmo "humilde" proxies reversos
HBruijn

@HBruijn Você está certo - eu usei mal o termo pacote. Não sei os detalhes de como os gateways de aplicativos são criados, mas imagino que eles esperam para receber pacotes suficientes para reunir uma mensagem completa da camada de aplicativo antes da inspeção + encaminhamento.
Gardenhead 17/05/19

1
Protip: use o módulo recente iptables para ssh, mesmo se você usar fail2ban para outros serviços. Pode haver modos de falha interessantes em que as regras não são limpas corretamente e ter os logons afetados por isso seria realmente irritante (e também tornaria o problema difícil de depurar). Com as recentes , as regras reais não precisam ser alteradas, então você tem uma boa chance de obter acesso novamente.
Simon Richter

7

devo usar fail2ban ou iptables?

Isso é semelhante a perguntar "devo usar cinto de segurança ou carro?".

Primeiro, lembre-se de que fail2ban realmente é apenas uma ferramenta para detectar automaticamente entradas recorrentes em arquivos de texto e executar algum comando quando elas atingem um limite especificado.

Costumamos usá-lo para bloquear hosts que violam alguma política, conforme evidenciado pelas entradas de log recorrentes que indicam uma violação da política, mas essa não é a única coisa para a qual você pode usá-la.

Você pode usar o fail2ban para adicionar (e remover) regras do iptables sob demanda. Você também pode adicionar e remover regras do iptables manualmente ou pode usar o fail2ban para fazer algo totalmente diferente em resposta. É tudo sobre como você o configura.

Você deve ter firewall geral em vigor, independentemente de estar executando fail2ban ou não. Esse firewall seria, por exemplo, bloquear o tráfego (de entrada ou saída) que você sabe que nunca será legítimo. Por exemplo, esse servidor de banco de dados realmente precisa lidar com as conexões de entrada na porta 25 de toda a Internet?

Além disso, fazer com que o fail2ban responda a violações de políticas cortando o (s) IP (s) ofensivo por um tempo não fará muito para proteger o servidor por si só (uma boa exploração só precisa passar pelo firewall uma vez), mas reduza o nível de ruído em seu sistema, incluindo, entre outros, os logs do sistema. A maneira mais simples de fazer isso é fazer com que o fail2ban execute o iptables para configurar o kernel para descartar os pacotes por um tempo. Se você pode reconfigurar seu firewall de perímetro em vez de apenas o firewall do host, é melhor ainda.

Em outras palavras, na medida em que eles possam ser facilmente separados em primeiro lugar, você deseja os dois.

poderia ser um exagero se tudo o que estou tentando conseguir é "bloquear" um IP do servidor se eles fizerem duas tentativas de acesso com falha em qualquer serviço / protocolo durante um período de tempo diferente?

Esse é exatamente o caso de uso que fail2ban foi projetado para resolver. O uso de uma ferramenta para a finalidade pretendida quase nunca é um exagero.

O objetivo aqui é abrir relatórios diários do logwatch e não precisar rolar pelas páginas de tentativas de falha na conexão com o servidor.

Um aparte, não diretamente relacionado à sua pergunta: sempre que você estiver filtrando logs para revisão, considere o que você fará sobre alguma entrada específica. Se tudo o que você fizer sobre uma entrada for dizer "meh" e seguir em frente, provavelmente você deseja filtrá-la. Salve os logs completos para revisão, caso isso seja necessário, mas apenas insira no fluxo de trabalho de monitoramento regular as coisas com as quais você realmente fará algo quando aparecer. Se você configurar o fail2ban para bloquear um host após algumas tentativas de conexão com falha, é bem provável que você não precise revê-las manualmente e poderá removê-las das notificações de monitoramento. Se um usuário legítimo reclamar da perda de acesso, basta retirar os logs completos e dar uma olhada.


Aprecie o feedback extenso, acho que nunca pensei que os dois tivessem funções completamente separadas.
21917 kingmilo

4

Eu resolvi a mesma pergunta há alguns anos. Decidi usar o iptables com módulo recente por causa do desempenho e da configuração fácil. Eu tive que proteger muitos contêineres virtuais em hosts. Lembre-se de não abrir nenhum vetor DOS com suas regras. Use também o ipset para corresponder às listas de rede ou ip nas regras. Eu o uso para listas brancas. Todas as redes de um país em uma lista são ótimas para o ajuste fino. E é muito fácil proteger outro serviço com o mesmo conjunto de regras adicionando mais uma porta à correspondência. Portanto, não gosto de mudar com o fail2ban, mas talvez alguém com outras necessidades fique feliz com o fail2ban.

Aqui está um exemplo:

  #
  # SSH tracking sample
  #
  #################################################################################
  iptables -X IN_SSH
  iptables -N IN_SSH
  iptables -A IN_SSH -m set --match-set net_blacklist src -p tcp -j REJECT
  iptables -A IN_SSH -m set --match-set net_whitelist src -p tcp --match limit --limit 5/second -j LOG --log-prefix whitelist_de_prefix
  iptables -A IN_SSH -m set --match-set net_whitelist src -p tcp -j ACCEPT
  # filter update
  iptables -A IN_SSH -m recent --name sshbf --set --rsource
  # connlimit
  iptables -A IN_SSH -m connlimit --connlimit-above 4 --match limit --limit 5/second -j LOG --log-prefix ssh_connlimit_per_ip_above_4
  iptables -A IN_SSH -m connlimit --connlimit-above 4 -j REJECT
  # filter
  iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 13 --seconds 60 --match limit --limit 5/second -j LOG --log-prefix ssh_filtered_13in60sec
  iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 13 --seconds 60 -j REJECT
  iptables -A IN_SSH -j ACCEPT

iptables -A FORWARD -p tcp --dport ssh --syn --jump IN_SSH
# iptables -A INPUT -p tcp --dport ssh --syn --jump IN_SSH

A saída de suas mensagens de log pode ser combinada com fail2ban. Você também pode usá-lo para as regras INPUT.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.