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:

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-tools
Se 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    none
Se 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:

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