banner-post-DNS-RPZ-com-Raspberry-Pi

DNS RPZ: Transforme sua Raspberry Pi em um firewall DNS 2

RPZ ou Response Policy Zones é um recurso que permite reescrever ou bloquear respostas a consultas DNS. O uso de RPZ pode transformar seu DNS em um firewall DNS portátil, restringindo o acesso a domínios potencialmente maliciosos ou indesejados. Ao final desse post, os dispositivos conectados a sua rede estarão protegidos contra alguns dos principais domínios conhecidos por hospedar malware, bem como dos famigerados anúncios indesejados (adware).

foto de um roteador de rede cabeada com vários cabos conectados com o título DNS RPZ sobreposto

Material necessário para o firewall DNS com Raspberry Pi

Para realizar este projeto, vamos precisar de:

– 1x Raspberry Pi 4 Model B Anatel (4GB)
– 1x Cartão de memória de, no mínimo, 8 GB (recomendável: 16 GB)
– 1x Fonte DC Chaveada 5V 3A USB Tipo C

O que é DNS?

“O Sistema de Nomes de Domínio (DNS), funciona análogo a uma lista telefônica, consulta-se um nome em busca de um número, um conceito simples mas poderoso, imagine você tendo que digitar 104.28.25.174 ao invés de www.makerhero.com. Quando contratamos um provedor de Internet, ele fornece alguns endereços de servidores DNS para fazermos nossas consultas, é possível também utilizar servidores DNS públicos (Google, OpenDNS e CloudFlare) […] A proposta desse post é criar um servidor DNS recursivo com Raspberry Pi, basicamente porque ele será mais rápido, pois há uma relação direta entre distância e velocidade, e não há lugar mais perto do que dentro de casa, terá mais segurança, pois estará dentro da rede local, mais distante do ataque de cibercriminosos e terá mais privacidade, pois as consultas não passarão por servidores DNS de terceiros.“ (Servidor DNS recursivo com Raspberry Pi)

diagrama de DNS recursivo
Diagrama do Servidor DNS Recursivo

O que é RPZ?

É um método que permite fornecer respostas alternativas às consultas DNS. Também é conhecido como firewall DNS, pois permite bloquear o acesso a determinados nomes de domínio. O uso mais comum de um firewall DNS é envenenar nomes de domínio sabidamente maliciosos. O envenenamento geralmente é feito forçando uma resposta artificial de “domínio não existe”, tornando esses domínios inacessíveis. Por exemplo, se tivermos este registro:

$ORIGIN rpz.local.
coronavirus.com CNAME .
*.coronavirus.com CNAME .

Tanto o nome de domínio (coronavirus.com), como qualquer subdomínio (*.coronavirus.com) receberão uma resposta de “domínio não existe” (CNAME .). Algo como:

printscreen de tela com erro de DNS

Obviamente, usei o exemplo do coronavírus de forma simbólica, como algo que todos gostaríamos de bloquear.

Na prática, um firewall DNS é tão forte quanto o conhecimento dos domínios maliciosos a serem filtrados. E manter-se atualizado com esta sempre crescente lista, com dezenas de milhares de nomes de domínio, é quase impossível. Felizmente, existem agências de inteligência e segurança que fornecem essas listas (feeds), incluindo algumas gratuitas. São essas que usaremos a seguir.

Instalação e configuração do DNS

A instalação e configuração do DNS é tema do post Servidor DNS recursivo com Raspberry Pi. Antes de continuar é preciso passar por lá, é rápido eu garanto, e colocar o DNS para funcionar.

Atualização do DNS

O suporte a RPZ foi implementado a partir da versão 1.10.0 do Unbound. Acontece que no atual Raspberry Pi OS (buster) a versão do Unbound é a 1.9.0. Para resolver esse pequeno imprevisto, vamos usar pacotes “backports”. São apenas três comandos:

echo 'deb http://deb.debian.org/debian buster-backports main' >> /etc/apt/sources.list

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC &&
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138

apt update && apt install unbound/buster-backports -y

Para verificar a versão:

unbound -V

Configuração do RPZ

Como dito anteriormente, usaremos listas (feeds) fornecidas por agências de inteligência e segurança, mais especificamente ScriptTiger e Energized Protection.

Essas listas precisam ser baixadas para o diretório /etc/unbound:

cd /etc/unbound && wget -O blacklist.txt
https://scripttiger.github.io/alts/rpz/blacklist.txt && sed -i '1i $ORIGIN
rpz.scripttiger.github.io.' blacklist.txt && wget -O rpz.txt
https://block.energized.pro/spark/formats/rpz.txt

A implementação do RPZ no Unbound depende do módulo respip, carregado usando module-config, e da cláusula rpz.

É um processo realmente muito simples, basta editar o arquivo de configuração do Unbound (fazendo uma cópia de segurança antes):

cp -p unbound.conf unbound.conf.old && vim unbound.conf

Incluir a linha abaixo logo após a cláusula server:

module-config: "respip validator iterator"

E as linhas abaixo no final do arquivo:

rpz:
	# nome
	name: rpz.scripttiger.github.io
	# nome do arquivo (baixado)
	zonefile: blacklist.txt
	# registre as ações RPZ no arquivo de log
	rpz-log: yes
	# nome que aparecerá no arquivo de log
	rpz-log-name: rpz.scripttiger.github.io

rpz:
	# nome
	name: rpz.energized.pro.spark
	# nome do arquivo (baixado)
	zonefile: rpz.txt
	# registre as ações RPZ no arquivo de log
	rpz-log: yes
	# nome que aparecerá no arquivo de log
	rpz-log-name: rpz.energized.pro.spark

Verificar por erros no arquivo de configuração:

unbound-checkconf

O resultado esperado é unbound-checkconf: no errors in /etc/unbound/unbound.conf

E reiniciar o serviço:

systemctl restart unbound

Por último, vamos agendar para que a atualização das listas (feeds) seja feita diariamente às 8:00. Basta editar o arquivo:

vim /etc/crontab

E incluir as linhas abaixo no final do arquivo:

00 8	* * *   root     cd /etc/unbound && wget -O blacklist.txt
https://scripttiger.github.io/alts/rpz/blacklist.txt && sed -i '1i $ORIGIN
rpz.scripttiger.github.io.' blacklist.txt && wget -O rpz.txt 
https://block.energized.pro/spark/formats/rpz.txt

Testando o DNS RPZ com Rasberry Pi

No site URLhaus, um projeto cujo objetivo é coletar, rastrear e compartilhar URLs de malware, escolhi aleatoriamente um domínio usado para distribuir malware.

Usando o DNS com RPZ recém configurado, a resposta foi “domínio não existe”. Ou seja, estamos protegidos contra esse malware. O mesmo comportamento é adotado com os anúncios indesejados (adware).

printscreen de tela com erro de DNS

Já usando um conhecido DNS público, é possível baixar e executar inadvertidamente um malware no seu dispositivo. Além de visualizar uma enxurrada de anúncios.

printscreen de tela de download do cc.exe da veronika.ac.ug

Bonus track (opcional)

Opcionalmente, é possível criar sua própria lista de domínios, por exemplo, incluindo algumas redes sociais que atrapalham as aulas online das crianças ou a produtividade no trabalho.

Para começar vamos criar o arquivo:

vim rpz.local

E incluir as linhas abaixo:

$ORIGIN rpz.local.
facebook.com	CNAME .
*.facebook.com	CNAME .
twitter.com	CNAME .
*.twitter.com	CNAME .
youtube.com	CNAME .
*.youtube.com	CNAME .
instagram.com	CNAME .
*.instagram.com	CNAME .

Usando a funcionalidade de tags é possível aplicar essas restrições de forma personalizada, para apenas alguns dispositivos da sua rede.

Novamente, é um processo realmente muito simples, basta editar o arquivo de configuração do Unbound (fazendo uma cópia de segurança antes):

cp -p unbound.conf unbound.conf.old1 && vim unbound.conf

Incluir as linhas abaixo logo após a cláusula module-config: “respip validator iterator”. Não se esqueça de substituir 192.168.0.50 pelo enderço IP do dispositivo que terá o acesso negado às redes sociais.

# Define a tag que pode ser usada com access-control-tag
define-tag: "redes-sociais"

# Combina a tag com o endereço IP do dispositivo a ser limitado
access-control-tag: 192.168.0.50/32 "redes-sociais"

E as linhas abaixo no final do arquivo:

rpz:
	# nome
	name: rpz.local
	# nome do arquivo
	zonefile: rpz.local
	# registre as ações RPZ no arquivo de log
	rpz-log: yes
	# nome que aparecerá no arquivo de log
	rpz-log-name: rpz.local
	# limita essa cláusula aos dispositivos com uma tag correspondente. 
	tags: "redes-sociais"

Verificar por erros no arquivo de configuração:

unbound-checkconf

O resultado esperado é unbound-checkconf: no errors in /etc/unbound/unbound.conf

E reiniciar o serviço:

systemctl restart unbound

Nesse exemplo, meu computador (192.168.0.50) não tem mais acesso ao Facebook, Twitter, Instagram e Youtube.

Conclusão

O RPZ ou firewall DNS é um recurso fantástico que permite a quem administra seu próprio DNS (você) implementar uma camada extra de segurança e privacidade no acesso a Internet. Com uma configuração relativamente simples. Bloqueia malwares e anúncios, aumenta a privacidade, reduz o tempo de carregamento das páginas, é compatível com todos os dispositivos da sua rede, independentemente do sistema operacional e ainda permite criar listas de bloqueio personalizadas. Não tem mais desculpas para usar DNS público ou do provedor de Internet. Faça você mesmo o seu DNS RPZ com Rasberry Pi!

Faça seu comentário

Acesse sua conta e participe

2 Comentários

  1. Muito boas as informações, parabéns Marcos.

    Eu gostaria de saber se seria possível aplicar as regras de bloqueio por horário.

    1. Obrigado.

      O jeito alternativo (gambiarra) é configurar o cron para alternar entre um arquivo com as regras de bloqueio e outro sem regras de bloqueio. Algo assim.

      O jeito correto é usar um Proxy, como o Squid.