UFW: Descomplicando o Firewall

Alejandro Druetta
PermaLink Univesp
Published in
5 min readJul 2, 2021

--

Firewalls são fundamentais na hora de proteger sistemas e redes locais de ameaças originadas na Internet. Estes softwares conseguem analizar determinadas características dos pacotes trafegados -de fora para dentro, ou viceversa- pelo sistema que queremos proteger, e baseados em regras, determinar se o pacote tem direito de continuar o seu caminho ou precisa ser barrado.

Em servidores Linux estas regras costumam ser configuradas via iptables. Este recurso é extremamente flexível e poderoso, mas também costuma ser temido por administradores menos experientes (que nem eu). Felizmente, existe um frontend para iptables que facilita em grande medida a configuração dessas regras de firewall. E é dele que aqui iremos falar.

UFW — The Uncomplicated Firewall

Vamos descrever o nosso cenário básico: Temos um servidor Web na nuvem, configurado a partir de uma instância Ubuntu Server 20.04, aceitando requisições HTTP e HTTPS nas portas 80 e 443. Também queremos acessar a nossa instância via protocolo SSH para realizar qualquer tipo de tarefa administrativa (como instalar e configurar serviços, contas de usuário, acessar logs, etc) da forma mais segura possível. Bom, con UFW é bem fácil configurar as regras básicas para proteger o nosso sistema de vários ataques (embora não todos eles, claro).

Poderíamos descrever as nossas regras da seguinte forma. O firewall tem que:

  1. Permitir conexões entrantes pelo protocolo SSH na porta padrão 22 (ou aquela que tenha sido configurada em /etc/ssh/ssh_config) ;
  2. Permitir conexões entrantes pelo protocolo HTTP na porta 80;
  3. Permitir conexões entrantes pelo protocolo HTTPS na porta 443;
  4. Permitir qualquer tentativa de conexão hacia o exterior, independente do protocolo que for;
  5. Denegar qualquer tentativa de conexão entrante que não for explicitamente permitida por alguma das regras anteriores.

Mão na massa

Primeiro verificamos se o UFW está instalado no sistema e qual é o seu status:

$ sudo ufw status
Status: inactive

O seguinte passo é definir as regras que formam a base da nossa configuração. Elas se correspondem, grosso modo, com as regras 4 e 5 da nossa lista: autorizar todas as saídas e proibir qualquer entrada que não tenha sido explicitamente autorizada:

$ sudo ufw default allow outgoing
$ sudo ufw default deny incoming

Na verdade, essa é a configuração padrão do UFW, por tanto, na maioria dos sistemas não seria necessário rodar esses comandos, mas, sempre é bom se garantir.

Agora queremos ter certeza, antes do que nada, de que não vamos perder a capacidade de conectarmos com o nosso servidor. Então, importantíssimo, previo a se ativar o firewall (ele ainda está inativo), precisamos configurar a primeira regra definida na nossa lista:

$ sudo ufw allow ssh

Essa regra vai habilitar as conexões via protocolo SSH na porta padrão 22. Se você configurou o daemon SSH para aceitar conexões em uma outra porta, digamos, a 2022, por exemplo, a regra ficaria assim:

$ sudo ufw allow 2022/tcp

Feito isso, agora sim, podemos ativar o firewall:

$ sudo ufw enable

Se a gente fez tudo certinho, não vamos ficar barrado pelo firewall e poderemos verificar o status com:

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)

Falta liberar os serviços Web que vão rodar no nosso servidor. Muito simples também:

$ sudo ufw allow http
$ sudo ufw allow https

Ou, tanto faz, já que o resultado seria o mesmo:

$ sudo ufw allow 80,443/tcp

Se agora consultarmos o status, vamos ter o que queríamos desde o começo:

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)

As possibilidades de customização são inúmeras. Aqui vamos dar apenas alguns exemplos para motivar você a seguir pesquisando.

Imagine que você tem um endereço IP fixo desde o qual costuma conectar com o servidor. Talvez seria uma boa ideia habilitar o acesso à conexão SSH apenas desde esse endereço. Se alguém conseguir roubar as suas credenciais e quiser conectar desde um outro endereço, debería ser barrado. Mas não esqueça, se você for precisar conectar desde um outro endereço, você também será barrado:

$ sudo ufw allow proto tcp from 123.112.0.123 to any port 22

Outra alternativa seria a de restringir aqueles acessos que os logs do sistema apontam como suspeitos de estar tentando acessos não autorizado, por exemplo:

$ sudo ufw deny from 123.115.0.100 to any port 22

Logging

O UFW consegue gerar logs de sistema, registrando os eventos gerados sempre que houver uma tentativa de acesso ou egresso que vai ao encontro de alguma das regras configuradas. Dependendo do seu sistema, pode ser necessário ativar esta função de logging:

$ sudo ufw logging on

Esses logs podemos consultá-los assim:

$ sudo less /var/log/ufw.log

Ou assim:

$ sudo dmesg -H | grep UFW

Uma linha típica do log poderia ser essa:

[+0,000497] [UFW BLOCK] IN=wlp2s0 OUT= MAC=01:00:5e:00:00:01:ac:3b:77:a5:95:d4:08:00 SRC=192.168.2.1 DST=224.0.0.1 LEN=36 TOS=0x00 PREC=0x00 TTL=1 ID=0 PROTO=2

Onde iremos achar informações como:

  • IN: Trata-se de um evento entrante. Informa também a interface de rede;
  • OUT: Evento de saída;
  • MAC: A combinação dos endereços MAC de destino e de origem;
  • SRC: Endereço IP de origem;
  • DST: Endereço IP de destino;
  • LEN: Tamanho do pacote;
  • TTL: Time-to-Live, o tempo até o pacote expirar se ele não consegue atingir o seu destino;
  • PROTO: O protocolo do pacote;
  • SPT: A porta de origem do pacote;
  • DPT: A porta de destino;
  • WINDOW: O tamanho máximo de pacote que o destinatario consegue receber;
  • SYN URGP: Fala se o procedimento conhecido como three-way handshake, típico de protocolos orientados a conexão como o TCP é requerido.

Conclusões

Se você já tentou configurar seu servidor usando diretamente as iptables, acredito que vai concordar que o Uncomplicated Firewall é bem mais amigável; e para vários cenários de uso, o suficientemente flexível e poderoso como para atender as nossas necessidades. Faça o teste, crie sua máquina virtual, brinque um pouco, e veja o que você acha. Até mais.

--

--