Segurança e Hardening de Servidores DNS BIND no Oracle Linux 9
Este é o quinto artigo de nossa série sobre implementação e configuração do DNS BIND no Oracle Linux 9. Nos artigos anteriores, abordamos os conceitos fundamentais do DNS, a instalação e configuração básica, a configuração de zonas DNS e a implementação de views e DNS Split-Horizon. Agora, vamos focar na segurança e hardening do servidor DNS.
Introdução
O DNS é um componente crítico da infraestrutura de rede, e sua segurança é fundamental para proteger não apenas o próprio serviço, mas toda a organização. Um servidor DNS comprometido pode levar a diversos problemas, desde redirecionamento de tráfego e interceptação de dados até ataques de negação de serviço e comprometimento de outros sistemas.
Neste artigo, abordaremos técnicas abrangentes de segurança e hardening para servidores DNS BIND no Oracle Linux 9. Vamos explorar desde configurações básicas de permissões e SELinux até implementações avançadas como TSIG e DNSSEC, além de discutir melhores práticas e estratégias de mitigação contra ameaças comuns.
Ao final deste tutorial, você terá um servidor DNS BIND significativamente mais seguro e resistente a ataques, mantendo a funcionalidade e o desempenho necessários para sua operação.
Modelo de Segurança em Camadas para DNS
A segurança eficaz de servidores DNS deve seguir um modelo de defesa em camadas, onde múltiplas medidas de proteção são implementadas em diferentes níveis. Vamos explorar este modelo:
Camada 1: Segurança do Sistema Operacional
- Manter o sistema operacional atualizado
- Configurar corretamente o firewall
- Implementar SELinux
- Configurar permissões de arquivos e diretórios
- Minimizar serviços em execução
- Implementar monitoramento e logging
Camada 2: Segurança da Configuração do BIND
- Restringir interfaces de escuta
- Implementar controle de acesso com ACLs
- Limitar recursão e transferências de zona
- Ocultar informações de versão
- Configurar rate limiting
- Implementar views para separação de contextos
Camada 3: Segurança das Transações DNS
- Implementar TSIG para transferências de zona
- Configurar atualizações dinâmicas seguras
- Implementar DNSSEC para autenticação e integridade de dados
- Utilizar DNS over TLS (DoT) ou DNS over HTTPS (DoH) quando aplicável
Camada 4: Monitoramento e Resposta a Incidentes
- Configurar logging detalhado
- Implementar monitoramento em tempo real
- Estabelecer procedimentos de resposta a incidentes
- Realizar auditorias regulares
- Testar a segurança periodicamente
Vamos explorar cada uma dessas camadas em detalhes.
+--------------------------------------------------+
| Camada 4: Monitoramento e Resposta a Incidentes |
| (Logging, Monitoramento, Auditoria, Resposta) |
+---------------------+----------------------------+
|
+---------------------+----------------------------+
| Camada 3: Segurança das Transações DNS |
| (TSIG, DNSSEC, DoT/DoH, Atualizações Seguras) |
+---------------------+----------------------------+
|
+---------------------+----------------------------+
| Camada 2: Segurança da Configuração do BIND |
| (ACLs, Recursão, Rate Limit, Views, Ocultação) |
+---------------------+----------------------------+
|
+---------------------+----------------------------+
| Camada 1: Segurança do Sistema Operacional |
| (Updates, Firewall, SELinux, Permissões, Minimização)|
+--------------------------------------------------+
Figura 1: Modelo de Segurança em Camadas para DNS
Segurança do Sistema Operacional
Atualizações de Segurança
Manter o sistema operacional atualizado é a base de qualquer estratégia de segurança. O Oracle Linux 9 fornece atualizações regulares de segurança que devem ser aplicadas prontamente.
Para verificar e instalar atualizações:
1
2
sudo dnf check-update
sudo dnf update -y
Para automatizar atualizações de segurança, você pode configurar o dnf-automatic:
1
2
sudo dnf install dnf-automatic -y
sudo vi /etc/dnf/automatic.conf
Edite o arquivo para configurar atualizações automáticas de segurança:
1
2
3
4
5
6
7
8
9
10
11
12
[commands]
upgrade_type = security
random_sleep = 360
download_updates = yes
apply_updates = yes
[emitters]
system_name = example.com DNS Server
emit_via = email
email_from = dnf-automatic@example.com
email_to = admin@example.com
email_host = localhost
Ative e inicie o serviço:
1
sudo systemctl enable --now dnf-automatic.timer
Configuração do Firewall
O firewall é uma parte essencial da segurança do servidor DNS. O Oracle Linux 9 usa firewalld por padrão.
Configuração básica para servidor DNS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Permitir tráfego DNS (TCP e UDP na porta 53)
sudo firewall-cmd --permanent --add-service=dns
# Se você estiver usando DNSSEC, pode precisar permitir tráfego adicional
sudo firewall-cmd --permanent --add-port=953/tcp # Para rndc
# Se você estiver usando estatísticas via web
sudo firewall-cmd --permanent --add-port=8080/tcp # Ajuste conforme necessário
# Recarregar o firewall
sudo firewall-cmd --reload
# Verificar a configuração
sudo firewall-cmd --list-all
Para uma segurança mais rigorosa, você pode limitar o acesso apenas a IPs específicos:
1
2
3
4
5
6
# Criar uma zona personalizada para DNS
sudo firewall-cmd --permanent --new-zone=dns-access
sudo firewall-cmd --permanent --zone=dns-access --add-service=dns
sudo firewall-cmd --permanent --zone=dns-access --add-source=192.168.200.0/24
sudo firewall-cmd --permanent --zone=dns-access --add-source=10.10.0.0/16
sudo firewall-cmd --reload
Configuração de SELinux
O Security-Enhanced Linux (SELinux) é uma poderosa camada de segurança que implementa controle de acesso mandatório. No Oracle Linux 9, o SELinux está ativado por padrão no modo enforcing, e é altamente recomendável mantê-lo assim.
Verificação do Status do SELinux
1
sudo sestatus
A saída deve mostrar que o SELinux está em modo enforcing.
Contextos SELinux para o BIND
O BIND utiliza vários contextos SELinux específicos:
- named_conf_t: Para arquivos de configuração
- named_zone_t: Para arquivos de zona
- named_cache_t: Para arquivos de cache e dados dinâmicos
- named_log_t: Para arquivos de log
- named_var_run_t: Para arquivos de runtime (PID, etc.)
Configuração de Contextos para Diretórios e Arquivos
Se você seguiu os tutoriais anteriores, já configurou os contextos básicos. Vamos revisar e expandir:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Contexto para arquivos de configuração
sudo semanage fcontext -a -t named_conf_t "/etc/named(/.*)?"
sudo semanage fcontext -a -t named_conf_t "/etc/named.conf"
sudo semanage fcontext -a -t named_conf_t "/etc/named.*.conf"
sudo restorecon -Rv /etc/named*
# Contexto para arquivos de zona
sudo semanage fcontext -a -t named_zone_t "/var/named/zones(/.*)?"
sudo restorecon -Rv /var/named/zones
# Contexto para diretório de logs
sudo semanage fcontext -a -t named_log_t "/var/log/named(/.*)?"
sudo restorecon -Rv /var/log/named
# Contexto para diretório de dados dinâmicos
sudo semanage fcontext -a -t named_cache_t "/var/named/dynamic(/.*)?"
sudo restorecon -Rv /var/named/dynamic
# Contexto para diretório de estatísticas
sudo semanage fcontext -a -t named_cache_t "/var/named/data(/.*)?"
sudo restorecon -Rv /var/named/data
Booleans SELinux para o BIND
O SELinux utiliza “booleans” para controlar aspectos específicos do comportamento:
1
2
# Listar booleans relacionados ao named
sudo getsebool -a | grep named
Alguns booleans importantes:
1
2
3
4
5
6
7
8
# Permitir que o BIND escreva em zonas primárias (para atualizações dinâmicas)
sudo setsebool -P named_write_master_zones on
# Permitir que o BIND se conecte a bancos de dados (para zonas DLZ)
sudo setsebool -P named_bind_http_port on
# Permitir que o BIND se conecte a servidores LDAP (se necessário)
sudo setsebool -P named_connect_ldap on
Troubleshooting de SELinux
Se o BIND não estiver funcionando corretamente devido a restrições do SELinux, você pode usar estas ferramentas para diagnóstico:
1
2
3
4
5
# Verificar mensagens de negação do SELinux
sudo ausearch -m avc -ts recent | grep named
# Usar o sealert para analisar problemas
sudo sealert -a /var/log/audit/audit.log | grep named
O pacote setroubleshoot-server fornece ferramentas adicionais:
1
2
sudo dnf install setroubleshoot-server -y
sudo sealert -b
Permissões de Arquivos e Diretórios
Configurar corretamente as permissões de arquivos e diretórios é fundamental para a segurança do BIND.
Permissões para Arquivos de Configuração
1
2
3
4
5
6
sudo chown root:named /etc/named.conf
sudo chmod 640 /etc/named.conf
sudo chown -R root:named /etc/named
sudo find /etc/named -type d -exec chmod 750 {} \;
sudo find /etc/named -type f -exec chmod 640 {} \;
Permissões para Arquivos de Zona
1
2
3
sudo chown -R root:named /var/named/zones
sudo find /var/named/zones -type d -exec chmod 750 {} \;
sudo find /var/named/zones -type f -exec chmod 640 {} \;
Permissões para Diretório de Logs
1
2
3
sudo chown -R named:named /var/log/named
sudo chmod 750 /var/log/named
sudo find /var/log/named -type f -exec chmod 640 {} \;
Permissões para Diretório de Dados Dinâmicos
1
2
sudo chown -R named:named /var/named/dynamic
sudo chmod 770 /var/named/dynamic
Permissões para Diretório de Estatísticas
1
2
3
sudo mkdir -p /var/named/data
sudo chown -R named:named /var/named/data
sudo chmod 770 /var/named/data
Minimização de Serviços
Um princípio fundamental de segurança é executar apenas os serviços necessários no servidor.
1
2
3
4
5
# Listar serviços em execução
sudo systemctl list-units --type=service --state=running
# Desabilitar serviços desnecessários
sudo systemctl disable --now service_name
Para um servidor DNS dedicado, considere desabilitar serviços como:
- cups (impressão)
- avahi-daemon (descoberta de serviços)
- bluetooth
- outros serviços não essenciais
Configuração de Auditoria
O sistema de auditoria do Linux pode ser configurado para monitorar atividades críticas:
1
2
3
4
5
6
7
8
# Instalar auditd se ainda não estiver instalado
sudo dnf install audit -y
# Iniciar e habilitar o serviço
sudo systemctl enable --now auditd
# Configurar regras de auditoria para o BIND
sudo vi /etc/audit/rules.d/named.rules
Adicione as seguintes regras:
1
2
3
4
5
6
7
8
9
# Monitorar acesso aos arquivos de configuração do BIND
-w /etc/named.conf -p wa -k named_config
-w /etc/named -p wa -k named_config
# Monitorar acesso aos arquivos de zona
-w /var/named/zones -p wa -k named_zones
# Monitorar o binário do named
-w /usr/sbin/named -p x -k named_exec
Recarregue as regras:
1
sudo auditctl -R /etc/audit/rules.d/named.rules
Para verificar eventos de auditoria:
1
2
3
sudo ausearch -k named_config
sudo ausearch -k named_zones
sudo ausearch -k named_exec
Segurança da Configuração do BIND
Restrição de Interfaces de Escuta
Limite as interfaces em que o BIND escuta para reduzir a superfície de ataque:
1
2
3
4
5
6
7
8
9
10
options {
// Listen only on specific interfaces
listen-on port 53 {
127.0.0.1;
192.168.200.49; // IP interno
};
listen-on-v6 port 53 { ::1; };
// ...
};
Ocultação de Informações de Versão
Oculte informações sobre a versão do BIND para dificultar o reconhecimento:
1
2
3
4
5
6
7
8
options {
// Hide version information
version none;
hostname none;
server-id none;
// ...
};
Implementação de Rate Limiting
Configure rate limiting para mitigar ataques de amplificação e outros abusos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
options {
// Rate limiting configuration
rate-limit {
responses-per-second 10;
window 5;
qps-scale 250;
errors-per-second 5;
nxdomains-per-second 5;
slip 2;
exempt-clients { trusted_clients; };
};
// ...
};
Controle de Acesso Rigoroso
Implemente ACLs rigorosas para controlar quem pode fazer o quê:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ACLs
acl "trusted_clients" {
localhost;
192.168.200.0/24; // Rede interna
};
acl "dns_servers" {
192.168.200.49; // Este servidor
192.168.200.50; // Servidor secundário
};
options {
// Access control
allow-query { trusted_clients; };
allow-recursion { trusted_clients; };
allow-transfer { dns_servers; };
allow-update { none; };
allow-notify { dns_servers; };
// ...
};
Configuração de Recursão Segura
A recursão é uma funcionalidade necessária, mas também uma fonte potencial de vulnerabilidades:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
options {
// Recursion settings
recursion yes;
allow-recursion { trusted_clients; };
// Additional security for recursion
additional-from-auth no;
additional-from-cache no;
// Prevent cache poisoning
prefetch 2 9;
// ...
};
Proteção Contra Cache Poisoning
Implemente medidas para proteger contra envenenamento de cache:
1
2
3
4
5
6
7
8
9
10
options {
// DNS Cache poisoning prevention
dnssec-validation auto;
// Use 0x20 bit encoding for additional protection
use-v4-udp-ports { range 1024 65535; };
use-v6-udp-ports { range 1024 65535; };
// ...
};
Configuração de Response Policy Zones (RPZ)
As RPZs permitem bloquear domínios maliciosos:
1
2
3
4
5
6
7
8
9
10
11
12
13
// RPZ configuration
options {
// ...
response-policy {
zone "rpz.example.com";
};
};
zone "rpz.example.com" {
type master;
file "zones/rpz.example.com.zone";
allow-query { none; };
};
Exemplo de arquivo de zona RPZ:
1
2
3
4
5
6
7
8
9
10
11
12
13
$TTL 86400
@ IN SOA localhost. root.localhost. (
2025052101 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS localhost.
; Block malicious domains
malware.example.net CNAME .
*.malware.example.net CNAME .
phishing.example.org CNAME .
Segurança das Transações DNS
Implementação de TSIG para Transferências de Zona
O TSIG (Transaction Signature) usa criptografia de chave simétrica para autenticar transações DNS, como transferências de zona e atualizações dinâmicas.
Geração de Chave TSIG
1
2
3
4
5
# Gerar uma chave TSIG
sudo dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST transfer-key
# Extrair a chave do arquivo gerado
sudo cat Ktransfer-key.*.private | grep Key
Configuração de TSIG no named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// TSIG key definition
key "transfer-key" {
algorithm hmac-sha256;
secret "your-base64-encoded-secret-key";
};
// Use the key for zone transfers
server 192.168.200.50 {
keys { transfer-key; };
};
zone "example.com" {
type master;
file "zones/example.com.zone";
allow-transfer { key transfer-key; };
};
Configuração no Servidor Secundário
No servidor secundário, adicione a mesma definição de chave e configure a zona:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// TSIG key definition (same as on primary)
key "transfer-key" {
algorithm hmac-sha256;
secret "your-base64-encoded-secret-key";
};
// Use the key for zone transfers
server 192.168.200.49 {
keys { transfer-key; };
};
zone "example.com" {
type slave;
masters { 192.168.200.49; };
file "slaves/example.com.zone";
};
+---------------------+ +---------------------+
| Servidor Primário | | Servidor Secundário |
| (192.168.200.49) | | (192.168.200.50) |
+----------+----------+ +----------+----------+
| |
| 1. NOTIFY (Zona example.com atualizada) |
|---------------------------------------------------->|
| |
| 2. Solicitação de Transferência (AXFR/IXFR) |
| + TSIG(transfer-key) |
|<----------------------------------------------------|
| |
| 3. Verifica TSIG |
| (Chave válida?) |
| | Sim |
| V |
| 4. Envia dados da zona |
| + TSIG(transfer-key) |
|---------------------------------------------------->|
| |
| 5. Verifica TSIG e atualiza zona local |
| |
Figura 2: Fluxo de Transferência de Zona Segura com TSIG
Configuração de Atualizações Dinâmicas Seguras
Para permitir atualizações dinâmicas seguras, você pode usar TSIG:
1
2
3
4
5
6
7
8
9
10
11
// TSIG key for dynamic updates
key "update-key" {
algorithm hmac-sha256;
secret "your-base64-encoded-secret-key";
};
zone "example.com" {
type master;
file "zones/example.com.zone";
allow-update { key update-key; };
};
Para usar esta chave com nsupdate:
1
2
3
4
5
nsupdate -k Kupdate-key.+xxx+yyyyy.private
> server 192.168.200.49
> zone example.com
> update add host.example.com 300 A 192.168.200.100
> send
Implementação de DNSSEC
O DNSSEC (DNS Security Extensions) adiciona assinaturas digitais às respostas DNS, permitindo que os clientes verifiquem a autenticidade e integridade dos dados.
Geração de Chaves DNSSEC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Criar diretório para chaves
sudo mkdir -p /var/named/keys
sudo chown named:named /var/named/keys
sudo chmod 750 /var/named/keys
# Gerar chave de assinatura de zona (ZSK)
sudo dnssec-keygen -a ECDSAP256SHA256 -b 256 -n ZONE example.com
# Gerar chave de assinatura de chave (KSK)
sudo dnssec-keygen -a ECDSAP256SHA256 -b 256 -f KSK -n ZONE example.com
# Mover as chaves para o diretório apropriado
sudo mv K*.key K*.private /var/named/keys/
sudo chown named:named /var/named/keys/K*
sudo chmod 640 /var/named/keys/K*
Configuração de DNSSEC no named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
options {
// ...
dnssec-validation auto;
dnssec-enable yes;
};
zone "example.com" {
type master;
file "zones/example.com.signed";
key-directory "/var/named/keys";
auto-dnssec maintain;
inline-signing yes;
};
Assinatura da Zona
1
2
# Assinar a zona manualmente (alternativa ao inline-signing)
sudo dnssec-signzone -A -3 $(head -c 16 /dev/random | od -v -t x | head -1 | cut -d' ' -f2- | tr -d ' ') -N INCREMENT -o example.com -t /var/named/zones/example.com.zone
Publicação de Registros DS na Zona Pai
Para completar a cadeia de confiança DNSSEC, você precisa publicar registros DS (Delegation Signer) na zona pai:
1
2
# Gerar registro DS
sudo dnssec-dsfromkey /var/named/keys/Kexample.com.+013+xxxxx.key
Forneça este registro ao registrador do domínio ou ao administrador da zona pai.
Implementação de DNS over TLS (DoT)
O DNS over TLS criptografa o tráfego DNS para proteger contra espionagem e manipulação.
Instalação de Stunnel
1
sudo dnf install stunnel -y
Configuração de Stunnel
1
sudo vi /etc/stunnel/stunnel.conf
Adicione:
1
2
3
4
5
[dns-tls]
accept = 853
connect = 127.0.0.1:53
cert = /etc/pki/tls/certs/server.crt
key = /etc/pki/tls/private/server.key
Geração de Certificado
1
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt
Iniciar e Habilitar Stunnel
1
sudo systemctl enable --now stunnel
Configuração do Firewall para DoT
1
2
sudo firewall-cmd --permanent --add-port=853/tcp
sudo firewall-cmd --reload
Monitoramento e Resposta a Incidentes
Configuração de Logging Avançado
Configure logging detalhado para monitorar a atividade do servidor DNS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
channel general_log {
file "/var/log/named/general.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
channel security_log {
file "/var/log/named/security.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
channel query_log {
file "/var/log/named/query.log" versions 3 size 10m;
severity info;
print-time yes;
};
category default { general_log; };
category general { general_log; };
category security { security_log; };
category queries { query_log; };
category dnssec { security_log; };
category xfer-in { security_log; };
category xfer-out { security_log; };
category notify { security_log; };
category client { general_log; };
category network { general_log; };
category update { security_log; };
category update-security { security_log; };
};
Monitoramento com Ferramentas Externas
Configuração do Monitoramento com Prometheus e Grafana
O BIND pode ser monitorado com Prometheus e Grafana para visualização em tempo real.
Primeiro, habilite as estatísticas no BIND:
1
2
3
4
5
6
options {
// ...
statistics-channels {
inet 127.0.0.1 port 8080 allow { 127.0.0.1; };
};
};
Instale o exportador de estatísticas do BIND para Prometheus:
1
2
3
sudo dnf install golang -y
sudo go get github.com/prometheus-community/bind_exporter
sudo cp ~/go/bin/bind_exporter /usr/local/bin/
Crie um serviço systemd para o exportador:
1
sudo vi /etc/systemd/system/bind_exporter.service
Adicione:
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=BIND Exporter
After=network.target
[Service]
Type=simple
User=named
ExecStart=/usr/local/bin/bind_exporter --bind.stats-url=http://localhost:8080/
Restart=always
[Install]
WantedBy=multi-user.target
Inicie e habilite o serviço:
1
sudo systemctl enable --now bind_exporter
Configure o Prometheus para coletar métricas do exportador e o Grafana para visualização.
Monitoramento com Nagios/Icinga
Para monitoramento com Nagios ou Icinga, você pode usar o plugin check_dns:
1
sudo dnf install nagios-plugins-dns -y
Exemplo de comando de verificação:
1
/usr/lib64/nagios/plugins/check_dns -H example.com -s 192.168.200.49
Análise de Logs
Ferramentas para análise de logs do BIND:
Análise Básica com Grep e Awk
1
2
3
4
5
6
7
8
# Verificar tentativas de transferência de zona não autorizadas
grep "denied" /var/log/named/security.log | grep "transfer"
# Contar consultas por domínio
awk '{print $6}' /var/log/named/query.log | sort | uniq -c | sort -nr | head -10
# Identificar clientes que fazem muitas consultas
awk '{print $4}' /var/log/named/query.log | sort | uniq -c | sort -nr | head -10
Análise Avançada com ELK Stack
Para análise avançada, você pode configurar o ELK Stack (Elasticsearch, Logstash, Kibana):
1
2
3
4
5
# Instalar Filebeat para enviar logs para o Elasticsearch
sudo dnf install filebeat -y
# Configurar Filebeat para coletar logs do BIND
sudo vi /etc/filebeat/filebeat.yml
Configuração básica do Filebeat:
1
2
3
4
5
6
7
8
9
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/named/*.log
tags: ["bind", "dns"]
output.elasticsearch:
hosts: ["elasticsearch-server:9200"]
Procedimentos de Resposta a Incidentes
Estabeleça procedimentos claros para responder a incidentes de segurança:
- Detecção: Configure alertas para atividades suspeitas
- Contenção: Procedimentos para isolar sistemas comprometidos
- Erradicação: Remoção de malware ou backdoors
- Recuperação: Restauração de serviços a partir de backups limpos
- Lições Aprendidas: Análise pós-incidente para melhorar a segurança
Exemplo de script para detectar e alertar sobre atividades suspeitas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# Script para detectar atividades suspeitas no BIND
# Verificar tentativas de transferência de zona não autorizadas
XFER_ATTEMPTS=$(grep "denied" /var/log/named/security.log | grep "transfer" | wc -l)
if [ $XFER_ATTEMPTS -gt 10 ]; then
echo "ALERTA: Múltiplas tentativas de transferência de zona não autorizadas detectadas" | mail -s "Alerta DNS" admin@example.com
fi
# Verificar consultas excessivas
TOP_CLIENTS=$(awk '{print $4}' /var/log/named/query.log | sort | uniq -c | sort -nr | head -1)
CLIENT_COUNT=$(echo $TOP_CLIENTS | awk '{print $1}')
CLIENT_IP=$(echo $TOP_CLIENTS | awk '{print $2}')
if [ $CLIENT_COUNT -gt 1000 ]; then
echo "ALERTA: Cliente $CLIENT_IP fez $CLIENT_COUNT consultas, possível ataque" | mail -s "Alerta DNS" admin@example.com
fi
Implementação de BIND em Ambiente Chroot
Executar o BIND em um ambiente chroot adiciona uma camada extra de segurança, isolando o processo do restante do sistema.
Instalação do Pacote bind-chroot
O Oracle Linux 9 fornece um pacote bind-chroot que simplifica a configuração:
1
sudo dnf install bind-chroot -y
Configuração do Ambiente Chroot
O pacote bind-chroot cria automaticamente a estrutura de diretórios necessária em /var/named/chroot/
.
Para migrar sua configuração existente para o ambiente chroot:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Parar o serviço BIND
sudo systemctl stop named
# Copiar arquivos de configuração
sudo cp -r /etc/named* /var/named/chroot/etc/
# Copiar zonas e outros arquivos
sudo cp -r /var/named/zones /var/named/chroot/var/named/
sudo mkdir -p /var/named/chroot/var/log/named
sudo chown named:named /var/named/chroot/var/log/named
# Configurar contextos SELinux
sudo semanage fcontext -a -t named_conf_t "/var/named/chroot/etc/named(/.*)?"
sudo semanage fcontext -a -t named_zone_t "/var/named/chroot/var/named/zones(/.*)?"
sudo semanage fcontext -a -t named_log_t "/var/named/chroot/var/log/named(/.*)?"
sudo restorecon -Rv /var/named/chroot
# Habilitar e iniciar o serviço named-chroot
sudo systemctl disable named
sudo systemctl enable --now named-chroot
Verificação do Ambiente Chroot
Para verificar se o BIND está executando no ambiente chroot:
1
2
3
4
5
# Verificar o status do serviço
sudo systemctl status named-chroot
# Verificar o processo
ps aux | grep named
O processo deve mostrar o caminho chroot.
Melhores Práticas de Segurança para Servidores DNS
Arquitetura de Servidor DNS Segura
Separação de Funções
Considere separar as funções DNS em servidores diferentes:
- Servidores Autoritativos: Responsáveis apenas por zonas específicas
- Servidores Recursivos: Fornecem resolução recursiva para clientes internos
- Servidores Externos: Expostos à Internet, com configurações de segurança rigorosas
Redundância e Diversidade
Implemente redundância e diversidade para aumentar a resiliência:
- Múltiplos Servidores: Distribua servidores em diferentes locais e redes
- Diversidade de Software: Considere usar diferentes implementações de DNS (BIND, NSD, PowerDNS)
- Diversidade de Hardware: Evite concentrar todos os servidores no mesmo tipo de hardware
Política de Senhas e Gerenciamento de Chaves
Gerenciamento Seguro de Chaves DNSSEC
- Rotação Regular: Implemente um cronograma para rotação de chaves
- Armazenamento Seguro: Mantenha backups seguros das chaves
- Cerimônia de Chaves: Para domínios críticos, considere uma cerimônia formal de geração de chaves
Proteção de Chaves TSIG
- Chaves Fortes: Use algoritmos fortes (HMAC-SHA256 ou superior)
- Distribuição Segura: Transfira chaves por canais seguros
- Rotação Regular: Altere chaves periodicamente
Auditorias e Testes de Segurança
Auditorias Regulares
- Revisão de Configuração: Verifique regularmente as configurações de segurança
- Análise de Logs: Revise logs em busca de padrões suspeitos
- Verificação de Permissões: Audite permissões de arquivos e diretórios
Testes de Penetração
- Testes de DNS: Use ferramentas como dnsrecon, dnsenum e fierce
- Verificação de Configuração: Use ferramentas como DNSViz para verificar DNSSEC
- Testes de Carga: Verifique a resiliência a ataques de DoS
Script de Verificação de Segurança
Aqui está um script abrangente para verificar a segurança do seu servidor DNS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/bash
# DNS Security Check Script
echo "=== DNS Security Check ==="
echo
echo "=== System Information ==="
hostname
uname -a
echo
echo "=== BIND Version ==="
named -v
echo
echo "=== SELinux Status ==="
sestatus
echo
echo "=== Firewall Status ==="
sudo firewall-cmd --list-all
echo
echo "=== BIND Service Status ==="
sudo systemctl status named
echo
echo "=== File Permissions Check ==="
echo "Configuration files:"
ls -la /etc/named.conf
echo
echo "Zone files:"
ls -la /var/named/zones
echo
echo "Log directory:"
ls -la /var/log/named
echo
echo "=== SELinux Context Check ==="
echo "Configuration files:"
ls -Z /etc/named.conf
echo
echo "Zone files:"
ls -Z /var/named/zones
echo
echo "Log directory:"
ls -Z /var/log/named
echo
echo "=== DNSSEC Check ==="
echo "DNSSEC validation status:"
grep "dnssec-validation" /etc/named.conf
echo
echo "DNSSEC keys:"
ls -la /var/named/keys
echo
echo "=== Configuration Check ==="
sudo named-checkconf
echo
echo "=== Zone Check ==="
for zone in $(grep "zone " /etc/named.conf | grep -v "^//" | awk '{print $2}' | tr -d '"' | tr -d ' '); do
if [ "$zone" != "." ]; then
echo "Checking zone: $zone"
file=$(grep -A10 "zone \"$zone\"" /etc/named.conf | grep "file" | head -1 | awk '{print $2}' | tr -d '"' | tr -d ';')
if [ -n "$file" ]; then
sudo named-checkzone $zone $file
fi
fi
done
echo
echo "=== Open Ports Check ==="
sudo ss -tulpn | grep named
echo
echo "=== Recent Security Events ==="
echo "Recent denied actions:"
sudo grep "denied" /var/log/named/security.log | tail -10
echo
echo "Recent DNSSEC events:"
sudo grep "DNSSEC" /var/log/named/security.log | tail -10
echo
echo "=== Security Check Complete ==="
Conclusão e Próximos Passos
Neste quinto artigo da série, exploramos técnicas abrangentes de segurança e hardening para servidores DNS BIND no Oracle Linux 9. Abordamos desde configurações básicas de permissões e SELinux até implementações avançadas como TSIG e DNSSEC, além de discutir melhores práticas e estratégias de mitigação contra ameaças comuns.
A segurança do DNS é um processo contínuo, não um estado final. É importante manter-se atualizado sobre novas vulnerabilidades e ameaças, e adaptar suas configurações de segurança conforme necessário.
O que vem a seguir?
No próximo artigo, “Logging, Monitoramento e Troubleshooting de Servidores DNS BIND”, abordaremos:
- Configuração avançada de logging no BIND
- Definição de canais e categorias de log
- Configuração de rotação de logs
- Ferramentas para análise de logs DNS
- Monitoramento de desempenho e disponibilidade
- Configuração de alertas para eventos críticos
- Diagnóstico e resolução de problemas comuns
- Análise de consultas e detecção de padrões anômalos
- Ferramentas avançadas de troubleshooting
Não perca! Nossa jornada para dominar o DNS BIND no Oracle Linux 9 continua.
Referências e Recursos Adicionais
- Documentação oficial do BIND
- BIND 9 Administrator Reference Manual - Security
- DNSSEC Howto - ISC Knowledge Base
- RFC 8945 - Secret Key Transaction Authentication for DNS (TSIG)
- RFC 4033-4035 - DNSSEC
- DNS Security: In-depth Vulnerability Analysis and Mitigation Solutions - Anestis Karasaridis
- DNS and BIND, 5th Edition - Cricket Liu & Paul Albitz
- Pro DNS and BIND - Ron Aitchison