Este repositório contém o passo a passo referente ao desenvolvimento e implementação de uma solução abrangente de segurança de rede, que integre um firewall, um Web Application Firewall (WAF) e um Sistema de Informações e Eventos de Segurança (SIEM). O objetivo é aplicar na prática os conhecimentos adquiridos na plataforma Alura durante o Bootcamp em Segurança da Informação, configurando políticas de segurança, detectando e respondendo a ameaças, e criando painéis de monitoramento para garantir a integridade e a segurança da rede.
Projeto 1 |
Projeto 2 |
Projeto 3
Neste projeto, a intranet é acessada pelos desenvolvedores e é hospedada em servidores específicos, como o servidor de dados (Database) e o servidor web. Um Firewall atua como intermediário do tráfego, implementando regras de segurança, com sistemas de detecção e prevenção de intrusões (IDS e IPS) integrados para identificar e impedir possíveis ataques. Adicionalmente, um WAF opera como um proxy reverso, recebendo as requisições e ocultando o IP privado para a rede pública.
Além disso, o sistema conta com o mecanismo DMZ (Demilitarized Zone), onde a rede externa é segregada da interna. A porção externa está voltada para a internet, onde o WAF é localizado, enquanto a porção interna engloba o Database (DMZ Banco) e o servidor web (DMZ Web). Em suma, o sistema é dividido em zonas distintas: a zona externa, onde está o WAF, e a zona interna, onde estão localizados o Database e o servidor web. Esta segmentação em sub-redes é essencial para mitigar os riscos de ataques, impedindo que um eventual ataque tenha acesso irrestrito às informações do sistema.
- Virtualização de quatro máquinas: WAF, Server, Firewall e SIEM
- Firewall com regras de bloqueio e acesso
- Sistema de detecção e prevenção de intrusões
- Envio de logs do WAF e Firewall para o SIEM
- Criptografia com certificado SSL
- Configuração de acesso remoto
- Filtros de log e dashboards no SIEM
- Baixe e instale o VirtualBox para simular as máquinas virtuais necessárias.
- Faça o download do arquivo .iso do pfSense aqui (versão 2.7.2, arquitetura AMD64) e do Debian 12 aqui.
- Baixe o pacote de extensões do VirtualBox e o adicione.
- No VirtualBox, use o atalho
Ctrl + H
e desative o Servidor DHCP para o adaptador VirtualBox Host-Only Ethernet Adapter. Aplique as mudanças. - Crie uma nova máquina virtual chamada firewall a partir do .iso do pfSense, seguindo as instruções do site para instalação.
Acesse as configurações de rede do firewall no VirtualBox e ajuste os adaptadores da seguinte maneira:
-
Adaptador 1:
-
Conectado a:
Placa em modo Bridge
-
Nome:
Sua placa na máquina física que se encontra ligada à rede
-
-
Adaptador 2:
-
Conectado a:
Placa de rede exclusiva de hospedeiro (host-only)
-
Nome:
VirtualBox Host-Only Ethernet A Adapter
-
-
Adaptador 3:
-
Conectado a:
Rede interna
-
Nome:
DMZ
-
-
Adaptador 4:
-
Conectado a:
Rede interna
-
Nome:
DMZEXT
-
Execute a máquina do firewall, atribua as interfaces e seus respectivos IPs de acordo com os parâmetros:
INTERNET (wan) -> em0 -> v4/DHCP4: atribuição dinâmica de IPV4
INTRANET (lan) -> em1 -> v4: 192.168.56.10/24
DMZ (opt1) -> em2 -> v4: 172.100.1.10/24
DMZEXT (opt2) -> em3 -> v4: 172.100.2.10/24
As atribuições de interface e de IP podem ser feitas com as opções 1 e 2 do menu do pfSense no terminal, respectivamente. Acesse a interface web do pfSense inserindo o IP da LAN no navegador e faça login com as credenciais padrão: username admin e password pfsense. É altamente recomendável alterar a senha padrão. Isso pode ser feito acessando System > User Manager no menu e clicando no ícone ✏️.
No menu, vá para Interfaces > Interface Assignments e certifique-se de que todas as interfaces estejam adicionadas e configuradas corretamente. Para este projeto, o único IP que será alterado conforme o usuário é o da interface INTERNET, pois a placa está no modo Bridge.
Note
Em todas as regras criadas no pfSense, habilite a opção Log packets that are handled by this rule.
Seguindo uma boa prática na configuração de firewalls, recomenda-se criar uma regra inicial para bloquear todo o tráfego e, posteriormente, adicionar regras acima para permitir tráfegos específicos. No pfSense, novas regras são adicionadas em Firewall > Rules. Em cada uma das interfaces, clique em Pass
para Block
e o campo Protocol de TCP
para Any
.
Ao final da página, clique em 💾 Save e confirme clicando em ✅ Apply Changes.
Neste projeto, para simplificar a criação de regras, foram criados aliases para os IPs da interface DMZ e as portas WEB e SSH.
Se desejar replicar isso, navegue até o menu Firewall > Aliases > IP e clique em ➕ Add. Adicione um nome e uma descrição correspondente nos campos Name e Description, e não altere o campo Type. Adicione os seguintes IPs em Hosts:
Hosts | |
---|---|
172.100.1.101 | Graylog |
172.100.1.100 | WEB |
Clique em 💾 Save e confirme clicando em ✅ Apply Changes.
Repita o mesmo processo em Firewall > Aliases > Ports, adicionando as portas em Ports:
Ports | |
---|---|
80 | HTTP |
443 | HTTPS |
22 | SSH |
Salve e confirme as mudanças.
Voltando para Firewall > Rules, crie as regras necessárias para todas as interfaces.
Para que o WAF seja publicado na internet quando configurado no futuro, adicione uma regra na interface INTERNET clicando em
Navegue até o campo Destination, altere Destination para Address or Alias
e insira o IP 172.100.2.100
no placeholder Destination address. Logo abaixo, insira as portas WEB 80
e 443
em Destination Port Range. Neste projeto, elas estão com o alias PORT_ADM
.
Insira uma descrição, clique em 💾 Save e ✅ Apply Changes.
Por padrão, o pfSense inclui uma regra de Anti-lockout na interface INTRANET. Neste projeto, por motivos de estudo, essa regra foi substituída por uma personalizada, o que não é obrigatório. Para reproduzir isso, simplesmente crie uma nova regra acima da regra de bloqueio. Navegue até Source, altere o campo Source para INTRANET subnets
. Navegue até Destination, e altere Destination para INTRANET address
, inserindo as portas WEB ou seu alias em Destination Port Range. Insira uma descrição e clique em 💾 Save.
Para que o firewall não bloqueie o acesso ao WAF, adicione uma nova regra com INTRANET subnets
. Navegue até o campo Destination abaixo, altere Destination para Address or Alias
e insira o IP 172.100.1.101
no placeholder Destination address. Logo abaixo, insira a porta 9000
em Destination Port Range.
Insira uma descrição, clique em 💾 Save e ✅ Apply Changes.
Para permitir atualizações de pacotes e configurações no Graylog e no Server, adicione uma regra com
Navegue até Source, altere o campo Source para Address or Alias
e insira o IP do Graylog ou do Server no placeholder Source address. Caso não tenha sido um criado um alias para os IPs, duas regras terão de ser criadas. Caso contrário, insira o nome do alias. Nesse projeto, o alias é UPDATE_DMZ
. Navegue até o Destination abaixo e insira as portas WEB ou seu alias em Destination Port Range. Insira uma descrição e clique em 💾 Save.
Adicione uma nova regra para a consulta DNS clicando em
Altere o campo Protocol de TCP
para UDP
. Navegue até Source, altere o campo Source para DMZ subnets
. Navegue até Destination abaixo e em From escolha a opção DNS (53)
. Insira uma descrição e clique em clique em 💾 Save.
Confirme as mudanças com ✅ Apply Changes.
Repita o processo anterior para permitir atualizações de pacotes e configurações no WAF, adicionando duas regras com
Navegue até Source, altere o campo Source para Address or Alias
e insira o IP 172.100.2.100
em Source address. Navegue até o Destination abaixo e insira as portas WEB ou seu alias em Destination Port Range. Insira uma descrição e clique em 💾 Save.
Crie uma regra para consultas DNS acima e altere o campo Protocol de TCP
para UDP
. Navegue até Source, altere o campo Source para DMZEXT subnets
. Navegue até Destination abaixo e em From escolha a opção DNS (53)
. Insira uma descrição e clique em 💾 Save.
Como o Graylog será usado como Syslog e receberá os logs do WAF, é preciso liberar o tráfego nessa direção adicionando uma nova regra acima. Altere o campo Protocol de TCP
para UDP
, depois, navegue até Source e altere o campo Source para Address or Alias
. Insira o IP 172.100.2.100
em Source address. Navegue até o campo Destination abaixo, altere Destination para Address or Alias
e insira o IP 172.100.1.101
no placeholder Destination address. Logo abaixo, insira a porta 1514
em Destination Port Range. Insira uma descrição e clique em 💾 Save.
Por fim, para permitir que o WAF envie as requisições ao server, adicione uma nova regra acima. Navegue até Source e altere o campo Source para Address or Alias
. Insira o IP 172.100.2.100
em Source address. Navegue até o campo Destination abaixo, altere Destination para Address or Alias
e insira o IP 172.100.1.100
no placeholder Destination address. Logo abaixo, em From escolha a opção HTTP (80)
. Insira uma descrição e clique eem 💾 Save.
Confirme as mudanças com ✅ Apply Changes.
Para garantir o reconhecimento dos IPs do Graylog e do WAF na rede, é necessário realizar a tradução dos endereços de IP através do processo de NAT (Network Address Translation). Para isso, siga o caminho Firewall > NAT > 1:1 e adicione dois novos mapeamentos clicando em
Começando com o Graylog, altere o campo Interface de INTERNET
para INTRANET
. Navegue até External subnet IP e altere o campo Address para 192.168.56.11
. Logo abaixo, em Internal IP, altere o campo Address para 172.100.1.101
. Adicione uma descrição e clique em 💾 Save.
Para configurar o WAF, é importante escolher um IP que esteja na mesma rede da INTERNET e que não esteja em uso. Para verificar isso, execute o seguinte comando no seu terminal CMD utilizando o IP escolhido. No contexto deste projeto, o IP selecionado é 192.168.0.110
.
ping 192.168.0.110
Caso não obtenha uma resposta, o IP está disponível para uso. Repita o mesmo processo de adicionar um mapeamento, mantendo o campo Interface como INTERNET
. Navegue até External subnet IP e altere o campo Address para o IP escolhido. Logo abaixo, em Internal IP, altere o campo Address para 172.100.2.100
. Adicione uma descrição e clique em 💾 Save.
Confirme as mudanças com ✅ Apply Changes.
O último passo para acessar as interfaces do Graylog e WAF é adicionar IPs virtuais correspondentes aos IPs traduzidos para ambos. Para isso, siga o caminho Firewall > Virtual IPs e adicione dois novos IPs clicando em ➕ Add.
Começando com o Graylog, marque a opção IP Alias
em Type e altere a Interface para INTRANET
. No campo Address(es) insira o IP 192.168.56.11/24
. Ao final da página, adicione uma descrição e clique 💾 Save.
Para o WAF, repita o mesmo processo, mantendo a Interface como INTERNET
. No campo Address(es) insira o IP escolhido na etapa anterior, no caso do projeto atual, 192.168.0.110/24
. Ao final da página, adicione uma descrição e clique 💾 Save.
Confirme as mudanças com ✅ Apply Changes.
No menu do pfSense, navegue pelo caminho System > Package Manager > Available Packages. Procure pelo pacote Snort
e instale sua versão mais atualizada.
Para configurar e gerenciar o pacote Snort instalado, navegue em Services > Snort > Interfaces e clique em ➕ Add. Escolha a opção INTERNET (em0)
para Interface e adicione uma descrição. Na seção Alert Settings, habilite as opções Send Alerts to System Log
e Enable Packet Captures
para enviar os logs ao Graylog e ativar a captura de tráfego, respectivamente. Clique em 💾 Save ao final da página.
Ative o Snort nesta interface clicando no ícone
As configurações escolhidas podem ser baixadas e atualizadas através da opção seguinte no menu, Services > Snort > Updates.
Retorne ao VirtualBox e crie uma nova máquina virtual denominada server utilizando o arquivo .iso do Debian que foi previamente baixado.
Após concluir o processo de criação, acesse as configurações de rede do server e ajuste o adaptador da seguinte forma:
-
Adaptador 1:
-
Conectado a:
Rede interna
-
Nome:
DMZ
-
Inicie a máquina e prossiga com o processo de instalação do Debian, desconsiderando as configurações de rede. Finalizada a instalação, execute o seguinte comando para mudar o nome do host:
nano /etc/hostname
Substitua o conteúdo do arquivo pelo seguinte:
server
Salve com Ctrl + O
. Para configurar o servidor DNS, execute o comando:
nano /etc/resolv.conf
Substitua o conteúdo do arquivo pelo seguinte:
nameserver 1.1.1.1
nameserver 1.0.0.1
Salve com Ctrl + O
. Para configurar os hosts, execute o comando :
nano /etc/hosts
Substitua o conteúdo do arquivo pelo seguinte:
127.0.0.1 localhost
172.0.1.1 server.lab server
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Salve com Ctrl + O
. Por fim, para configurar os IPs, execute o comando:
nano /etc/network/interfaces
Substitua o conteúdo do arquivo pelo seguinte:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s3
iface enp0s3 inet static
address 172.100.1.100/24
gateway 172.100.1.10
Salve com Ctrl + O
. Execute os comandos para atualizar as configurações:
update-grub
reboot
Para instalar e ativar o servidor NGINX, execute os comandos:
apt update
apt install nginx
systemctl enable nginx
systemctl restart nginx
Retorne ao VirtualBox e crie uma nova máquina virtual denominada Graylog utilizando o arquivo .iso do Debian que foi previamente baixado.
Após concluir o processo de criação, acesse as configurações de rede do Graylog e ajuste o adaptador da seguinte forma:
-
Adaptador 1:
-
Conectado a:
Rede interna
-
Nome:
DMZ
-
Inicie a máquina e prossiga com o processo de instalação do Debian, desconsiderando as configurações de rede. Finalizada a instalação, execute o seguinte comando para mudar o nome do host:
nano /etc/hostname
Substitua o conteúdo do arquivo pelo seguinte:
graylog
Salve com Ctrl + O
. Para configurar o servidor DNS, execute o comando:
nano /etc/resolv.conf
Substitua o conteúdo do arquivo pelo seguinte:
nameserver 1.1.1.1
nameserver 1.0.0.1
Salve com Ctrl + O
. Para configurar os hosts, execute o comando :
nano /etc/hosts
Substitua o conteúdo do arquivo pelo seguinte:
127.0.0.1 localhost
172.0.1.1 graylog.lab graylog
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Salve com Ctrl + O
. Por fim, para configurar os IPs, execute o comando:
nano /etc/network/interfaces
Substitua o conteúdo do arquivo pelo seguinte:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s3
iface enp0s3 inet static
address 172.100.1.101/24
gateway 172.100.1.10
Salve com Ctrl + O
. Execute os comandos para atualizar as configurações:
update-grub
reboot
Instale o e configure o Graylog seguindo as instruções.
Warning
Devido a questões de compatibilidade, neste projeto a versão do Debian foi alterada de 12 para 11. O MongoDB foi instalado na versão 4.2.21 e o Graylog na versão 4.3.
Acesse a interface do Graylog em http://192.168.56.11:9000
e faça o login com a senha escolhida.
Para configurar o Graylog como um Syslog, siga as recomendações da documentação. Atente-se para a definição do campo Port como 1514
.
Voltando a interface do pfSense, para habilitar o envio de logs ao Graylog, siga o caminho no menu Status > System Logs > Settings.
Navegue até o final da página, no campo Remote Logging Options. Logo abaixo, habilite a opção Send log messages to remote syslog server
. Defina o Source address como DMZ
e adicione o IP 172.100.1.101:1514
em Remote log servers. Marque apenas a opção Firewall Events
abaixo e clique em 💾 Save.
Ao retornar à página inicial do Graylog e clicar em atualizar, os logs do pfSense devem estar disponíveis.
Retorne ao VirtualBox e crie uma nova máquina virtual denominada WAF utilizando o arquivo .iso do Debian que foi previamente baixado.
Após concluir o processo de criação, acesse as configurações de rede do WAF e ajuste o adaptador da seguinte forma:
-
Adaptador 1:
-
Conectado a:
Rede interna
-
Nome:
DMZEXT
-
Inicie a máquina e prossiga com o processo de instalação do Debian, desconsiderando as configurações de rede. Finalizada a instalação, execute o seguinte comando para mudar o nome do host:
nano /etc/hostname
Substitua o conteúdo do arquivo pelo seguinte:
server
Salve com Ctrl + O
. Para configurar o servidor DNS, execute o comando:
nano /etc/resolv.conf
Substitua o conteúdo do arquivo pelo seguinte:
nameserver 1.0.0.1
nameserver 1.1.1.1
Salve com Ctrl + O
. Para configurar os hosts, execute o comando :
nano /etc/hosts
Substitua o conteúdo do arquivo pelo seguinte:
127.0.0.1 localhost
172.100.2.100 waf.lab waf
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Salve com Ctrl + O
. Por fim, para configurar os IPs, execute o comando:
nano /etc/network/interfaces
Substitua o conteúdo do arquivo pelo seguinte:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s3
iface enp0s3 inet static
address 172.100.2.100/24
gateway 172.100.2.10
Salve com Ctrl + O
. Execute os comandos para atualizar as configurações:
update-grub
reboot
Instale o e configure o ModSecurity + NGINX seguindo as instruções.
Para enviar os logs do WAF ao Graylog, execute o comando:
nano /usr/local/nginx/conf/nginx.conf
No arquivo, abaixo de error_log /var/log/nginx/error.log;
adicione o seguinte texto:
access_log syslog:server=172.100.1.101:1514;
error_log syslog:server=172.100.1.101:1514;
Salve com Ctrl + O
. Confira se a configuração foi adicionada corretamente executando o comando:
nginx -t
Por fim, recarregue o NGINX com as novas configurações executando o comando:
nginx -s reload
Para verificar se o WAF está operacional e se os logs estão sendo enviados corretamente para o Graylog, acesse a interface do WAF utilizando o IP traduzido nesta etapa. Teste com algum ataque, como exemplo:
http://192.168.0.110/?exec=/bin/bash
Caso tudo esteja funcionado de maneira correta, os logs do WAF devem aparecer na página inicial do Graylog.
Crie um certificado SSL auto assinado seguindo as instruções.
Configure o proxy reverso executando os comandos:
mkdir /usr/local/nginx/sites-available
cd /usr/local/nginx/sites-available
nano site.lab_conf
Altere o conteúdo do arquivo para o seguinte:
server {
listen 443 ssl;
ssl_certificate /usr/local/nginx/certssl/example.crt;
ssl_certificate_key /usr/local/nginx/certssl/example.key;
server_name site.lab;
location / {
proxy_pass http://172.100.1.100/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Salve com Ctrl+O
. Feito isso, execute os comandos:
cd
mkdir /usr/local/nginx/sites-enabled/
ln -s /usr/local/nginx/sites-available/site.lab_conf /usr/local/nginx/sites-enabled/site.lab_conf
Execute o comando para editar o arquivo de configurações do NGINX:
nano /usr/local/nginx/conf/nginx.conf
E adicione o seguinte texto dentro do bloco http
:
include /usr/local/nginx/sites-enabled/*;
Salve com Ctrl+O
e confira se as configurações estão corretas executando:
nginx -t
Por fim, recarregue o NGINX com as novas configurações.
nginx -s reload
Volte ao Graylog e busque pela palavra Modsecurity. Clique em algum log e, dentro dele, clique em uma message e em Create extractor
. Selecione a opção Regular Expression
e clique em Submit
.
No campo Regular Expression, para cada extractor, insira expressões regulares para extrair informações importantes do log com facilidade, como exemplo:
- IP do client
^.*\[client\ (.*)\] ModSecurity.*$
- ID da regra
^.*\[client\ (.*)\] ModSecurity.*$
- Código da ameaça
^.*code (\d+).*$
- Severidade da ameaça
^.*\[severity\ \"(\d*)\"\]\ \[ver.*$
Altere a Condition para Only attempt extraction if field contains string
e, no campo Field contains string abaixo, insira ModSecurity:
. Adicione um nome para o campo novo, um título para o extrator e ao final clique em Create extractor
.
Para os logs do pfSense, retorne para a página inicial do Graylog e procure pela palavra filterlog. Clique em algum log e, dentro dele, clique em uma message e em Create extractor
. Selecione a opção GROK pattern
e clique em Submit
.
No campo Regular Expression, adicione padrões sucessivos para extrair informações importantes do log com facilidade. Como exemplo, o padrão abaixo remove informações desnecessárias e mostra os seguintes dados do log: número da regra, interface, motivo do log, ação do firewall, direção do tráfego, versão do IP, protocolo, IPs de origem e destino, portas de origem e destino.
%{BASE10NUM:rule},%{DATA:UNWANTED},%{DATA:UNWANTED},%{DATA:UNWANTED},%{WORD:iface},%{WORD:motive},%{WORD:action},%{WORD:direction},%{BASE10NUM:ip_version},%{DATA:UNWANTED},%{DATA:UNWANTED},%{DATA:UNWANTED},%{DATA:UNWANTED},%{DATA:UNWANTED},%{DATA:UNWANTED},%{DATA:UNWANTED},%{WORD:protocol},%{DATA:UNWANTED},%{IPV4:source_ip},%{IPV4:destination_ip},%{BASE10NUM:source_port},%{BASE10NUM:destination_port}
Altere a Condition para Only attempt extraction if field contains string
e, no campo Field contains string abaixo, insira filterlog
. Adicione um nome para o campo novo, um título para o extrator e ao final clique em Create extractor
.
Utilizando o Graylog, os extractors criados podem ser utilizados para gerar Dashboards com informações valiosas.
Para isso, no menu, clique em Dashboards e depois em Create new dashboard. Localize o ícone de ➕ o lado esquerdo do painel e clique nele. Ao abrir as opções, selecione Aggregation
. Edite a agregação conforme necessário para obter as informações desejadas de forma ágil. Por exemplo, a agregação abaixo demonstra a relação entre bloqueios e permissões do pfSense em forma de porcentagem.
Finalizando as configurações do sistema, habilite o acesso remoto com o SSH.
Na interface do pfSense, navegue pelo menu System > Advanced. Navegue abaixo até Secure Shell, e em Secure Shell Server habilite a opção Enable Secure Shell
. Clique em 💾 Save ao final da página.
Em cada uma das máquinas, execute o comando abaixo e garanta que o SSH está instalado.
apt update
apt install openssh-server
Em suma, a implementação meticulosa de medidas de segurança, como segmentação em zonas e a integração de múltiplas camadas de defesa, incluindo Firewall, IDS/IPS e WAF, demonstrou ser eficaz na proteção contra possíveis ameaças e ataques cibernéticos. A simulação realizada no Virtualbox, com quatro máquinas distintas - WAF, Server, Firewall e SIEM - ilustrou a aplicação prática dessas medidas. Todos os requisitos implementados formam uma defesa sólida e abrangente, essencial para enfrentar os desafios constantes do cenário cibernético atual.