Neste tutorial, vamos demonstrar como configurar o Suricata em Network IPS na sua rede. Dessa forma, desejamos usar o Suricata para proteger outras máquinas ou servidores dentro da rede.
Existem diversas formas de usar o Suricata pra prover proteção dentro da rede. Nesse caso, vamos utilizar uma regra que impede acesso não desejável a outras portas TCP que não foram liberadas no Suricata.
As regras usadas nesse tutorial foram as regras utilizadas em : Aula 2: Suricata em Host IPS
Esse tutorial é parte do Curso de Suricata em Linux.
Artigo 1: Instalar Suricata Linux
Artigo 2: Suricata em Host IPS
Artigo 3: Suricata em Network IPS
Link para o curso de Suricata no youtube:
Cenário proposto
Neste cenário, vamos usar o Suricata entre duas redes. Temos a rede externa que contém um servidor WEB e a rede interna que temos um computador atuando como cliente. Assim, utilizando esse cenário estamos supondo que desejamos criar regras específicas de acesso ao servidor WEB. Nesse caso, vamos usar o Suricata para permitir apenas o tráfego HTTP para o servidor WEB.
Consequentemente, o Suricata vai descartar e registrar nos logs todo o tráfego para o servidor WEB que não for HTTP.
Alterar a nossa regra do Suricata
Precisamos alterar a regra que criamos anteriormente para garantir que o Suricata bloqueie qualquer tráfego TCP que não seja destinado a porta 80(HTTP). Para isso, vamos usar o comando abaixo para criar e editar o arquivo “redes.rules”.
sudo nano /etc/suricata/rules/redes.rules
Em seguida, vamos modificar a regra existente retirando o “$HOME_NET “ e inserindo o “any” Dessa forma teremos o descarte de pacotes TCP que não sejam para a porta 80 em qualquer rede.
drop tcp any any -> any !80 (msg:"TCP Scan ?"; flow:from_client;flags:S; sid:992002087;rev:1;)
Depois disso vamos salvar.
Em seguida vamos reiniciar as regras do suricata com o comando abaixo.
sudo kill -USR2 $(pidof suricata)
Configurando a máquina do Suricata como roteador
Neste tutorial, vamos configurar a máquina do Suricata para atuar como um roteador entre a rede interna “192.168.11.0/24” e a rede externa ” 203.0.113.0/24”. Além de atuar como roteador, vamos criar uma regra NAT que traduz os IPs da rede interna “192.168.11.0/24” em um IP da rede externa. Dessa forma, estamos criando um cenário semelhante a inserir o Suricata entre a Internet e a sua rede interna ou entre duas redes de sua empresa.
Criando a permissão de encaminhamento
Agora, precisamos habilitar o encaminhamento na máquina do Suricata. Para isso, vamos inserir uma linha no arquivo /etc/sysctl.conf. Dessa forma, vamos usar o comando abaixo para inserir a linha pelo comando:
sudo nano /etc/sysctl.conf
Em seguida vamos adicionar a linha no final do arquivo:
net.ipv4.ip_forward = 1
Você pode me falar: Juliana essa linha já está no arquivo. A resposta é sim. No entanto, na maioria dos sistemas essa linha vai estar comentada, principalmente se você nunca configurou o servidor para encaminhar pacotes. Dessa forma, se desejar pode descomnentar a linha ao invés de inserir a linha “net.ipv4.ip_forward = 1” .
Agora vamos recarregar o arquivo usando o comando :
sudo sysctl -p
Verificando a interface que liga a rede externa
Antes de configurar o NAT, precisamos identificar qual é a nossa interface de rede que liga a nossa rede externa. Isso porque, as conexões dos clientes da rede interna serão roteadas por essa interface que liga a nossa rede externa. Dessa forma, vamos usar o comando abaixo para identificar as interfaces e as redes.
ip route
Podemos observar na figura acima que nossa rede externa é a “enp0s3”. Isso porque, essa interface “enp0s3” está associada à rede que definimos como externa “203.0.113.0/24”.
Criando um NAT para a rede interna
Vamos editar o arquivo que faz a leitura preliminar das regras do firewall. Neste arquivo, vamos realizar dois procedimentos. O primeiro será realizar um NAT para a rede interna e o segundo será um encaminhamento do tráfego para o NFQUEUE. Para isso, vamos editar o arquivo “/etc/ufw/before.rules”. Então, vamos usar o comando abaixo:
sudo nano /etc/ufw/before.rules
E vamos inserir as linhas abaixo.
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.11.0/24 -o enp0s3 -j MASQUERADE
COMMIT
Assim, essas linhas vão permitir que seja feita a tradução da rede interna para a rede externa. Vale a pena destacar, que na configuração dessas linhas você deve introduzir a sua interface de rede que será usada na rede externa. Dessa forma, em nosso caso a interface para a rede externa é a “enp0s3” e a rede usada em nossa rede interna foi a “192.168.11.0/24”.
Assim, o que estamos fazendo na figura acima é mapear a rede interna “192.168.11.0/24” para sair pela interface externa “enp0s3”.
Enviando o tráfego de roteamento para o NFQUEUE
Diferentemente do que fizemos no post anterior, agora vamos configurar o suricata para funcionar como IPS da rede. Dessa forma, precisamos criar regras no firewall para enviar o tráfego que será roteado para o NFQUEUE do Suricata. Para isso, vamos alterar o arquivo “before.rules” do UFW.
-I FORWARD -j NFQUEUE
Na figura acima, comentamos as regras anteriores “#-I INPUT -j NFQUEUE” e “#-I INPUT -j NFQUEUE”. Isso porque, não estamos mais interessados em filtrar o tráfego que vem para a máquina do Suricata, mas sim o tráfego que é encaminhado pelo Suricata. No entanto, caso deseje filtrar o tráfego direcionado a máquina do Suricata, você pode descomentar as linhas do INPUT e OUTPUT.
Abaixo temos o arquivo “before.rules”.
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.11.0/24 -o enp0s3 -j MASQUERADE
COMMIT
# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
###Suricata NFQUEUE
#-I INPUT -j NFQUEUE
#-I OUTPUT -j NFQUEUE
-I FORWARD -j NFQUEUE
### End Suricata NFQUEUE rules
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
OBS. Caso você opte por utilizar outro firewall, lembre-se de redirecionar o tráfego de encaminhamento para o NFQUEUE do Suricata
Agora vamos reiniciar o firewall UFW usando os comandos abaixo.
sudo ufw disable
sudo ufw enable
Testando o bloqueio
Agora vamos abrir duas portas na máquina da rede externa que tem um servidor WEB apache. Para isso, vamos usar o servidor APACHE2 e o servidor SSH. A porta 80 é usada em servidores WEB para o protocolo HTTP e a porta 22 é usada pelo protocolo SSH.
Nesse caso, queremos que o Suricata bloqueie o acesso ao servidor SSH já que o único tráfego que não será descartado será o tráfego para o servidor WEB na porta 80.
Podemos usar os comandos abaixo para verificar se as portas do servidor WEB e do protocolo SSH estão abertas.
sudo netstat -anp | grep :80
sudo netstat -anp | grep :22
Agora, vamos acessar o servidor WEB usando um navegador e digitando o IP do servidor WEB “203.0.113.10” na máquina cliente.
Em seguida, vamos tentar acessar o servidor SSH que temos instalado também na máquina com servidor WEB. Para isso, podemos usar o comando abaixo:
ssh [email protected]
Podemos observar na figura abaixo que não tivemos acesso ao servidor SSH. Isso porque o Suricata bloqueou o acesso a todas as outras portas TCP diferentes da porta 80.
Verificando os logs no suricata.
Agora vamos para a máquina do suricata e vamos abrir o arquivo de logs. Para isso, vamos usar o comando abaixo:
cat /var/log/suricata/fast.log
Podemos ver o resultado do log de bloqueio na figura abaixo. Nesse caso, podemos verificar que o IP do cliente “192.168.11.22” tentou acessar a porta 22 do IP do servidor WEB “203.0.113.10”.
Topologia no VirtualBox
Nas figuras abaixo, vamos demonstrar o nosso cenário usado para criar o experimento com o Suricata usando o VirtualBox. Dessa forma, você pode criar o mesmo cenário para estudos e prova de conceito.
A figura abaixo demonstra a configuração da rede da máquina virtual que hospeda o Suricata. Assim, usamos a interface Adatpter 1 para pertencer a rede externa “External_Network”.
A figura abaixo demonstra a outra configuração da rede da máquina virtual que hospeda o Suricata. Assim, usamos a interface Adatpter 2 para pertencer a rede externa “Internal_Network”.
A figura abaixo demonstra a configuração da rede da máquina virtual que hospeda o cliente da rede interna. Assim, usamos a interface Adatpter 1 para pertencer a rede externa “Internal_Network”.
A figura abaixo demonstra a configuração da rede da máquina virtual que hospeda o servidor WEB. Assim, usamos a interface Adatpter 1 para pertencer a rede externa “External_Network”.
Está gostando do curso de Suricata? Comente no canal do YouTube e fique a vontade para dar sugestões ou críticas.
Esse tutorial é parte do Curso de Suricata em Linux.
Artigo 1: Instalar Suricata Linux
Artigo 2: Suricata em Host IPS
Artigo 3: Suricata em Network IPS
Veja mais:
Aula 1: Instalar Suricata Linux
Aula 2: Suricata em Host IPS
Aula 3: Suricata em Network IPS