Admin Libre - Administración de sistemas y redes

Firma DKIM múltiple RSA y Ed25519 en OpenSMTPD con dkimsign
Por Francisco Gaitán el 4 de Mayo de 2022

El RFC 8463 describe el uso del algoritmo de firma Ed25519-SHA256 para DKIM (RFC 6376), lo que permite crear firmas más pequeñas a la vez que son más seguras; esto es especialmente interesante ya que ocupan menos espacio en la entrada DNS correspondiente.

Gracias a los filtros de OpenSMTPD y a dkimsign es posible incluir una firma DKIM múltiple con RSA-1024 (para máxima compatibilidad) y Ed25519 como periodo de transición hasta que la firma Ed25519 sea comúnmente aceptada.

Adaptaré esta configuración a la configuración de OpenSMTPD explicada por Gilles en su artículo Setting up a mail server with OpenSMTPD, Dovecot and Rspamd, reemplazando Rspamd por dkimsign.

Instalación de dkimsign

Se instala desde los ports con pkg_add, eligiendo la versión que soporta Ed25519:

$ doas pkg_add opensmtpd-filter-dkimsign
quirks-5.18 signed on 2022-05-03T20:55:38Z
Ambiguous: choose package for opensmtpd-filter-dkimsign
        0: <None>
        1: opensmtpd-filter-dkimsign-0.5
        2: opensmtpd-filter-dkimsign-0.5-ed25519
Your choice: 2

Generación de las llaves

Esto viene explicado en el archivo /usr/local/share/doc/pkg-readmes/opensmtpd-filter-dkimsign, aunque yo usaré una llave RSA de 1024 bytes para una máxima compatibilidad, tal y como apunta Gilles en su artículo enlazado anteriormente.

Como diferencia con la documentación de dkimsign extraeré la llave pública como usuario _dkimsign y añadiré k=rsa para la llave RSA.

RSA-1024

Generaré la llave tal y como explica el readme de filter-dkimsign:

$ doas -u _dkimsign openssl genrsa -out /etc/mail/dkim/example.com.rsa.key 1024
$ doas -u _dkimsign openssl rsa -in /etc/mail/dkim/example.com.rsa.key -pubout sed '1s/.*/v=DKIM1;k=rsa;p=/;:nl;${s/-----.*//;q;};N;s/\n//g;b nl;' 

El selector que voy a usar es 20220504-rsa. La llave pública se debe añadir como una entrada TXT en el DNS en una línea, de forma que el resultado será algo así:

20220504-rsa._domainkey.example.com. IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJaNB4WZs5uDMhHBqYl/PZf8OJBmpkHVE674AkbFIo0KtEm60AH8QJfGnuFgRQlmiuPvDScTs49Uq4mTntoDb/07gGNXffm77l63orNC7q0N+qg+wDxXDxQjw6PBvs3AuzpP6CNOCW+TU2L1GzA/eykzFKUP6kQnk5iVVYwU8HnwIDAQAB;"

Ed25519

Generaré la llave tal y como explica el readme de filter-dkimsign:

$ doas -u _dkimsign eopenssl11 genpkey -algorithm ed25519 -outform PEM -out /etc/mail/dkim/example.com.ed25519.key
$ doas -u _dkimsign printf "v=DKIM1;k=ed25519;p=%s" "$(eopenssl11 pkey -outform DER -pubout -in /etc/mail/dkim/retrocircuitos.com.ed25519.key | tail -c +13 | openssl base64)" 

El selector para esta llave será 20220504-ed25591. Se añade la entrada TXT en el DNS igual que anteriormente:

20220503-ed25519._domainkey.retrocircuitos.com. IN TXT "v=DKIM1;k=ed25519;p=ZiBPo/mDeAI85YaNrBsQpcVUTRzPTEu+gcnuYpZIBvU="

Configuración de OpenSMTPD

Estas son las líneas correspondientes que he cambiado partiendo de la configuración del tutorial de Gilles, y aplicando la firma para dos dominios diferentes usando el parámetro -d y usando la opción mask-src para ocultar la IP del cliente:

[...]
filter dkimsign_rsa proc-exec "filter-dkimsign -d example.com -d example.net -s 20220425 -k /etc/mail/dkim/retrocircuitos.rsa.key" user _dkimsign group _dkimsign
filter dkimsign_ed25519 proc-exec "filter-dkimsign -a ed25519-sha256 -d example.com -d example.net -s 20220305 -k /etc/mail/dkim/retrocircuitos.com.ed25519.key" user _dkimsign group _dkimsign
filter dkimsign chain { dkimsign_rsa, dkimsign_ed25519 }
[...]
listen on all port submission tls-require pki mail.retrocircuitos.com auth filter dkimsign \
   mask-src
[...]

De esta forma, gracias a la opción chain de OpenSMTPD los correos enviados tendrán las dos firmas. Esta es la práctica recomendada por el RFC como periodo de transición hasta que las firmas Ed25519 sean comúnmente aceptadas.

Destacado

Misión

Admin Libre promueve el uso de software libre y de calidad tanto en los servidores como en el hardware de red con el objetivo de hacer los sistemas más seguros y auditables.