Suricata em Network IPS

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. 

English version: click HERE

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:

https://youtube.com/playlist?list=PLigQ9zMmlIqIuf08ERzg3CqIXCxZcO42x

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.  

used scenario

Used scenario

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;) 
Changing our rule
Changing our rule

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 
net.ipv4.ip_forward = 1    OK
net.ipv4.ip_forward = 1  OK

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 
Find your external interface
Find your external interface

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”. 

NAT rules
NAT rules

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 
FORWARDING to NFQUEUE
Forwarding to 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 
Port 80 TCP for HTTP and 22 TCP for SSH
Port 80 TCP for HTTP and 22 TCP for SSH

Agora, vamos acessar o servidor WEB usando um navegador e digitando o IP do servidor WEB “203.0.113.10” na máquina cliente. 

Accessing the WEB server through the client's browser.
Accessing the WEB server through the client’s browser.

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. 

Connection Timeout

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”. 

Suricata log
Suricata log

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”. 

Suricata External Network
Suricata 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”. 

Suricata Internal Network
Suricata 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”. 

Client internal Network
Client 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”. 

WEB server External Network
WEB server 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

Juliana Mascarenhas
Juliana Mascarenhas

Cientista de dados e mestre em modelagem computacional pelo LNCC.