Suricata em Host IPS

Vamos apresentar aqui uma configuração do Suricata em modo Host IPS. Dessa forma, usando essa configuração, o leitor poderá usar o suricata para proteger uma máquina que hospeda um serviço ou para proteger máquinas de usuários. 

English version:
https://simplificandoredes.com/en/suricata-host-ips/

Neste tutorial vamos usar o suricata em modo IPS atuando no modo NFQUEUE. Dessa forma, os pacotes são enviados para o suricata e então podem ser bloqueados ou permitidos. 

Vamos iniciar o tutorial criando uma regra para testes. No entanto, o leitor pode usar as regras prontas do Suricata e alterar o campo alert para drop para fazer com que o suricata passe a descartar pacotes que atendam a alguma regra de ataque. 

Estamos supondo o mesmo cenário e a mesma configuração do suricata criada no post anterior: https://simplificandoredes.com/instalar-suricata-linux/ 

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

Criar uma regra para o IPs 

Vamos criar uma regra customizada. Assim, temos como objetivo bloquear qualquer tentativa de conexão para qualquer porta que não for a porta 80.  

Estamos simulando que desejamos proteger um servidor WEB de possiveis scans por outras portas TCP. 

Nesse caso, vamos criar um arquivo de regra chamado “redes.rules”. Além disso, vamos criar esse arquivo “redes.rules” dentro de “/etc/suricata/rules/”.  

Para isso, vamos usar o comando abaixo para criar e editar o arquivo “redes.rules”. 

sudo gedit /etc/suricata/rules/redes.rules 

Em seguida, vamos inserir a regra abaixo: 

drop tcp any any -> $HOME_NET !80 (msg:"TCP Scan ?"; flow:from_client;flags:S; sid:992002087;rev:1;) 

Essa regra diz “ Vamos descartar pacotes que vierem de qualquer origem e vindo de qualquer porta para nossa rede interna e que não seja para a porta 80.” Além disso, vamos criar um log do bloqueio com a mensagem “TCP Scan ?“. E vamos analisar o flow que vem do cliente e que tenha o flag tcp = SYN.” 

Vamos especificar abaixo os principais campos dessa regra. 

“drop” Significa que vamos descartar os pacotes que atendam a essa regra. 

“tcp “ Estamos focando a regra no protocolo de camada de transporte TCP. 

“any any” Nesse caso, o primeiro “any” se refere a qualquer IP de origem e o segundo “any” se refere a qualquer porta de origem. Portanto, “any any “ idica qualquer IP e qualquer porta. 

->” Nesse caso, estamos usando a direção do tráfego. Ou seja, estamos supondo um tráfego que vem da origem “any any“. 

“$HOME_NET “ Aqui temos as redes que pertencem ao nosso Home Net descrito no arquivo “suricata.yaml” 

!80” = Não porta 80. Ou seja, qualquer tráfego que esteja indo para qualquer porta que não seja a 80. 

“msg:”TCP Scan ?” A mensagem que vai aparecer os logs do suricata 

“flow:from_client;flags:S” Vamos analisar o flow que vem do cliente e que tenha o flag tcp = SYN.” 

“sid:992002087” A identificação para a regra que acabamos de criar. Cuidado para não usar o mesmo sid de outra regra do seu suricata. 

“rev:1” A versão de sua regra. 

Inserindo a nova regra no Suricata

Vamos entrar em “/etc/suricata/suricata.yaml” 

sudo nano /etc/suricata/suricata.yaml 

Verifique se sua rede está na “$HOME_NET “. 

Agora, vamos adicionar o caminho para a nova regra que terminamos de criar na sessão anterior. Portanto, vamos até o final do arquivo e vamos procurar a linha “rule-files” e vamos inseir a linha abaixo. 

- /etc/suricata/rules/redes.rules 
sudo nano /etc/default/ufw 
Editing   /etc/suricata/suricata.yaml 
Editing /etc/suricata/suricata.yaml 

Transformando o suricata em host IPS  

Agora vamos levantar o Suricata em modo IPS. Para isso, vamos parar o processo do suricata que estiver rodando na máquina com o comando abaixo. 

sudo service suricata stop 

Ou 

sudo systemctl stop suricata.service 

Agora, vamos alterar a forma de inicialização do processo do suricata. Para isso vamos usar o comando abaixo para abrir o editor. 

sudo systemctl edit suricata.service 

Em seguida vamos inserir as linhas abaixo. 

[Service]
ExecStart=
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -q 0
Type=simple

As linhas fazem com que inicialmente a configuração do serviço (ExecStart=) e em seguida, inicia uma nova forma de iniciar o serviço (ExecStart=). A opção “Type=simple” permite o gerenciamento do systemd ao suricata. 

A linha “ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml –pidfile /run/suricata.pid -q 0 ” vai executar o serviço do suricata em modo IPS. Para isso, usamos a opção “ -q -0“. Dessa forma, estamos informando ao suricata que usaremos o modo NFQUEUE

Editing suricata.service

Agora, vamos reiniciar o suricata. Para isso podemos usar o comando abaixo: 

sudo service suricata start 

Ou 

sudo systemctl start suricata.service 

Enviando o tráfego para o NFQUEUE do Suricata 

Agora que configuramos o suricata para funcionar como IPS, precisamos criar regras no firewall para enviar o tráfego para o NFQUEUE do Suricata. Para isso, vamos alterar o arquivo “before.rules” do UFW. 

sudo nano /etc/ufw/before.rules 
-I INPUT -j NFQUEUE
-I OUTPUT -j NFQUEUE
Editing /etc/ufw/before.rules 
Editing /etc/ufw/before.rules 

OBS. Caso você opte por utilizar outro firewall, lembre-se de redirecionar o tráfego para o NFQUEUE do Suricata 

Agora vamos editar o arquivo ”/etc/default/ufw”· Na maioria dos casos a política de INPUT está configurada como DROP por default. Assim, vamos altear essa política para accept por padrão. Consequentemente estamos dizendo ao firewall que o que não for bloqueado pelo NFQUEUE do Suricata terá permissão de ACCEPT.  

sudo nano /etc/default/ufw 
ACCEPT
sudo nano /etc/default/ufw 

OBS. Essa é apenas uma sugestão de configuração de firewall. No entanto, você pode configurar o seu firewall obedecendo a política que achar mais adequada. E lembre-se de direcionar o tráfego para o NFQUEUE do Suricata. 

Agora vamos reiniciar o firewall UFW usando os comandos abaixo. 

sudo ufw disable 
sudo nano /etc/default/ufw 
sudo ufw enable 

Testando o IPS do Suricata

Agora vamos abrir duas portas na máquina protegida com o suricata. Para isso, vamos usar o comando netcat e vamos abrir a porta 80 e a porta 21. A porta 80 é usada em servidores WEB para o protocolo HTTP e a porta 21 é usada pelo protocolo FTP. 

Vamos usar os comandos abaixo para abrir as portas 80 e 21. Sugiro que abra um terminal para cada um dos comandos. 

sudo nc -vln 80 

Agora vamos abrir outro terminal ou outra aba de terminal e digitar o comando abaixo. 

sudo nc -vln 21 

OBs. Estamos usando o comando netcat para abrir as portas 80 e 21. No entanto, o leitor pode instalar um servidor WEB link para vídeo aula aqui e instalar um servidor FTP link para videoaula aqui. 

Testando o acesso com o nmap 

Agora vamos usar o nmap na outra máquina para simular uma varredura de portas contra a máquina que estamos protegendo. Nesse caso, esperamos que apenas a porta 80 apareça como aberta nos resultados do nmap.  

Caso não tenha o nmap instalado temos um post explicando os passos aqui. 

NMAP : Identificar a versão de um serviço

NMAP: Scan avançado

NMAP: Mapeamento de portas TCP e UDP

Agora, dentro da máquina cliente que está na mesma rede interna da máquina que está protegida com o suricata, vamos usar o comando abaixo 

sudo nmap -p 80,21 -sS 192.168.11.24 

Nesse caso estamos especificando que queremos fazer uma varredura nas portas 80 e 21 da máquina alvo do suricata que tem o IP 192.168.11.24.    

Podemos observar que aporta 80 está aberta “open” e a porta 21 está como filtrada “filtered”. O termo “filtered” é usado para identificar portas que não responderam a varredura do nmap. 

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. 

Desabilitando a regra e testando o scan

Agora vamos desabilitar a regra que inserimos no suricata e vamos refazer o scan com o nmap. Para isso vamos editar novamente o arquivo de regras abaixo e comentar com “#” a regra que inserimos. 

sudo nano /etc/suricata/rules/redes.rules 

Em seguida, vamos fazer o suricata ignorar a regra. Para isso vamos inserir “#” na frente da regra: 

#drop tcp any any -> $HOME_NET !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) 

Agora vamos refazer o scan do nmap na máquina cliente. 

sudo nmap -p 80,21 -sS 192.168.11.24 

Podemos observar que o resultado do scan apresenta as portas 21 e 80 como abertas. 

Finalmente, apresentamos nesse tutorial uma configuração de Suricata em modo Host IPS. Em futuros tutoriais, vamos apresentar o Suricata em modo IPS de rede. Ou Network IPS (NIPS). Além disso, pretendemos apresentar formas diferentes de apresentar de forma gráfica os logs do Suricata. 

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:

Juliana Mascarenhas
Juliana Mascarenhas

Cientista de dados e mestre em modelagem computacional pelo LNCC.