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).
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)
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:
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).
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.
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!
Muito boas as informações, parabéns Marcos.
Eu gostaria de saber se seria possível aplicar as regras de bloqueio por horário.
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.