Aplicación de estrategias de seguridad¶
Políticas de regulación de cantidad de mails¶
Sanidad DNS de los envíos¶
Hoy en día, los correos que salen deben:- estar firmados con una firma DKIM
- tener, en sus dominios, registros SPF (Sender Policy Framework) y DMARC válidos.
Los principales cambios que hay que hacer para aplicar estas políticas de seguridad son a nivel DNS.
Por lo tanto para aplicarlas, se debe tener acceso a uno de los servidores DNS.
SPF¶
Referencias:- RFC 7208
- OpenSPF, en particular las buenas prácticas, los errores comunes y las preguntas frecuentes
Para configurar los registros SPF, podemos usar este generador.
Tenemos definida una política SPF que se puede usar para los dominios hospedados en los servidores Dirac o Godel:
_spf.interior.edu.uy. IN TXT "v=spf1 ip4:164.73.68.8 ip4:164.73.68.19 p4:164.73.68.14 ip4:164.73.68.37 ip4:164.73.68.5 ip4:164.73.68.52 ip4:164.73.68.55 ?all"
Incluye también las IP de otros servidores que envían mail: Davinci, Pacioli, Russell, Carroll, Taylor (y conviene verificar que están todos los servidores que envían mail)
Para utilizarla desde un dominio, se define en el DNS una de las políticas siguientes:
@ IN TXT "v=spf1 include:_spf.interior.edu.uy ?all" @ IN TXT "v=spf1 include:_spf.interior.edu.uy ~all" @ IN TXT "v=spf1 include:_spf.interior.edu.uy -all"
según que querramos o no exigir que los usuarios manden mails sólo a través de nuestros servidores.
(La configuración de la zona DNS de la mayoría de los dominios del interior se almacena en el servidor Massera.
Entrando a Massera, entonces editamos el archivo de zona. Para los dominios y subdominios del Cup sería el fichero /usr/local/etc/bind/db.cup.edu.uy.)
Los dominios también pueden definir específicamente su política, como ser:
@ IN TXT "v=spf1 mx a:russell.csic.edu.uy a:godel.csic.edu.uy ?all"
DMARC¶
_dmarc.cup.edu.uy IN TXT "v=DMARC1; p=quarantine; rua=mailto:<mail de contacto>"
DKIM¶
Para configurar esto nos basamos en la configuración oficial de Zimbra: http://wiki.zimbra.com/wiki/Configuring_for_DKIM_Signing
Primero tenemos que generar las claves DKIM publicas y privadas de la siguiente manera:
zimbra@godel:~/temp$ ../libexec/zmdkimkeyutil -a -d cup.edu.uy DKIM Data added to LDAP for domain cup.edu.uy with selector 9A3E9D38-C753-11E4-9E0B-4983B179040E Public signature to enter into DNS: 9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM5l0PzWOStp7aW1kkK3DveLoxYxpduF6LPqCpJzwquKXq2d1HrTG8QDo8eqX41DgOsRkG5zAmBp4RuB3Blg9OoxE4i0Suy2+ZAcctnIgyPQrZW+wXRf1mNEJXM8PFN2iSXLv8I+rqmO9LsNtGDHLlVj1+ncBL8vRg6gvIZPh8OwIDAQAB" ) ; ----- DKIM key 9A3E9D38-C753-11E4-9E0B-4983B179040E for cup.edu.uy
En el DNS creamos un registro TXT para ese selector:
; Implementación de firma pública DKIM: https://proyectos.interior.edu.uy/issues/3603 9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM5l0PzWOStp7aW1kkK3DveLoxYxpduF6LPqCpJzwquKXq2d1HrTG8QDo8eqX41DgOsRkG5zAmBp4RuB3Blg9OoxE4i0Suy2+ZAcctnIgyPQrZW+wXRf1mNEJXM8PFN2iSXLv8I+rqmO9LsNtGDHLlVj1+ncBL8vRg6gvIZPh8OwIDAQAB" ) ; ----- DKIM key 9A3E9D38-C753-11E4-9E0B-4983B179040E for cup.edu.uy
También es necesario agregar un registro para el dominio en si:
;Hay que agergar el policy Record: https://www.howtoforge.com/how-to-implement-domainkeys-in-postfix-using-dk-milter-centos5.1 _domainkey IN TXT "t=y; o=~"
Luego de hacer cualquier cambio en la config DNS, para que sean tomados, hay que recargar el servicio:
root@massera:/usr/local/etc/bind# service bind9 reload
Luego se pueden consultar los logs (/var/log/syslog) para verificar que no hayan errores.
Verificación¶
Para conocer todods los datos (clave pública y privada) de una huella DKIM genarada para un dominio usamos:
zimbra@godel:~$ ./libexec/zmdkimkeyutil -q -d cup.edu.uy
Para verificar que las huellas estén correctamente configuradas en el servidor DNS desde el servidor Zimbra:
zimbra@godel:~$ /opt/zimbra/opendkim-2.9.2/sbin/opendkim-testkey -vvv -d cup.edu.uy -s 9A3E9D38-C753-11E4-9E0B-4983B179040E -x /opt/zimbra/conf/opendkim.conf opendkim-testkey: checking key '9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey.cup.edu.uy' opendkim-testkey: key OK
También para verificar, podemos hacer una consulta DNS para conocer si el registro TXT está definido:
$ dig -t TXT 9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey.cup.edu.uy ; <<>> DiG 9.9.5-3-Ubuntu <<>> -t TXT 9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey.cup.edu.uy ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27152 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey.cup.edu.uy. IN TXT ;; ANSWER SECTION: 9A3E9D38-C753-11E4-9E0B-4983B179040E._domainkey.cup.edu.uy. 86400 IN TXT "v=DKIM1\; k=rsa\; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM5l0PzWOStp7aW1kkK3DveLoxYxpduF6LPqCpJzwquKXq2d1HrTG8QDo8eqX41DgOsRkG5zAmBp4RuB3Blg9OoxE4i0Suy2+ZAcctnIgyPQrZW+wXRf1mNEJXM8PFN2iSXLv8I+rqmO9LsNtGDHLlVj1+ncBL8vRg6gvIZPh8OwIDAQAB" ;; AUTHORITY SECTION: cup.edu.uy. 600 IN NS massera.csic.edu.uy. cup.edu.uy. 600 IN NS seciu.edu.uy. ;; ADDITIONAL SECTION: seciu.edu.uy. 55247 IN A 164.73.128.5 seciu.edu.uy. 58519 IN AAAA 2001:1328:6::5 massera.csic.edu.uy. 576 IN A 164.73.68.7 ;; Query time: 293 msec ;; SERVER: 127.0.1.1#53(127.0.1.1) ;; WHEN: Tue Mar 10 15:52:17 UYT 2015 ;; MSG SIZE rcvd: 442
En el servidor de listas (Russell)¶
A continuación de muestran las configuraciones aplicadas para el dominio listas.cure.edu.uy
SPF¶
Entrando a Massera, entonces editamos el archivo de zona. Para los dominios y subdominios del Cure sería el fichero /usr/local/etc/bind/db.cure.edu.uy.
En cuanto a SPF, Para los dominios del interior, esta es la que más se ajusta se ajusta a nuestro caso y que ya se ha probada que funciona:
listas IN TXT "v=spf1 mx ptr a:russell.csic.edu.uy a:godel.csic.edu.uy -all"
DMARC¶
_dmarc.listas.cure.edu.uy IN TXT "v=DMARC1; p=quarantine; rua=mailto:<mail de contacto>"
DKIM¶
Para configurar DKIM para el envío de mails desde Russell, en lugar de utilizar DKIM milter como aconseja Sympa, utilizamos Opendkim: para realizar una instalación dessde paquetes .deb.
Comenzamos por aplicar este tutorial para instalar la mencionada herramienta:
apt-get install opendkim opendkim-toolsSe crean los directorios donde irán las claves pública y privada:
mkdir -pv /etc/opendkim/listas.cure.edu.uy/ chown -R opendkim:opendkim /etc/opendkim chmod 755 /etc/opendkim/*Generación de clave:
cd /etc/opendkim/listas.cure.edu.uy/ opendkim-genkey -d listas.cure.edu.uy -s email mv -v email.private email.key chown opendkim:opendkim * chmod 600 *Luego que tenemos esto, hay que aplicar la configuración DKIM al sympa.conf o el robot.conf para el robot virtual en cuestión:
dkim_feature on dkim_add_signature_to list,robot dkim_signature_apply_on md5_authenticated_messages,smime_authenticated_messages, dkim_authenticated_messages,editor_validated_messages dkim_private_key_path /etc/opendkim/listas.cure.edu.uy/email.key dkim_signer_domain listas.cure.edu.uy dkim_selector email dkim_signer_identity noneSe recarga sympa
service sympa reload
Después vamos a Massera para agregar el correspondiente registro TXT DNS:
nano /usr/local/etc/bind/db.cure.edu.uy
email._domainkey.listas IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9MB4rmOmOtkQPxkVQyQkUwXG3p5qkor2adu5uORks6lv6omF5eLhDLCnN86tMuM2dPwo6xz3Rh8SZ5ph0DrtwePfCVzHYB/Uux6DQmNAKORH2HVkiO7zz8cVBWWaKgxGkZiXl79nNIrsUf7qoBdF2NWiyD638EgYpoKZaIiNhGQIDAQAB" ; ----- DKIM key email for listas.cure.edu.uy
También es necesario agregar un registro para el dominio en si (es decir que además del registro para el separador tenemos que agregar otro "vacío"):
;Hay que agergar el policy Record: https://www.howtoforge.com/how-to-implement-domainkeys-in-postfix-using-dk-milter-centos5.1 _domainkey.listas IN TXT "t=y; o=~"
Se recarga el servicio:
service bind9 reload
Verificación¶
Testing desde russell o máquina local:
apias@batamachine:~$ dig -t TXT email._domainkey.listas.cure.edu.uy ; <<>> DiG 9.9.5-3-Ubuntu <<>> -t TXT email._domainkey.listas.cure.edu.uy ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65086 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;email._domainkey.listas.cure.edu.uy. IN TXT ;; ANSWER SECTION: email._domainkey.listas.cure.edu.uy. 411 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9MB4rmOmOtkQPxkVQyQkUwXG3p5qkor2adu5uORks6lv6omF5eLhDLCnN86tMuM2dPwo6xz3Rh8SZ5ph0DrtwePfCVzHYB/Uux6DQmNAKORH2HVkiO7zz8cVBWWaKgxGkZiXl79nNIrsUf7qoBdF2NWiyD638EgYpoKZaIiNhGQIDAQAB" ;; AUTHORITY SECTION: cure.edu.uy. 185 IN NS seciu.edu.uy. cure.edu.uy. 185 IN NS massera.csic.edu.uy. ;; ADDITIONAL SECTION: seciu.edu.uy. 37597 IN A 164.73.128.5 seciu.edu.uy. 37756 IN AAAA 2001:1328:6::5 massera.csic.edu.uy. 342 IN A 164.73.68.7 ;; Query time: 17 msec ;; SERVER: 127.0.1.1#53(127.0.1.1) ;; WHEN: Mon Feb 16 20:24:32 UYST 2015 ;; MSG SIZE rcvd: 418
root@russell:/etc/opendkim/listas.cure.edu.uy# opendkim-testkey -vvv -d listas.cure.edu.uy -s email -k /etc/opendkim/listas.cure.edu.uy/email.key opendkim-testkey: key loaded from /etc/opendkim/listas.cure.edu.uy/email.key opendkim-testkey: checking key 'email._domainkey.listas.cure.edu.uy' opendkim-testkey: key not secure opendkim-testkey: key OK
Mediante estos dos links para chequear si la configuración DNS de nuestros dominios es correcta en cuanto a la definición de los registros TXT para DKIM:
- http://domainkeys.sourceforge.net/policycheck.html
- http://domainkeys.sourceforge.net/selectorcheck.html
Luego de que los registros DNS se han propagado correctamente, la prueba de fuego para saber si los registros DKIM han sido definidos correctamente, es verificar en las cabeceras de los mails enviados, que estamos enviando (spf=pass) y (dkim=pass) en los mismos.
spf=pass (google.com: domain of pruebas-adminsys-owner@listas.cure.edu.uy designates 164.73.68.14 as permitted sender) smtp.mail=pruebas-adminsys-owner@listas.cure.edu.uy; dkim=pass header.i=@listas.cure.edu.uy