Post

Segurança e Hardening de Servidores DNS BIND no Oracle Linux 9

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:

  1. Detecção: Configure alertas para atividades suspeitas
  2. Contenção: Procedimentos para isolar sistemas comprometidos
  3. Erradicação: Remoção de malware ou backdoors
  4. Recuperação: Restauração de serviços a partir de backups limpos
  5. 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:

  1. Servidores Autoritativos: Responsáveis apenas por zonas específicas
  2. Servidores Recursivos: Fornecem resolução recursiva para clientes internos
  3. 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:

  1. Múltiplos Servidores: Distribua servidores em diferentes locais e redes
  2. Diversidade de Software: Considere usar diferentes implementações de DNS (BIND, NSD, PowerDNS)
  3. 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

  1. Rotação Regular: Implemente um cronograma para rotação de chaves
  2. Armazenamento Seguro: Mantenha backups seguros das chaves
  3. Cerimônia de Chaves: Para domínios críticos, considere uma cerimônia formal de geração de chaves

Proteção de Chaves TSIG

  1. Chaves Fortes: Use algoritmos fortes (HMAC-SHA256 ou superior)
  2. Distribuição Segura: Transfira chaves por canais seguros
  3. Rotação Regular: Altere chaves periodicamente

Auditorias e Testes de Segurança

Auditorias Regulares

  1. Revisão de Configuração: Verifique regularmente as configurações de segurança
  2. Análise de Logs: Revise logs em busca de padrões suspeitos
  3. Verificação de Permissões: Audite permissões de arquivos e diretórios

Testes de Penetração

  1. Testes de DNS: Use ferramentas como dnsrecon, dnsenum e fierce
  2. Verificação de Configuração: Use ferramentas como DNSViz para verificar DNSSEC
  3. 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

This post is licensed under CC BY 4.0 by the author.