{"id":660,"date":"2019-10-24T17:07:02","date_gmt":"2019-10-24T15:07:02","guid":{"rendered":"https:\/\/www.tiraquelibras.com\/blog\/?p=660"},"modified":"2021-02-02T11:09:48","modified_gmt":"2021-02-02T10:09:48","slug":"servidor-de-correo-instalacion-y-configuracion-spf-dkim-y-dmarc-parte-9-15","status":"publish","type":"post","link":"https:\/\/blog.tiraquelibras.com\/?p=660","title":{"rendered":"Servidor de correo &#8211; Instalaci\u00f3n y configuraci\u00f3n SPF, DKIM y DMARC (parte 9)"},"content":{"rendered":"<p>Esta es una entrada dentro de la serie para la instalaci\u00f3n de un servidor de correo completo. \u00cdndice completo de contenidos pincha <a href=\"https:\/\/blog.tiraquelibras.com\/?p=601\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n<hr \/>\n<p>Vamos a instalar las medidas de seguridad para verificar que el mensaje proviene de los or\u00edgenes indicados en los registros DNS que mostraremos a continuaci\u00f3n. Estas configuraciones se hacen a nivel de dominio, siendo necesaria una configuraci\u00f3n independiente por cada dominio, tanto en el servidor de correo y DNS para el caso de\u00a0<strong>DKIM\u00a0<\/strong>y de DNS para el <strong>SPF <\/strong><em>y\u00a0<\/em><strong>DMARC <\/strong><em>(previa config del DKIM)<\/em>.<\/p>\n<p>Es recomendable actualizar los registros <strong>DKIM<\/strong> mensualmente, o al menos no m\u00e1s all\u00e1 de 6 meses, siguiendo los pasos anteriores. Solo es necesario dejar un par de semanas los dos registros DNS para <strong>DKIM<\/strong>, periodo tras el cual podemos proceder a borrar los registros antiguos.<\/p>\n<hr \/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de contenidos<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69f954b6a3eb5\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69f954b6a3eb5\"  aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Instalacion_de_paquetes\"  rel=\"nofollow\" target=\"_blank\">Instalaci\u00f3n de paquetes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#SPF\"  rel=\"nofollow\" target=\"_blank\">SPF<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Configuracion_DNS\"  rel=\"nofollow\" target=\"_blank\">Configuraci\u00f3n DNS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Configuracion_Postfix\"  rel=\"nofollow\" target=\"_blank\">Configuraci\u00f3n Postfix<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-5 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#DKIM\"  rel=\"nofollow\" target=\"_blank\">DKIM<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Configuracion\"  rel=\"nofollow\" target=\"_blank\">Configuraci\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Alta_dominio\"  rel=\"nofollow\" target=\"_blank\">Alta dominio<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Registro_DNS\"  rel=\"nofollow\" target=\"_blank\">Registro DNS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Comprobar_DKIM_creado\"  rel=\"nofollow\" target=\"_blank\">Comprobar DKIM creado<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Configurar_DKIM_en_Postfix\"  rel=\"nofollow\" target=\"_blank\">Configurar DKIM en Postfix<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Check_DKIM\"  rel=\"nofollow\" target=\"_blank\">Check DKIM<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Opcional\"  rel=\"nofollow\" target=\"_blank\">Opcional<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#Resumen_para_crear_un_nuevo_dominio\"  rel=\"nofollow\" target=\"_blank\">Resumen para crear un nuevo dominio<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-14 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\/#DMARC\"  rel=\"nofollow\" target=\"_blank\">DMARC<\/a><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"Instalacion_de_paquetes\"><\/span>Instalaci\u00f3n de paquetes<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Instalamos los paquetes para DKIM:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">apt-get install opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre<\/pre>\n<p>Agregamos el usuario <strong><em>postfix<\/em><\/strong> al grupo <strong><em>opendkim<\/em><\/strong> de tal forma que Postfix puede acceder al socket OpenDkim cuando lo necesite:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">adduser postfix opendkim<\/pre>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"SPF\"><\/span>SPF<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"Configuracion_DNS\"><\/span>Configuraci\u00f3n DNS<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Agregamos el registro <strong>SPF<\/strong> al dominio, en mi caso a <em><strong>tiraquelibras.com,<\/strong><\/em> indicando la <em><strong>IP est\u00e1tica<\/strong> <\/em>desde la cual se enviar\u00e1n los mensajes. Recuerda indicar la IP de tu servidor de correo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tiraquelibras.com IN TXT \u201cv=spf1 ip4:X.X.X.X\/32 -all\u201d<\/pre>\n<p>Recuerda que esto es necesario para cada dominio que vayas a configurar en tu servidor de correo.<\/p>\n<p>El par\u00e1metro\u00a0<em><strong>-all<\/strong><\/em><em> (hard fail) <\/em>indica que si falla el chequeo <strong>SPF<\/strong> se rechace el mensaje. De lo contrario tendr\u00edamos que indicar el par\u00e1metro\u00a0<em><strong>~all<\/strong><\/em><em> (softfail)<\/em>, para que de escriba la cabecera de error en el mensaje pero no rechace el mensaje.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Configuracion_Postfix\"><\/span>Configuraci\u00f3n Postfix<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Agregamos el agente para la pol\u00edtica SPF a Postfix editando el archivo <strong><em>\/etc\/postfix\/master.cf<\/em><\/strong> con la siguiente l\u00ednea al <strong><u>final del documento<\/u><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">policyd-spf  unix  -       n       n       -       0       spawn\r\n    user=policyd-spf argv=\/usr\/bin\/policyd-spf\r\n<\/pre>\n<p>Ahora indicamos el <em><strong>timeout<\/strong> <\/em>a la configuraci\u00f3n de Postfix para incrementar el <em><strong>timeout<\/strong> <\/em>del agente, el cual previene a Postfix de un fallo si las transacciones se ejecutan un poco lentas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">policyd-spf_time_limit = 3600<\/pre>\n<p>Y tambi\u00e9n agregamos la siguiente l\u00ednea en <strong><em>smtpd_recipient_restrictions<\/em><\/strong> para el argumento <strong><em>check_policy_service<\/em><\/strong>, aunque <span style=\"color: #ff0000;\"><strong>OJOOOOO<\/strong> <\/span>ha de ir despu\u00e9s del argumento <strong><em>reject_unauth_destination<\/em><\/strong> para evitar transformar el sistema en un <strong><em>OpenRelay<\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">smtpd_recipient_restrictions =\r\n    ...\r\n    reject_unauth_destination,\r\n    check_policy_service unix:private\/policyd-spf,\r\n    ...\r\n<\/pre>\n<p>Reiniciamos Postfix<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">systemctl restart postfix<\/pre>\n<p>Ahora si enviamos un mensaje entrante podemos ver el chequeo SPF en nuestros logs:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">policyd-spf[19080]: prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=\u2026<\/pre>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"DKIM\"><\/span>DKIM<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"Configuracion\"><\/span>Configuraci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ahora editamos el fichero para DKIM <strong><em>\/etc\/opendkim.conf<\/em><\/strong>, primero hacemos un backup del fichero original <strong><em>cp \/etc\/opendkim.conf \/etc\/opendkim.conf.orig<\/em><\/strong> y borramos el contenido para sustituirlo por el siguiente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># This is a basic configuration that can easily be adapted to suit a standard\r\n# installation. For more advanced options, see opendkim.conf(5) and\/or\r\n# \/usr\/share\/doc\/opendkim\/examples\/opendkim.conf.sample.\r\n\r\n# Log to syslog\r\nSyslog                  yes\r\n# Required to use local socket with MTAs that access the socket as a non-\r\n# privileged user (e.g. Postfix)\r\nUMask                   002\r\n\r\n# Sign for example.com with key in \/etc\/dkimkeys\/dkim.key using\r\n# selector '2007' (e.g. 2007._domainkey.example.com)\r\n#Domain                 example.com\r\n#KeyFile                \/etc\/dkimkeys\/dkim.key\r\n#Selector               2007\r\n\r\n# Commonly-used options; the commented-out versions show the defaults.\r\n#Canonicalization       simple\r\n#Mode                   sv\r\n#SubDomains             no\r\n\r\n# Socket smtp:\/\/localhost\r\n#\r\n# ##  Socket socketspec\r\n# ##\r\n# ##  Names the socket where this filter should listen for milter connections\r\n# ##  from the MTA.  Required.  Should be in one of these forms:\r\n# ##\r\n# ##  inet:port@address           to listen on a specific interface\r\n# ##  inet:port                   to listen on all interfaces\r\n# ##  local:\/path\/to\/socket       to listen on a UNIX domain socket\r\n#\r\n#Socket                  inet:8892@localhost\r\n###Socket                  local:\/var\/run\/opendkim\/opendkim.sock\r\nSocket                    local:\/var\/spool\/postfix\/opendkim\/opendkim.sock\r\n\r\n##  PidFile filename\r\n###      default (none)\r\n###\r\n###  Name of the file where the filter should write its pid before beginning\r\n###  normal operations.\r\n#\r\nPidFile               \/var\/run\/opendkim\/opendkim.pid\r\n\r\n\r\n# Always oversign From (sign using actual From and a null From to prevent\r\n# malicious signatures header fields (From and\/or others) between the signer\r\n# and the verifier.  From is oversigned by default in the Debian pacakge\r\n# because it is often the identity key used by reputation systems and thus\r\n# somewhat security sensitive.\r\nOversignHeaders         From\r\n\r\n##  ResolverConfiguration filename\r\n##      default (none)\r\n##\r\n##  Specifies a configuration file to be passed to the Unbound library that\r\n##  performs DNS queries applying the DNSSEC protocol.  See the Unbound\r\n##  documentation at http:\/\/unbound.net for the expected content of this file.\r\n##  The results of using this and the TrustAnchorFile setting at the same\r\n##  time are undefined.\r\n##  In Debian, \/etc\/unbound\/unbound.conf is shipped as part of the Suggested\r\n##  unbound package\r\n\r\n# ResolverConfiguration     \/etc\/unbound\/unbound.conf\r\n\r\n##  TrustAnchorFile filename\r\n##      default (none)\r\n##\r\n## Specifies a file from which trust anchor data should be read when doing\r\n## DNS queries and applying the DNSSEC protocol.  See the Unbound documentation\r\n## at http:\/\/unbound.net for the expected format of this file.\r\n\r\nTrustAnchorFile       \/usr\/share\/dns\/root.key\r\n\r\n##  Userid userid\r\n###      default (none)\r\n###\r\n###  Change to user \"userid\" before starting normal operation?  May include\r\n###  a group ID as well, separated from the userid by a colon.\r\n#\r\nUserID                opendkim\r\n\r\n\r\n# Map domains in From addresses to keys used to sign messages\r\nKeyTable        \/etc\/opendkim\/key.table\r\nSigningTable        refile:\/etc\/opendkim\/signing.table\r\n\r\n# Hosts to ignore when verifying signatures\r\nExternalIgnoreList  \/etc\/opendkim\/trusted.hosts\r\nInternalHosts       \/etc\/opendkim\/trusted.hosts\r\n\r\n# Commonly-used options; the commented-out versions show the defaults.\r\nCanonicalization    relaxed\/simple\r\nMode            sv\r\nSubDomains      no\r\n#ADSPAction     continue\r\nAutoRestart     yes\r\nAutoRestartRate     10\/1M\r\nBackground      yes\r\nDNSTimeout      5\r\nSignatureAlgorithm  rsa-sha256\r\n\r\nSyslogSuccess yes\r\nSoftwareHeader yes\r\nMinimumKeyBits 1024\r\nLogWhy yes\r\n###On-BadSignature reject\r\n<\/pre>\n<p>En el archivo anterior vamos a comentar la opci\u00f3n de rechazo ante un fallo en el chequeo DKIM de un mensaje, ya que muchos servidores de correo no lo tienen implementado, y por tanto podr\u00eda dar lugar a bloqueos de mensajes leg\u00edtimos.<\/p>\n<p>Confirmamos los permisos del fichero:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">chmod u=rw,go=r \/etc\/opendkim.conf<\/pre>\n<p>Creamos los directorios para guardar los ficheros de datos de OpenDKIM, asignando el propietario para el usuario <strong><em>opendkim<\/em><\/strong> y restringir el resto de permisos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">mkdir -p \/etc\/opendkim\/keys\r\n\r\nchown -R opendkim:opendkim \/etc\/opendkim\r\n\r\nchmod go-rw \/etc\/opendkim\/keys<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Alta_dominio\"><\/span>Alta dominio<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Creamos la tabla de firmas <strong><em>\/etc\/opendkim\/signing.table<\/em><\/strong> y agregamos una l\u00ednea por dominio que queremos manejar por el servidor de correo. Cada l\u00ednea deber\u00eda de tener el siguiente aspecto:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">*@tiraquelibras.com   prueba<\/pre>\n<p>El primer campo corresponde al patr\u00f3n que identifica las direcciones e email y el segundo es el nombre para la entrada de la tabla de llaves se deber\u00e1 de ser usado para firmar los emails para esas direcciones de email. Por simplicidad vamos a instalar una llave para todas las direcciones en el dominio.<\/p>\n<p>Creamos la tabla de llaves <strong><em>\/etc\/opendkim\/key.table<\/em><\/strong> que necesita tener una l\u00ednea por nombre de dominio corto incluido en la tabla de firmas. Cada l\u00ednea deber\u00eda de ser como la siguiente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">prueba     tiraquelibras.com:YYYYMM:\/etc\/opendkim\/keys\/prueba.private<\/pre>\n<p>El primer par\u00e1metro es el nombre corto para el dominio que indicamos en la tabla de firmas, que coincide al final con la extensi\u00f3n <strong><em>.private<\/em><\/strong><\/p>\n<p>Reemplazamos los valores <strong><em>YYYYMM<\/em><\/strong> por a\u00f1o y mes, el cual indica el selector para el dominio. Aqu\u00ed podemos indicar un nombre, como <strong><em>dkimIDmail <\/em><\/strong>por ejemplo.<\/p>\n<p>El primer par\u00e1metro conecta la tabla de firmas con la de llaves.<\/p>\n<p>Las partes de esta l\u00ednea son:<\/p>\n<ul>\n<li>La primera es el nombre de dominio por el cual la llave es usada.<\/li>\n<li>La segunda secci\u00f3n es un selector usado cuando se resuelve los registros de la llave en el DNS.<\/li>\n<li>La tercer secci\u00f3n nombra el archivo que contiene la llave de la firma para el dominio.<\/li>\n<\/ul>\n<p>Creamos el archivo de host de confianza <strong><em>\/etc\/opendkim\/trusted.hosts<\/em><\/strong> con el siguiente contenido:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">127.0.0.1\r\n::1\r\nlocalhost\r\nmyhostname\r\nmyhostname.tiraquelibras.com\r\ntiraquelibras.com\r\n<\/pre>\n<p>Sustituir <strong><em>myhostname<\/em><\/strong> por el nombre de host del servidor. Estamos identificando los hosts que los usuarios usar\u00e1n para el env\u00edo de emails y deben tener el env\u00edo firmado.<\/p>\n<p>Cambiar los permisos y propietarios en <strong><em>\/etc\/opendkim<\/em><\/strong> y su contenido para el usuario <strong><em>opendkim<\/em><\/strong> con los siguientes comandos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">chown -R opendkim:opendkim \/etc\/opendkim\r\n\r\nchmod -R go-rwx \/etc\/opendkim\/keys<\/pre>\n<p>Generamos las claves para cada dominio en el directorio <strong><em>\/etc\/opendkim\/keys\/ <\/em><\/strong>con el comando, cambiando YYYYMM por el identificador del dominio que indicamos en el archivo <strong><em>\/etc\/opendkim\/key.table<\/em><\/strong>, recomendando indicar <em><strong>a\u00f1omes<\/strong><\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">opendkim-genkey -b 2048 -h rsa-sha256 -r -s YYYYMM -d example.com -v<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Ojo<\/strong> <\/span>que para que mi proveedor DNS acepte la longitud de para el registro DKIM voy a usar una longitud de 1024 en lugar de 2048 bits. El comando quedar\u00eda de la siguiente forma:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">opendkim-genkey -b 1024 -h rsa-sha256 -r -s 201908 -d prueba.yeloquehay.com -v<\/pre>\n<p>El comando muestra las siguientes l\u00edneas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">opendkim-genkey: generating private key\r\n\r\nopendkim-genkey: private key written to 201908.private\r\n\r\nopendkim-genkey: extracting public key\r\n\r\nopendkim-genkey: DNS TXT record written to 201908.txt<\/pre>\n<p>Se crean en el directorio actual los archivos <strong><em>201908.private<\/em><\/strong> con la clave privada y <strong><em>201908.txt<\/em><\/strong> con el registro DNS que debemos de crear con una entrada TXT.<\/p>\n<p>Renombramos los ficheros con un nombre que haga referencia al fichero que indicamos en el fichero <strong><em>key.table<\/em><\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">mv 201908.private prueba.private\r\n\r\nmv 201908.txt prueba.txt<\/pre>\n<p>Repetir esto con cada dominio en la tabla de llaves. El par\u00e1metro <strong><em>-b 2048<\/em><\/strong> indica el n\u00famero de bits para el par de llaves RSA para firma y verificaci\u00f3n. 1024 es el valor m\u00ednimo, pero los con hardware modernos 2048 es m\u00e1s seguro (incluso es posible que 4096 sea requerido en alguna ocasi\u00f3n).<\/p>\n<p>Nos aseguramos que el propietario, permisos y contenidos en <strong><em>\/etc\/opendkim<\/em><\/strong> son correctos ejecutando los siguientes comandos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">cd \/etc\r\n\r\nchown -R opendkim:opendkim \/etc\/opendkim\r\n\r\nchmod -R go-rw \/etc\/opendkim\/keys<\/pre>\n<p>Chequeamos que OpenDKIM se inicia correctamente<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">systemctl restart opendkim<\/pre>\n<p>y si hubiera errores ejecutar para obtener el estado y los mensajes de error:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">systemctl status -l opendkim<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Registro_DNS\"><\/span>Registro DNS<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Generamos el registro en el DNS de nuestro dominio contenido en el archivo renombrado como <strong><em>prueba.txt,\u00a0<\/em><\/strong>no se muestra el c\u00f3digo completo por seguridad<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">YYYYMM._domainkey       IN      TXT     ( \"v=DKIM1; h=rsa-sha256; k=rsa; s=email; \"\r\n          \"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcl79Vak66R3dxO...\" )  ; ----- DKIM key 201908 for tiraquelibras.com\r\n<\/pre>\n<p>siendo YYYYMM el identificador que le indicamos en el comando ejecutado antes.<\/p>\n<p>Debemos de tener en cuenta que el primer valor es el subdominio a crear y el valor del registro es el que hay entre los par\u00e9ntesis, entre las dobles comillas<strong> NO INCLUIDAS<\/strong>, siendo el origen <strong><em>v=DKIM1<\/em><\/strong>. Luego borramos el resto de comillas dobles y los espacios en blanco entre estas. Tambi\u00e9n cambiamos <strong>h=rsa-sha256<\/strong> \u00a0por <strong><em>h=sha256<\/em><\/strong>. El resultado ser\u00eda, no se muestra el c\u00f3digo completo por seguridad:<\/p>\n<p><strong><em>v=DKIM1; h=sha256; k=rsa; s=email; p=MIGfMA0GCSqGSIb3DQEBAQ&#8230;<\/em><\/strong><\/p>\n<p>Este paso hay que realizarlo por cada dominio que vayamos a configurar en nuestro servidor de correo.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Comprobar_DKIM_creado\"><\/span>Comprobar DKIM creado<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Hacemos un test para comprobar la configuraci\u00f3n DKIM para el dominio creado con el comando<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">opendkim-testkey -d tiraquelibras.com -s 201908<\/pre>\n<p><strong><span style=\"text-decoration: underline;\">Si todo ha ido bien no deber\u00edamos de obtener respuesta alguna<\/span><\/strong>. Si necesitamos m\u00e1s informaci\u00f3n agregamos <strong><em>-vvv<\/em><\/strong> al final del comando.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">opendkim-testkey: using default configfile \/etc\/opendkim.conf\r\nopendkim-testkey: checking key '201909._domainkey.tiraquelibras.com'\r\nopendkim-testkey: key not secure\r\nopendkim-testkey: key OK\r\n<\/pre>\n<p>Al final se indica <strong><em>key OK<\/em><\/strong>. Justamente antes se indica <strong><em>key not secure<\/em><\/strong> debido a que el domnio no tiene configurado a\u00fan <strong>DNSSEC<\/strong>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Configurar_DKIM_en_Postfix\"><\/span>Configurar DKIM en Postfix<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Configuramos DKIM en Postfix.<\/p>\n<p>Creamos el directorio para el socket OpenDKIM en el \u00e1rea de trabajo de Postfix y nos aseguramos que los permisos son los correctos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">mkdir \/var\/spool\/postfix\/opendkim\r\n\r\nchown opendkim:postfix \/var\/spool\/postfix\/opendkim<\/pre>\n<p>Ahora indicamos el socket correcto para Postfix en el fichero defaults de OpenDKIM dentro del archivo <strong><em>\/etc\/default\/opendkim<\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># Command-line options specified here will override the contents of\r\n# \/etc\/opendkim.conf. See opendkim(8) for a complete list of options.\r\n#DAEMON_OPTS=\"\"\r\n# Change to \/var\/spool\/postfix\/var\/run\/opendkim to use a Unix socket with\r\n# postfix in a chroot:\r\n#RUNDIR=\/var\/spool\/postfix\/var\/run\/opendkim\r\nRUNDIR=\/var\/run\/opendkim\r\n#\r\n# Uncomment to specify an alternate socket\r\n# Note that setting this will override any Socket value in opendkim.conf\r\n# default:\r\n###SOCKET=local:$RUNDIR\/opendkim.sock\r\n\r\n######SOCKET=\"inet:8891@localhost\"\r\nSOCKET=\"local:\/var\/spool\/postfix\/opendkim\/opendkim.sock\"\r\n\r\n# listen on all interfaces on port 54321:\r\n#SOCKET=inet:54321\r\n# listen on loopback on port 12345:\r\n#SOCKET=inet:12345@localhost\r\n# listen on 192.0.2.1 on port 12345:\r\n#SOCKET=inet:12345@192.0.2.1\r\nUSER=opendkim\r\nGROUP=opendkim\r\nPIDFILE=$RUNDIR\/$NAME.pid\r\nEXTRAAFTER=\r\n<\/pre>\n<p>La ruta al socket es diferente al de por defecto porque en DEBIAN el proceso Postfix que maneja los emails se ejecuta en un <em><strong>chroot jail<\/strong> <\/em>y no puede acceder a la localizaci\u00f3n normal.<\/p>\n<p>Editamos el archivo de Postfix <strong><em>\/etc\/postfix\/main.cf<\/em><\/strong> y agregamos las l\u00edneas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># Milter configuration\r\n# OpenDKIM\r\nmilter_default_action = accept\r\n# Postfix \u2265 2.6 milter_protocol = 6, Postfix \u2264 2.5 milter_protocol = 2\r\nmilter_protocol = 6\r\nsmtpd_milters = local:opendkim\/opendkim.sock\r\nnon_smtpd_milters = local:opendkim\/opendkim.sock\r\n<\/pre>\n<p>Se puede poner en cualquier lugar del fichero, pero la pr\u00e1ctica habitual es hacerlo despu\u00e9s de la entrada <strong><em>smtpd_recipient_restrictions<\/em><\/strong>. La ruta es distinta a la del archivo <strong><em>\/etc\/defaults\/opendkim<\/em><\/strong> debido al<em><strong> chroot jail<\/strong><\/em> de Postfix, cuya ruta aqu\u00ed es la ruta con la vista restringida del <em><strong>filesystem<\/strong> <\/em>en lugar de el actual <em><strong>filesystem<\/strong><\/em>.<\/p>\n<p>Reiniciamos el servicio OpenDKIM<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">systemctl restart opendkim<\/pre>\n<p>Reiniciamos Postfix<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">systemctl restart postfix<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Check_DKIM\"><\/span>Check DKIM<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Confirmamos nuestra configuraci\u00f3n DKIM enviando un email a la direcci\u00f3n <a href=\"mailto:check-auth@verifier.port25.com\"><strong><em>check-auth@verifier.port25.com<\/em><\/strong><\/a> desde donde nos enviar\u00e1n un informe completo de los chequeos de seguridad pertinentes, incluido el SPF y SpamAssassin flagging en el dominio origen. Tambi\u00e9n si detecta problemas o errores.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Opcional\"><\/span>Opcional<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>agregar a nivel DNS la entrada para <strong><em>ADSP (Author Domain Signing Practices)<\/em><\/strong>, info pinchando <a href=\"https:\/\/en.wikipedia.org\/wiki\/Author_Domain_Signing_Practices\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">aqu\u00ed<\/a>, en donde indicamos que todos los emails para este dominio deben de ser firmados con DKIM. Para ello creamos una entrada <em><strong>TXT<\/strong> <\/em>para el host <strong><em>_adsp._domainkey<\/em><\/strong> con el valor <strong><em>dkim=all<\/em><\/strong>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Resumen_para_crear_un_nuevo_dominio\"><\/span>Resumen para crear un nuevo dominio<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Resumiendo, para agregar un nuevo dominio una vez instalado DKIM en nuestro sistema, debemos de realizar las siguientes tareas:<\/p>\n<ul>\n<li>Creamos la entrada para la nueva firma en el fichero <strong><em>\/etc\/opendkim\/signing.table<\/em><\/strong> en donde indicamos el dominio y el identificador del dominio.<\/li>\n<li>Creamos la entrada para la nueva llave en el fichero <strong><em>\/etc\/opendkim\/key.table<\/em><\/strong> en donde indicamos el identificador anterior, el dominio, el identificador para DKIM y el fichero con la clave privada.<\/li>\n<li>Generamos la clave privada en un directorio de pruebas (por ejemplo <em><strong>\/root<\/strong><\/em>) y lo renombramos como lo indicado en el fichero anterior para la llave privada. Comando <strong><em>opendkim-genkey -b 1024 -h rsa-sha256 -r -s 201908 -d prueba.yeloquehay.com -v<\/em><\/strong>, renombramos los ficheros generados como acabamos de decir y los movemos al directorio <strong><em>\/etc\/opendkim\/keys\/<\/em><\/strong>.<\/li>\n<li>Paramos OpenDKIM y Postfix con el comando <strong><em>systemctl stop postfix opendkim<\/em><\/strong>.<\/li>\n<li>Confirmamos los permisos de los directorios con los comados:<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">cp *.private \/etc\/opendkim\/keys\/\r\n\r\nchown opendkim:opendkim \/etc\/opendkim\/keys\/*\r\n\r\nchmod go-rw \/etc\/opendkim\/keys\/*<\/pre>\n<ul>\n<li>Arrancamos OpenDKIM y Postfix con:<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">systemctl start opendkim\r\n\r\nsystemctl start postfix<\/pre>\n<ul>\n<li>Generamos los registros DNS pertinentes para DKIM\/ADSP (con la clave y con el forzado a que todos los mensajes vayan firmados) y DMARC.<\/li>\n<\/ul>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"DMARC\"><\/span>DMARC<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>La entrada <strong>DMARC <\/strong>se realiza a nivel de DNS e informa a los servidores de correo que piensas que deber\u00edan de hacer con los emails que dicen ser de tu dominio cuya validaci\u00f3n fallara con el <strong>SPF<\/strong> y\/o <strong>DKIM<\/strong>. Adem\u00e1s permite recibir reportes sobre emails que fallan al pasar una o m\u00e1s validaciones. SOLO deber\u00eda de activarse si tenemos <strong>SPF<\/strong> y <strong>DKIM<\/strong> correctamente, de lo contrario ir\u00e1n al SPAM del destino.<\/p>\n<p>Existen m\u00faltiples configuraciones posibles, pudiendo consultarlas en su web oficial pinchando <a href=\"https:\/\/dmarc.org\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">aqu\u00ed<\/a>, pero yo voy a mostrar un ejemplo de lo que decid\u00ed configurar para mis dominios. Recuerda que esta configuraci\u00f3n se debe de realizar por cada dominio que tenemos configurado en nuestro servidor de correo.<\/p>\n<p>La entrada DMARC es de tipo TXT para el host <strong><em>_dmarc<\/em><\/strong> con los siguientes valores recomendados:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r<\/pre>\n<p>Esto indica a los servidores de correo que de fallar los chequeos SPF y DKIM no descarten el mensaje pero lo metan en cuarentena. No existe ning\u00fan reporte. Muchos servidores de correo implementan software que generan reportes cuando fallan los mensajes, por lo que para recibirlos mejor agregar la siguiente l\u00ednea, por ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r;fo=1;rf=afrf;rua=mailto:user@example.com<\/pre>\n<p>En donde <strong><em>mailto:<\/em><\/strong> indica el email en donde recibir estos informes.<\/p>\n<hr \/>\n<p>\u00cdndice general pincha <a href=\"https:\/\/blog.tiraquelibras.com\/?p=601\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta es una entrada dentro de la serie para la instalaci\u00f3n de un servidor de correo completo. \u00cdndice completo de contenidos pincha aqu\u00ed. Vamos a<span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/blog.tiraquelibras.com\/?p=660\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":661,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,22],"tags":[74,75,77,76],"class_list":["post-660","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sistemas","category-ti","tag-dkim","tag-dmarc","tag-seguridad-email","tag-spf"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=660"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/660\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/media\/661"}],"wp:attachment":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}