DKIM, DMARC e SPF: Autenticação de Email para PME em 2026

Desde fevereiro de 2024, o Google e o Yahoo exigem autenticação de email (SPF, DKIM e DMARC) para qualquer remetente que envie mais de 5000 mensagens por dia. Em 2026, estes requisitos são praticamente obrigatórios para todos — sem estes três registos DNS, o email da sua empresa vai direto para o spam ou é simplesmente rejeitado. Este guia mostra como configurar e diagnosticar os três protocolos, com exemplos práticos para Postfix numa PME.

Neste artigo

O que são SPF, DKIM e DMARC

Os três protocolos trabalham em conjunto para validar que um email vem realmente de quem diz ser. Cada um resolve um problema diferente:

Protocolo O que valida Registo DNS Analogia
SPF Quais IPs/servidores podem enviar email pelo domínio TXT no domínio raiz Lista de funcionários autorizados a usar a papelaria
DKIM Assinatura criptográfica do conteúdo do email TXT no selector (ex: default._domainkey) Assinatura digital que prova que a mensagem não foi alterada
DMARC O que fazer quando SPF ou DKIM falham TXT em _dmarc Política de segurança que diz “se não tem assinatura, recusar”

SPF — Sender Policy Framework

O SPF (definido no RFC 7208) é um registo TXT no domínio que lista os endereços IP e servidores autorizados a enviar email em nome desse domínio. Quando um servidor de destino recebe uma mensagem, consulta o registo SPF do domínio do remetente (envelope MAIL FROM) e verifica se o IP de origem está na lista.

DKIM — DomainKeys Identified Mail

O DKIM (definido no RFC 6376) adiciona uma assinatura criptográfica ao cabeçalho do email. O servidor de origem assina a mensagem com uma chave privada e publica a chave pública no DNS. O servidor de destino recupera a chave pública, valida a assinatura e confirma que o conteúdo não foi alterado em trânsito.

DMARC — Domain-based Message Authentication

O DMARC (definido no RFC 7489) é a política que une SPF e DKIM. Define o que o servidor de destino deve fazer quando a autenticação falha: nada (p=none), enviar para quarentena (p=quarantine) ou rejeitar (p=reject). Inclui também relatórios agregados (RUA) e forenses (RUF) enviados por email para análise.

Porque são obrigatórios em 2026

Em fevereiro de 2024, o Google e o Yahoo implementaram requisitos obrigatórios para remetentes em massa (acima de 5000 mensagens/dia). Em 2026, estes requisitos são a norma para praticamente todos os remetentes:

Requisitos Google/Yahoo em 2026:

  • Configurar SPF e DKIM no domínio
  • Configurar DMARC com pelo menos p=none (recomendado p=quarantine ou p=reject)
  • Não usar domínios de remetente “de” não alinhados com o domínio de envio
  • Manter taxa de spam abaixo de 0,3% (Google) ou 0,1% (Yahoo)
  • Suportar unsubscrição com um clique (List-Unsubscribe header)

Consulte os requisitos oficiais diretamente nas fontes: Google Workspace — Sender Guidelines e Yahoo — Sender Requirements.

Para uma PME portuguesa, as consequências de não ter estes registos são severas:

  • Emails para clientes Gmail/Yahoo vão para spam ou são rejeitados
  • Microsoft 365 e Outlook.com também aplicam políticas cada vez mais rigorosas
  • Risco de spoofing: atacantes podem enviar email falsos em nome do domínio da empresa
  • Não conformidade com NIS2 (Decreto-Lei n.º 125/2025), que exige controlos de autenticação

Configurar SPF (registo TXT)

O SPF é o mais simples de configurar. Adiciona-se um registo TXT no domínio raiz com a lista de IPs/servidores autorizados.

Sintaxe SPF

v=spf1 ip4:203.0.113.10 include:_spf.google.com include:spf.protection.outlook.com -all

Principais mecanismos:

Mecanismo Função Exemplo
ip4 / ip6 Autorizar IP específico ou range ip4:203.0.113.10
include Incluir SPF de outro domínio include:_spf.google.com
a Autorizar o IP do registo A do domínio a ou a:mail.empresa.pt
mx Autorizar os servidores MX do domínio mx
~all Softfail — marcar como suspeito mas aceitar Recomendado em fase de teste
-all Hardfail — rejeitar tudo o que não está na lista Recomendado em produção
Atenção: Nunca usar +all ou ?all — permitem que qualquer IP envie email pelo domínio, anulando completamente a proteção SPF. Usar sempre -all em produção ou ~all temporariamente durante testes.

Exemplos por cenário

Servidor próprio (Postfix) com IP fixo:

empresa.pt.   IN   TXT   "v=spf1 ip4:203.0.113.10 -all"

Google Workspace:

empresa.pt.   IN   TXT   "v=spf1 include:_spf.google.com ~all"

Microsoft 365:

empresa.pt.   IN   TXT   "v=spf1 include:spf.protection.outlook.com -all"

Misto (servidor próprio + Microsoft 365 + newsletter via Mailchimp):

empresa.pt.   IN   TXT   "v=spf1 ip4:203.0.113.10 include:spf.protection.outlook.com include:servers.mcsv.net -all"
Limite de lookups DNS: O SPF tem um limite de 10 consultas DNS (include, a, mx, exists, redirect). Cada include conta como uma consulta. Se exceder 10, o SPF retorna PermError. Use SPF Survey da dmarcian para verificar o número de lookups.

Verificar SPF com dig

dig TXT empresa.pt +short

# Resultado esperado:
"v=spf1 ip4:203.0.113.10 include:spf.protection.outlook.com -all"

Configurar DKIM (chaves 2048-bit e rotação)

O DKIM é mais complexo porque envolve geração de chaves criptográficas. O processo é: gerar par de chaves, publicar a chave pública no DNS e configurar o servidor de email para assinar com a chave privada.

Gerar chaves DKIM com OpenDKIM

# Instalar OpenDKIM (Debian/Ubuntu)
sudo apt install opendkim opendkim-tools

# Gerar chave 2048-bit para o domínio empresa.pt
# Selector: default (pode ser qualquer nome, ex: 202601)
sudo opendkim-genkey -b 2048 -d empresa.pt -s default -D /etc/opendkim/keys/

# Resultado: dois ficheiros
# /etc/opendkim/keys/default.private  (chave privada — NÃO publicar)
# /etc/opendkim/keys/default.txt      (registo DNS — publicar)

O ficheiro default.txt contém o registo TXT para o DNS:

default._domainkey.empresa.pt.   IN   TXT   "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
Atenção: Usar sempre chaves de 2048-bit no mínimo. Chaves de 1024-bit são consideradas inseguras e alguns provedores (Google, Microsoft) já as rejeitam. Nunca copiar a chave privada para servidores não autorizados e proteger com permissões chmod 600.

Selector e rotação de chaves

O selector é o nome que identifica a chave DKIM no DNS. No exemplo acima, usámos default, mas é recomendado usar nomes com data para facilitar a rotação:

# Selector com data: 202601
sudo opendkim-genkey -b 2048 -d empresa.pt -s 202601 -D /etc/opendkim/keys/

# Registo DNS:
202601._domainkey.empresa.pt.   IN   TXT   "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."

A rotação de chaves deve ser feita periodicamente (recomendado a cada 6-12 meses). O processo:

  1. Gerar nova chave com selector novo (ex: 202607)
  2. Publicar a nova chave pública no DNS
  3. Configurar o OpenDKIM para usar a nova chave privada
  4. Reiniciar o OpenDKIM e testar o envio
  5. Depois de confirmar, remover a chave antiga do DNS (após TTL expirar)

Configurar OpenDKIM no Postfix

Ficheiro /etc/opendkim.conf:

# /etc/opendkim.conf
Domain          empresa.pt
KeyFile         /etc/opendkim/keys/default.private
Selector        default
Socket          inet:12301@localhost
LogWhy          yes
Syslog          yes
SyslogSuccess   yes
Canonicalization relaxed/relaxed
Mode            sv
AutoRestart     yes
AutoRestartRate 10/1h
SignatureAlgorithm rsa-sha256

Integração com Postfix via milter em /etc/postfix/main.cf:

# /etc/postfix/main.cf — adicionar no fim
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
# Reiniciar serviços
sudo systemctl restart opendkim
sudo systemctl restart postfix

# Verificar que o OpenDKIM está a escutar
ss -tlnp | grep 12301

Verificar DKIM com dig

dig TXT default._domainkey.empresa.pt +short

# Resultado esperado:
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."

Configurar DMARC (políticas e relatórios)

O DMARC é o terceiro pilar e define a política de tratamento quando SPF ou DKIM falham. O registo TXT é publicado em _dmarc.dominio.pt.

Sintaxe DMARC

_dmarc.empresa.pt.   IN   TXT   "v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100; adkim=s; aspf=s"

Principais tags DMARC:

Tag Função Valores
p Política de tratamento none, quarantine, reject
rua Relatórios agregados (diários) mailto:endereç[email protected]
ruf Relatórios forenses (por mensagem) mailto:endereç[email protected]
pct Percentagem de mensagens sujeitas à política 0-100 (recomendado 100)
adkim Alinhamento DKIM s (strict) ou r (relaxed)
aspf Alinhamento SPF s (strict) ou r (relaxed)
sp Política para subdomínios none, quarantine, reject

Estratégia de implementação progressiva

Não se deve passar diretamente para p=reject. A abordagem recomendada em três fases:

Fase 1 — Monitorização (1-2 semanas):

_dmarc.empresa.pt.   IN   TXT   "v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100; adkim=s; aspf=s"

Fase 2 — Quarentena (2-4 semanas):

_dmarc.empresa.pt.   IN   TXT   "v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100; adkim=s; aspf=s"

Fase 3 — Rejeição (produção):

_dmarc.empresa.pt.   IN   TXT   "v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100; adkim=s; aspf=s"

Relatórios RUA e RUF

Os relatórios RUA (Report URI Aggregate) são enviados diariamente em formato XML e contêm estatísticas agregadas: número de mensagens, resultados SPF/DKIM, IPs de origem. Os relatórios RUF (Report URI Forensic) são enviados por mensagem individual que falha a autenticação e incluem cabeçalhos completos (parcialmente redigidos).

Dica: Analisar relatórios XML manualmente é impraticável. Usar serviços gratuitos como o DMARC Digests da dmarcian ou o Postmark DMARC tool para receber relatórios processados com gráficos e alertas.

Verificar DMARC com dig

dig TXT _dmarc.empresa.pt +short

# Resultado esperado:
"v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100; adkim=s; aspf=s"

Exemplo completo para PME com Postfix

Cenário: PME empresa.pt com servidor Postfix em 203.0.113.10, a enviar email diretamente (sem relay externo).

1. Registos DNS

# MX
empresa.pt.           IN   MX    10 mail.empresa.pt.
mail.empresa.pt.      IN   A     203.0.113.10

# SPF
empresa.pt.           IN   TXT   "v=spf1 ip4:203.0.113.10 -all"

# DKIM (selector: default)
default._domainkey.empresa.pt.   IN   TXT   "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."

# DMARC
_dmarc.empresa.pt.    IN   TXT   "v=DMARC1; p=quarantine; rua=mailto:[email protected]; pct=100; adkim=s; aspf=s"

2. Instalar e configurar OpenDKIM

# Instalar
sudo apt update && sudo apt install opendkim opendkim-tools postfix

# Gerar chave 2048-bit
sudo opendkim-genkey -b 2048 -d empresa.pt -s default -D /etc/opendkim/keys/

# Ajustar permissões
sudo chown -R opendkim:opendkim /etc/opendkim/keys/
sudo chmod 600 /etc/opendkim/keys/default.private
sudo chmod 644 /etc/opendkim/keys/default.txt

# Adicionar utilizador postfix ao grupo opendkim
sudo usermod -aG opendkim postfix

Ficheiro /etc/opendkim.conf:

Domain          empresa.pt
KeyFile         /etc/opendkim/keys/default.private
Selector        default
Socket          local:/var/spool/postfix/opendkim/opendkim.sock
LogWhy          yes
Syslog          yes
SyslogSuccess   yes
Canonicalization relaxed/relaxed
Mode            sv
AutoRestart     yes
AutoRestartRate 10/1h
SignatureAlgorithm rsa-sha256
UserID          opendkim
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts       refile:/etc/opendkim/TrustedHosts

Ficheiro /etc/opendkim/TrustedHosts:

127.0.0.1
::1
localhost
203.0.113.10
mail.empresa.pt
empresa.pt

Criar directoria para o socket e ajustar permissões:

sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
sudo chmod 750 /var/spool/postfix/opendkim

3. Configurar Postfix

Adicionar ao ficheiro /etc/postfix/main.cf:

# Configurações básicas
myhostname = mail.empresa.pt
mydomain = empresa.pt
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4

# Milter OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/opendkim/opendkim.sock
non_smtpd_milters = unix:/opendkim/opendkim.sock

4. Reiniciar e testar

# Reiniciar serviços
sudo systemctl restart opendkim postfix

# Verificar estado
sudo systemctl status opendkim
sudo systemctl status postfix

# Enviar email de teste
echo "Teste DKIM" | mail -s "Teste DKIM/SPF/DMARC" [email protected]

# Verificar logs
sudo journalctl -u opendkim -f
sudo tail -f /var/log/mail.log

Ferramentas de diagnóstico

Para além do dig e nslookup (que verificam registos DNS), existem ferramentas online que validam a autenticação de email de ponta a ponta:

Ferramenta Função Custo
MXToolbox Verifica SPF, DKIM, DMARC, MX, blacklists Gratuito (limitado)
mail-tester.com Envia email e recebe score de 10 (spam, auth, conteúdo) Gratuito (3 testes/dia)
dig / nslookup Consultar registos DNS diretamente Gratuito (CLI)
dmarcian Domain Checker Avalia DMARC e relatórios Gratuito
Google Admin Toolbox Diagnóstico de entrega para Gmail Gratuito

Comandos de diagnóstico com dig

# Verificar SPF
dig TXT empresa.pt +short

# Verificar DKIM (substituir selector)
dig TXT default._domainkey.empresa.pt +short

# Verificar DMARC
dig TXT _dmarc.empresa.pt +short

# Verificar MX
dig MX empresa.pt +short

# Usar servidor DNS específico (ex: Cloudflare)
dig @1.1.1.1 TXT empresa.pt +short

# Verificar propagação DNS (Google DNS)
dig @8.8.8.8 TXT empresa.pt +short

Diagnosticar cabeçalhos de email recebido

Para verificar se o email enviado está a passar SPF, DKIM e DMARC, enviar uma mensagem para uma caixa Gmail e inspecionar os cabeçalhos:

# No Gmail: Mostrar original (tres pontos > Mostrar original)
# Procurar por:

Authentication-Results: mx.google.com;
       dkim=pass [email protected] header.s=default header.b=abc123;
       spf=pass (google.com: domain of [email protected] designates 203.0.113.10 as permitted sender) [email protected];
       dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=empresa.pt

# Resultados esperados:
# dkim=pass  → DKIM validado
# spf=pass   → SPF validado
# dmarc=pass → DMARC validado
Se aparecer dkim=fail ou spf=fail: NÃO ignorar. Email que falha autenticação em Gmail/Yahoo vai para spam. Se dmarc=fail com p=reject, a mensagem é simplesmente rejeitada e não chega ao destinatário.

Ferramenta interna: Message Header Analyzer
O kbase.pt disponibiliza um Message Header Analyzer gratuito que analisa cabeçalhos de email (RFC 2822) e apresenta de forma clara o percurso da mensagem entre servidores, tempos de entrega, registos SPF/DKIM/DMARC e detecção de atrasos. Basta colar o cabeçalho completo (obtido no Gmail via “Mostrar original” ou no Outlook via “Propriedades da mensagem”) na ferramenta para obter um relatório legível sem necessidade de interpretar o raw manualmente.

Erros comuns e soluções

Sintoma Causa provável Solução
dkim=fail (key mismatch) Chave privada no servidor não corresponde à chave pública no DNS Regenerar par de chaves e republicar. Verificar selector correcto no OpenDKIM e no DNS
spf=fail (IP missing) IP de saída não está no registo SPF Adicionar ip4:IP_CORRECTO ao registo. Verificar IP real com curl ifconfig.me
dmarc=fail com SPF e DKIM pass Falta de alinhamento: domínio do cabeçalho From difere do envelope MAIL FROM ou do domínio DKIM Garantir que o domínio no header From corresponde ao domínio assinado por DKIM e ao envelope sender
Email legítimo vai para spam DMARC em p=quarantine ou p=reject antes de validar Reverter para p=none, analisar relatórios RUA, identificar fontes legítimas, ajustar SPF/DKIM e depois progredir
SPF PermError Excesso de 10 lookups DNS (includes aninhados) Reduzir includes. Usar SPF flattening (ex: serviço de macros SPF) ou consolidar fontes de envio
Email de formulário web falha SPF O servidor web envia com MAIL FROM do visitante, não do domínio Configurar formulário para enviar com MAIL FROM do domínio (ex: [email protected]) ou usar SMTP autenticado
DKIM key too small Chave de 1024-bit (deprecated) Regenerar com -b 2048 e republicar
DNS não propaga TTL alto ou cache DNS Reduzir TTL antes de mudanças. Verificar com dig @8.8.8.8 e dig @1.1.1.1

Checklist final de implementação

  1. Inventariar fontes de envio — listar todos os IPs, servidores e serviços terceiros que enviam email pelo domínio (Postfix, Microsoft 365, Google Workspace, Mailchimp, formulários web, alertas de monitorização)
  2. Configurar SPF — criar registo TXT no domínio raiz com todos os IPs e includes necessários, terminar com ~all inicialmente
  3. Gerar chaves DKIM 2048-bit — usar OpenDKIM para gerar par de chaves com selector descritivo (ex: 202601)
  4. Publicar chave pública DKIM no DNS — registo TXT em selector._domainkey.dominio.pt
  5. Configurar servidor de email — integrar OpenDKIM com Postfix via milter, reiniciar serviços
  6. Testar envio — enviar email para mail-tester.com e para uma caixa Gmail, verificar score e cabeçalhos de autenticação
  7. Configurar DMARC em p=none — publicar registo TXT com p=none e endereço RUA para receber relatórios
  8. Analisar relatórios durante 1-2 semanas — identificar fontes legítimas que falham autenticação e corrigir SPF/DKIM
  9. Mudar SPF para -all — após confirmar que todas as fontes legítimas passam, mudar de ~all para -all
  10. Progredir DMARC para quarantine — após 100% das fontes legítimas a passar, mudar para p=quarantine
  11. Progredir DMARC para reject — após 2-4 semanas sem falsos positivos, mudar para p=reject
  12. Planear rotação de chaves — definir calendário (a cada 6 meses) e documentar procedimento de rotação DKIM
  13. Configurar monitorização contínua — usar serviço de análise DMARC (dmarcian, Postmark) para receber alertas de spikes de falhas

Artigos Relacionados