Neste incidente, tratei três pontos encadeados em um ambiente de hosting: falha de sintaxe no BIND9, ajuste de cron no WHMCS para reduzir contenção e revisão da integração do registrador eNom com foco em segurança operacional.
A falha inicial de DNS foi:
missing ';' before 'deny'
A partir daí, executei um fluxo completo de diagnóstico, correção, validação e hardening para estabilizar o DNS autoritativo, a automação de billing/domínios e o registro automático.
1) BIND9: backup, diagnóstico e recuperação segura#
Qualquer alteração em servidores DNS de produção exige contingenciamento rígido. Um arquivo de configuração corrompido pode causar indisponibilidade completa de resolução.
1.1 backup preventivo obrigatório#
Antes de editar qualquer diretiva, salve um instantâneo de segurança do diretório do BIND9:
# Backup completo do BIND9 (arquivos de config e zonas)
sudo tar czf /root/bind-backup-$(date +%Y%m%d-%H%M%S).tar.gz /etc/bind/
# Backup simples da configuração principal
sudo cp /etc/bind/named.conf /etc/bind/named.conf.bak.$(date +%Y%m%d)
# Backup do subdiretório de zonas
sudo cp -r /etc/bind/zones/ /etc/bind/zones.bak.$(date +%Y%m%d)/ 2>/dev/null || true
1.2 coleta de evidências e status#
Identifique o erro lendo os logs de inicialização do daemon:
systemctl status bind9 --no-pager
journalctl -u bind9 -n 50 --no-pager
(Nota: em sistemas Red Hat/CentOS, substitua bind9 por named).
1.3 validação de arquivos incluídos com named-checkconf#
Um erro comum é executar named-checkconf apontando para um arquivo isolado. Se o seu named.conf importa outros arquivos (como named.conf.options ou named.conf.local), a validação pode passar em branco por erros aninhados.
# Buscar todos os arquivos incluídos na configuração do BIND
grep -r "include" /etc/bind/named.conf
# Validar recursivamente TODOS os arquivos configurados (método recomendado)
named-checkconf
# Validar especificamente um arquivo
named-checkconf /etc/bind/named.conf
1.4 a correção da sintaxe#
O erro missing ';' before 'deny' foi causado pela ausência de ponto e vírgula delimitador na declaração do IP de loopback.
- Incorreto:
allow-recursion {
127.0.0.1
deny all;
};
- Correto:
allow-recursion {
127.0.0.1;
deny all;
};
2) Hardening do BIND9: segurança, zonas reversas e logging#
2.1 zone transfer security (allow-transfer)#
Por padrão, se não configurado explicitamente, o BIND9 pode permitir que atacantes consultem todas as entradas de uma zona através de transferências AXFR completas. Proteja suas zonas restringindo essa ação:
options {
directory "/var/cache/bind";
# Bloquear transferência de zona globalmente
allow-transfer { none; };
# Ou permitir apenas IPs de servidores DNS secundários confiáveis
# allow-transfer { 192.168.0.5; 192.168.0.6; };
};
2.2 configuração de logging detalhado#
Para fins de auditoria de segurança e depuração, configure canais de log dedicados no named.conf.options:
logging {
channel default_log {
file "/var/log/named/default.log" versions 5 size 10m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
channel query_log {
file "/var/log/named/query.log" versions 5 size 50m;
severity info;
print-time yes;
};
category default { default_log; };
category queries { query_log; };
category security { default_log; };
};
Crie o diretório correspondente no host e garanta as permissões do usuário do daemon:
sudo mkdir -p /var/log/named
sudo chown bind:bind /var/log/named
2.3 DNSSEC: validação e confiança#
A diretiva dnssec-validation auto; indica ao BIND que utilize as chaves âncora de confiança da raiz de DNS (root trust anchors) gerenciadas automaticamente pelo sistema para validar registros assinados.
- Validação Operacional:
# Verificar status de chaves gerenciadas
sudo rndc managed-keys status
Caso o servidor DNS não possua acesso externo para atualizar chaves (root hints), erros de resolução de domínios assinados podem ocorrer. Para depuração temporária, a diretiva pode ser desativada com dnssec-validation no; (não recomendado em produção).
2.4 configurando zonas reversas (PTR)#
A resolução de IPs para nomes (PTR) é mandatória para servidores de e-mail evitarem marcações de SPAM.
Declare a zona reversa no named.conf.local:
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.192.168.0";
allow-query { any; };
};
Crie o arquivo de zona /etc/bind/zones/db.192.168.0:
$TTL 86400
@ IN SOA ns1.domain.local. admin.domain.local. (
2026061501 ; Serial (YYYYMMDDNN)
3600 ; Refresh
900 ; Retry
604800 ; Expire
86400 ; Negative Cache TTL
)
IN NS ns1.domain.local.
10 IN PTR web.domain.local.
20 IN PTR mail.domain.local.
2.5 limpeza de cache (flush)#
Após corrigir permissões ou registros DNS em zonas externas, limpe o cache do BIND para evitar respostas defasadas:
# Limpar cache geral
sudo rndc flush
# Limpar cache de um domínio específico
sudo rndc flushname example.com
# Dump das estatísticas de cache na memória
sudo rndc stats
3) Auditoria de rede e procedimentos operacionais#
3.1 verificação de firewall e portas#
O DNS opera tanto em UDP (consultas rápidas) quanto em TCP (transferências de zona e respostas grandes que ultrapassam 512 bytes) na porta 53.
# Confirmar se o daemon do BIND está em escuta
sudo ss -lntup | grep :53
# Verificar regras ativas de firewall no UFW
sudo ufw status | grep 53
# Ou inspecionar regras brutas de iptables
sudo iptables -L -n | grep 53
# Liberar portas caso necessário
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
Teste a resolução externamente:
dig @IP_DO_SERVIDOR_DNS example.com A +short
3.2 procedimento para adicionar novas zonas#
Siga rigorosamente estas etapas para adicionar um novo domínio ao BIND9:
- Criar o arquivo de zona: crie
/etc/bind/zones/novo-domain.com.dbcom o SOA, NS e apontamentos A/MX. - Declarar no config: adicione a zona ao
named.conf.local:
zone "novo-domain.com" {
type master;
file "/etc/bind/zones/novo-domain.com.db";
};
- Validar a integridade:
sudo named-checkconf
sudo named-checkzone novo-domain.com /etc/bind/zones/novo-domain.com.db
- Aplicar as alterações:
sudo rndc reload
4) Otimização da cron do WHMCS e prevenção de overlap#
Executar a cron do WHMCS (cron.php) a cada minuto pode criar gargalos de banco e load devido ao acúmulo de processos pendentes de encerramento.
4.1 otimização de agendamento#
Ajuste a execução para um intervalo seguro de 5 minutos, utilizando o binário absoluto do interpretador PHP:
# Modo Clássico Otimizado
*/5 * * * * /usr/local/bin/php -q /home/usuario/whmcs/crons/cron.php
4.2 prevenção de overlap com lock mutual exclusion (flock)#
Impeça que novos disparos ocorram se o ciclo anterior ainda estiver ativo:
# Prevenção ativa de contenção via flock
*/5 * * * * /usr/bin/flock -n /tmp/whmcs-cron.lock /usr/local/bin/php -q /home/usuario/whmcs/crons/cron.php
4.3 auditoria e depuração da cron#
Para validar o processamento dinâmico e localizar falhas de bootstrap:
# Monitorar logs de execução do cron do WHMCS
tail -f /home/usuario/whmcs/crons/cron.log 2>/dev/null || true
# Rastrear logs de erro do PHP-FPM
tail -f /var/log/php-fpm/error.log
# Verificar processos de cron ativos no sistema
pgrep -af "whmcs/crons/cron.php"
# Listar agendamentos do usuário executor
crontab -l -u usuario
5) Integração segura com API eNom#
O provisionamento automático de domínios via eNom exige consistência no fluxo de autenticação e comunicação com a API REST.
5.1 validação de conectividade e credenciais#
Antes de delegar o registro ao WHMCS, confirme a comunicação e a liberação de IP direto do terminal do host:
# Testar conexão básica e saldo de conta na API de sandbox do eNom
curl -v "https://reseller.enom.com/interface.asp?command=GetBalance&uid=USUARIO&pw=SENHA&ResponseType=XML"
5.2 monitoramento de erros da API eNom no WHMCS#
Se o registro de domínios falhar silenciosamente:
- Log de Módulo Interno: Acesse o painel administrativo do WHMCS em
Utilities -> Logs -> Module Log. Clique em "Enable Debug Logging" para capturar a resposta crua XML/JSON retornada pela eNom. - Logs Físicos: Inspecione arquivos de log criados no diretório do módulo:
tail -f /home/usuario/whmcs/modules/registrars/enom/emails.log 2>/dev/null || true
6) Scripts de apoio operacional#
Script de diagnóstico do BIND9 (diagnose-bind9.sh)#
#!/bin/bash
# diagnose-bind9.sh - Diagnóstico de integridade e desempenho do BIND9
set -euo pipefail
echo "=== Diagnóstico BIND9 ==="
# 1. Verificar Serviço
if systemctl is-active --quiet bind9 2>/dev/null || systemctl is-active --quiet named 2>/dev/null; then
echo "✅ Serviço DNS está rodando."
else
echo "❌ Serviço DNS está inativo!"
fi
# 2. Validar Arquivos de Configuração
if command -v named-checkconf &>/dev/null; then
if named-checkconf >/dev/null 2>&1; then
echo "✅ Sintaxe das configurações global válida."
else
echo "❌ Erro na validação de sintaxe! Detalhes:"
named-checkconf || true
fi
fi
# 3. Porta 53
if ss -lntup | grep -q ":53"; then
echo "✅ Porta 53 em escuta ativa."
else
echo "❌ Porta 53 não detectada em escuta!"
fi
# 4. Status de Resolução Local
if command -v dig &>/dev/null; then
if dig @127.0.0.1 google.com A +short +time=2 +tries=1 >/dev/null 2>&1; then
echo "✅ Resolução recursiva local funcionando."
else
echo "⚠️ Falha na resolução local de teste."
fi
fi
Script de backup automático do BIND9 (backup-bind9.sh)#
#!/bin/bash
# backup-bind9.sh - Backup preventivo e empacotamento do DNS
set -euo pipefail
BACKUP_DIR="/root/bind-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "Iniciando backup das configurações do BIND..."
sudo cp -r /etc/bind/ "$BACKUP_DIR/config/"
if [ -d /var/log/named ]; then
echo "Salvando dumps de logs..."
sudo cp -r /var/log/named/ "$BACKUP_DIR/logs/" 2>/dev/null || true
fi
tar czf "${BACKUP_DIR}.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"
echo "✅ Backup concluído em: ${BACKUP_DIR}.tar.gz"
Checklist de deploy e validação#
- [ ] Backup completo gerado em
/root/bind-backup-.... - [ ] Sintaxe do arquivo principal e inclusões validada com
named-checkconf. - [ ] Transferência de zona (
allow-transfer) configurada de forma segura. - [ ] Zonas reversas (PTR) declaradas e associadas no BIND9.
- [ ] Porta 53 aberta no firewall (TCP/UDP) e validada externamente.
- [ ] Cache antigo limpo com
rndc flushpós-alterações. - [ ] Validação do BIND9 executada sem downtime via
rndc reload. - [ ] Cron do WHMCS parametrizada para 5 minutos com uso do
flock. - [ ] Logs da cron ativos e validados em tempo real.
- [ ] API da eNom testada com curl e whitelist de IP ativa no painel do parceiro.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários