[GTER] uma ideia para discussão: SPF reverso.

Danton Nunes danton.nunes at inexo.com.br
Wed Aug 15 16:33:09 -03 2012


Voltando ao assunto, decidi implementar e testar. O texto abaixo servirá 
de guia da minha implementação mas ainda está muito longe de uma 
especificação no estilo IETF (mas chegaremos lá).

Pretendo escrever uma API da forma mais simples possível, em C. Junto com 
ela um 'milter' que classifica mensagens recebidas de acordo com o RSPF. 
Se alguém quiser participar dos experimentos será bem vindo.

No final ainda coloco em discussão alguns pontos que ainda não estão 
fixos, especialmente em torno do hash.

--------8<----------------------------------------------------------------

SPF REVERSO - NOTAS PARA UMA ESPECIFICAÇÃO

1. Introdução

O SPF reverso é um mecanismo baseado em DNS que permite ao responsável 
por um bloco de endereços IPv4 ou IPv6 designar quais domínios podem 
enviar e-mail a partir desses IPs.

No SPF direto ou tradicional o domínio do remetente no envelope ou 
presente na saudação (HELO/EHLO) provê uma lista dos endereços IP 
autorizados a enviar. No SPF reverso é o domínio reverso do endereço IP 
de origem da mensagem que valida o remetente no envelope ou o parâmetro 
da saudação. Resumidamente, no SPF direto perguntamos ao dono do domínio 
se o endereço IP é bom, aqui perguntamos ao dono do endereço IP se o 
domínio é bom.

Este rascunho serve para orientar experimentos para validar e descobrir 
furos no protocolo proposto.

2. Mecanismo

À semelhança do SPF serão utilizados registros do tipo TXT dentro do 
domínio reverso, .in-addr.arpa ou .ip6.arpa.

O registro TXT conterá dois campos separados por espaço, a saber:
- identificação do protocolo "rspf/1";
- resultado, que pode ser 'PASS', 'NEUTRAL' ou 'FAIL'.

O nome do domínio a ser testado é formado pelos seguintes elementos:
- Hash do domínio em base 16 (ver adiante como o hash é calculado);
- endereço IP invertido segundo as convenções de tradução reversa;
- 'in-addr' ou 'ip6', conforme o caso;
- 'arpa'.

Por exemplo, o registro para autorizar e-mails vindos de example.com a 
partir do endereço IPv4 203.0.113.1 o registro seria:

5ababd603b22780302dd8d83498e5172.1.113.0.203.in-addr.arpa in txt "rspf/1 PASS"

onde 5ababd603b22780302dd8d83498e5172 é o hash MD5 de 'example.com' em 
hexadecimal e 1.113.0.203 o endereço IP com os octetos reversos.

3. Cálculo do hash

Maiúsculas e minúsculas tem o mesmo valor nos nomes de domínio, mas não 
no cálculo do MD5, então, antes de calcular o hash todos os caracteres 
alfabéticos deverão ser convertidos em minúsculas.

Nomes de domínio internacionalizados devem ser representados em punycode 
[RFC-3492 e RFC-5891].

O hash é calculado sobre o nome do domínio sem qualquer terminador de 
linha.

O hash é codificado em base 16. É irrelevante se em maiúsculas ou 
minúsculas, já que os nomes de domínios não são sensitivos ao caso.

Exemplos:

example.com -> 5ababd603b22780302dd8d83498e5172

老丹童.nom.br -> (punycode) xn--riqy20ichd.nom.br ->
 	-> 50807287f78ea82a698719357de51805

NOTA: considerei a possibilidade de codificar o hash em base-32 ou 
base-64, que certamente resultaria em um componente do domínio mais 
curto, no entanto ambas as bases usam caracteres que estão fora do 
conjunto permitido para nomes de domínio e a base-64 distingue 
maiúsculas de minúsculas, que são confundidas no escopo do DNS.

4. Uso de coringas

Se o servidor de nomes permitir, é permitido usar coringas no lugar do 
hash para indicar uma política default para TODOS os domínios e para 
vários nomes reversos de uma zona.

Um exemplo de aplicação do uso de coringas pode ser para uma rede de 
acesso de usuários finais (similar a dial-up), em que nenhum endereço 
está autorizado a enviar e-mail partindo de qualquer domínio. Suponhamos 
que o bloco 203.0.113.0/24 inteiro esteja nessa situação. O seguinte 
registro:

*.113.0.203.in-addr.arpa in txt "rspf/1 FAIL"

fará com que qualquer associação de domínio com endereços do bloco 
203.0.113.0/24 resultem em FAIL, a menos que tenham uma exceção 
explícita.

--------8<----------------------------------------------------------------

Questão do HASH:

escolhi MD5 um tanto arbitrariamente, me parece um tanto 'over' para esta 
finalidade. poderia ser um hash mais curto, se bem que quanto mais curto 
mais o fantasma da possibilidade de colisão assusta.

por outro lado, há a dúvida, to hash or not to hash? o hash permitiria 
tratar domínios enormes com até todos os 127 componentes permitidos pela 
RFC do Mockapetris, enquanto se simplesmente concatenássemos o nome do 
domínio com o do endereço IP reverso teríamos um limite de 93 componentes 
(no domínio ip6.arpa, no caso do IPv4 seria menos restritivo). Na prática, 
duvido que exista um domínio de e-mail com 93 componentes!

outra questão que ficou em aberto é um mecanismo de delegação para os 
casos em que o dono dos IPs não controla o domínio reverso, tipicamente 
quando recebe um bloco de IPv4 menor que /24. houve uma proposta 
interessante baseada em criptografia de chave pública, mas me pareceu um 
tanto complicada e resolvi não incorporá-la nesta altura. Estou pensando 
em alguma abordagem mais ao estilo da BCP-20, para incorporar mais tarde.

-- Danton.



More information about the gter mailing list