<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Aleph &#187; correo</title>
	<atom:link href="http://aleph.llull.net/tag/correo/feed/" rel="self" type="application/rss+xml" />
	<link>http://aleph.llull.net</link>
	<description></description>
	<lastBuildDate>Mon, 01 Aug 2011 08:48:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Como probar SMTP AUTH mediante CRAM-MD5</title>
		<link>http://aleph.llull.net/2010/12/09/como-probar-smtp-auth-mediante-cram-md5/</link>
		<comments>http://aleph.llull.net/2010/12/09/como-probar-smtp-auth-mediante-cram-md5/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 21:38:28 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[cram-md5]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[seguridad]]></category>
		<category><![CDATA[smtp auth]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=914</guid>
		<description><![CDATA[En artículos anteriores ya he hecho referencia al excelente artículo de Jaume Sabater sobre la instalación y configuración de un servidor de correo con Postfix. En su artículo hace el razonamiento de que como la autenticación se va a realizar sobre un canal cifrado no hace falta habilitar los métodos de autenticación CRAM-MD5 o ﻿﻿DIGEST-MD5﻿, que permiten [...]]]></description>
			<content:encoded><![CDATA[<p>En <a href="/2009/06/06/firmas-dkim-con-postfix-y-amavis/">artículos anteriores</a> ya he hecho referencia <a title="Configuración de un completo servidor de correo seguro con Postfix y Cyrus" href="http://linuxsilo.net/articles/postfix.html">al excelente artículo de Jaume Sabater</a> sobre la instalación y configuración de un servidor de correo con Postfix. En su artículo hace el razonamiento de que como la autenticación se va a realizar sobre un canal cifrado no hace falta habilitar los métodos de autenticación <a href="http://en.wikipedia.org/wiki/CRAM-MD5">CRAM-MD5</a> o ﻿﻿DIGEST-MD5﻿, que permiten hacer login sin transmitir la contraseña en plano (como pasa con los métodos PLAIN o LOGIN). Y no le falta razon, pero yo he tomado un camino intermedio: en el servidor SMTP por el puerto 587 (submission) están permitidos todos los métodos de autenticación ya que se fuerza el cifrado de la conexión; pero por el 25 no permito los métodos de autenticación PLAIN o LOGIN para evitar la tentación de hacer login con uno de esos métodos mediante un canal inseguro, pero sí permito CRAM-MD5 o DIGEST-MD5.</p>
<p>Para conseguir este efecto, nos aseguraremos que el siguiente parametro este definido en el fichero <code>/etc/postfix/main.cf</code><br />
<code>smtpd_sasl_security_options = ﻿noplaintext, noanonymous</code></p>
<p>Con esto conseguiremos que por defecto no se permita ni PLAIN ni LOGIN. Para habilitarlos por el puerto de submission, modificaremos la definición del servicio submission en el fichero <code>/etc/postfix/master.cf</code> añadiendo la línea:<br />
<code>-o smtpd_sasl_security_options=noanonymous</code></p>
<p>El problema viene a la hora de comprobar que podemos hacer login mediante, por ejemplo, CRAM-MD5 ya que el cliente debe calcular el <a href="http://en.wikipedia.org/wiki/HMAC">HMAC-MD5</a> de un string generado por el servidor, siendo la clave del algoritmo la contraseña del usuario, para realizar la autenticación sin que el usuario deba revelar su contraseña. Pero no es nada que unas cuantas lineas de Perl no puedan resolver:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000000; font-weight: bold;">use</span> MIME<span style="color: #339933;">::</span><span style="color: #006600;">Base64</span>
<span style="color: #000000; font-weight: bold;">use</span> Digest<span style="color: #339933;">::</span><span style="color: #006600;">HMAC_MD5</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>hmac_md5_hex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> encode_base64<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #339933;">.</span> hmac_md5_hex<span style="color: #009900;">&#40;</span>decode_base64<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Los argumentos a pasarle son:</p>
<ol>
<li>el <em>challenge</em> generado por el servidor</li>
<li>el nombre de usuario</li>
<li>la contraseña</li>
</ol>
<p>Pero nada mejor que un ejemplo para ver como funciona.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">S: <span style="color: #000000;">220</span> mail.example.com ESMTP Postfix <span style="color: #7a0874; font-weight: bold;">&#40;</span>Debian<span style="color: #000000; font-weight: bold;">/</span>GNU<span style="color: #7a0874; font-weight: bold;">&#41;</span>
C: ehlo client.example.com
S: <span style="color: #000000;">250</span>-mail.example.com
S: <span style="color: #000000;">250</span>-PIPELINING
S: <span style="color: #000000;">250</span>-SIZE <span style="color: #000000;">10240000</span>
S: <span style="color: #000000;">250</span>-ETRN
S: <span style="color: #000000;">250</span>-STARTTLS
S: <span style="color: #000000;">250</span>-AUTH DIGEST-MD5 NTLM CRAM-MD5
S: <span style="color: #000000;">250</span>-AUTH=DIGEST-MD5 NTLM CRAM-MD5
S: <span style="color: #000000;">250</span>-ENHANCEDSTATUSCODES
S: <span style="color: #000000;">250</span>-8BITMIME
S: <span style="color: #000000;">250</span> DSN
C: AUTH CRAM-MD5
S: <span style="color: #000000;">334</span> PDQwMTc3NTY4MTAuODMzNzFAb3ZoMjAxMC5sbHVsbC5uZXQ+</pre></div></div>

<p>Al indicarle que queremos autenticarnos mediante CRAM-MD5 el servidor nos proporciona el <em>challenge</em> que pasaremos al script en Perl junto con el nombre de usuario y la contraseña en otra consola.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ .<span style="color: #000000; font-weight: bold;">/</span>cram-md5.pl PDQwMTc3NTY4MTAuODMzNzFAb3ZoMjAxMC5sbHVsbC5uZXQ+ user password
<span style="color: #007800;">dXNlciA3MTUxODVjYTRkMzMxOGRkMzYxZTg2NDg4M2ZkNmE3NA</span>==</pre></div></div>

<p>Para autenticarnos, le enviaremos el string obtenido al servidor.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">C: <span style="color: #007800;">dXNlciA3MTUxODVjYTRkMzMxOGRkMzYxZTg2NDg4M2ZkNmE3NA</span>==
S: <span style="color: #000000;">235</span> 2.7.0 Authentication successful
C: quit
S: <span style="color: #000000;">221</span> 2.0.0 Bye</pre></div></div>

<p><small>(&#8216;$&#8217; denota el <em>promt</em> de la shell, &#8216;S&#8217; una línea recibida del servidor y &#8216;C&#8217; una línea enviada por el cliente)</small></p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2010/12/09/como-probar-smtp-auth-mediante-cram-md5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firmas DKIM con Postfix y Amavis</title>
		<link>http://aleph.llull.net/2009/06/06/firmas-dkim-con-postfix-y-amavis/</link>
		<comments>http://aleph.llull.net/2009/06/06/firmas-dkim-con-postfix-y-amavis/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 15:57:31 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[dkim]]></category>
		<category><![CDATA[firma digital]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[postfix]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=730</guid>
		<description><![CDATA[Hace bastantes meses escribí un artículo sobre como configurar el SpamAssassin para que verifique las firmas DKIM para luchar contra el Spam y me quedó pendiente explicar como firmar nuestros própios correos. Por aquel entonces era más o menos complicado pero desde la release de Debian Lenny, que incluye el paquete amavisd-new 2.6.1, la tarea se [...]]]></description>
			<content:encoded><![CDATA[<p>Hace bastantes meses escribí <a title="DomainKeys Identified Mail" href="http://aleph.llull.net/2008/10/23/domainkeys-identified-mail/">un artículo</a> sobre como configurar el <a href="http://spamassassin.apache.org/">SpamAssassin</a> para que verifique las firmas <abbr title="DomainKeys Identified Mail">DKIM</abbr> para luchar contra el Spam y me quedó pendiente explicar como firmar nuestros própios correos. Por aquel entonces era más o menos complicado pero desde la <em>release</em> de <a href="http://www.debian.org/">Debian</a> <a href="http://www.debian.org/releases/lenny/">Lenny</a>, que incluye el paquete amavisd-new 2.6.1, la tarea se ha simplificado.</p>
<p>Voy a dar por sentado que tenemos un Postfix instalado y configurado para que use el Amavis para las funciones de anti-virus y anti-spam. Si no es así, te recomiendo que leas <a title="Configuración de un completo servidor de correo seguro con Postfix y Cyrus" href="http://linuxsilo.net/articles/postfix.html">el excelente artículo de Jaume Sabater</a>.</p>
<p>El primer problema lo tenemos si el mismo servidor está actuando como <abbr title="Mail eXchange">MX</abbr> y como servidor <abbr title="Simple Mail Transfer Protocol">SMTP</abbr> para nuestros usuarios: Amavis firmaría tanto los correos de nuestros usuarios como los que le llegan en su función de MX, y no es lo que queremos. Por tanto, lo primero es separar esas dos funciones (MX y submission) en el Postfix añadiendo las siguientes líneas en <code>/etc/postfix/master.cf</code> (seguramente ya haya algo parecido pero comentado)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="postfix" style="font-family:monospace;">submission inet n       -       n       -       -       smtpd
-o smtpd_enforce_tls=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o content_filter=smtp-amavis:[127.0.0.1]:10026</pre></td></tr></table></div>

<p>Con estas líneas estamos indicándole al Postfix que también escuche por el puerto de submission (587/tcp), que por ese puerto sólo acepte correo de conexiones autentificadas y cifradas por <abbr title="Transport Layer Security">TLS</abbr>, y que debe enviar los correos recibidos al Amavis usando el puerto 10026 (mientras que el resto se seguirá enviando por el puerto 10024). Con esto conseguiremos que Amavis distinga y trate de forma diferente los correos de los usuarios.</p>
<p>Lo siguiente es hacer que Amavis también escuche por el puerto 10026 y hacer que firme los correos que le lleguen por ese puerto. Lo haremos añadiendo al fichero <code>/etc/amavis/conf.d/50-user</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #0000ff;">$inet_socket_port</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">10024</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10026</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$interface_policy</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'10026'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'AUTH'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$policy_bank</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'AUTH'</span><span style="color: #009900;">&#125;</span>   <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>           <span style="color: #666666; font-style: italic;"># Authenticated clients</span>
os_fingerprint_method   <span style="color: #339933;">=&gt;</span> <span style="color: #000066;">undef</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;"># don't fingerprint authenticated clients</span>
bypass_spam_checks_maps <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>   <span style="color: #666666; font-style: italic;"># don't spam check authenticated clients</span>
originating <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># force MTA to convert mail to 7-bit before DKIM signing</span>
<span style="color: #666666; font-style: italic;"># to avoid later conversions which could destroy signature:</span>
smtpd_discard_ehlo_keywords <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'8BITMIME'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$enable_dkim_signing</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
dkim_key<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'llull.net'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'personal'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'/etc/dkim/llull.net.key.pem'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En la última línea le indicamos que para el dominio &#8216;<em>llull.net</em>&#8216; y el selector &#8216;<em>personal</em>&#8216; debe firmar los correos con la clave privada contenida en el fichero <code>/etc/dkim/llull.net.key.pem</code>. Para generar ese fichero ejecutaremos como <strong>root</strong> el comando</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">server:~# amavisd-new genrsa /etc/dkim/llull.net.key.pem
Private RSA key successfully written to file &quot;/etc/dkim/llull.net.key.pem&quot; (1024 bits, PEM format)</pre></div></div>

<p>Ya sólo falta obtener y configurar en nuestro servidor <abbr title="Domain Name System">DNS</abbr> la clave pública y para ello disponemos de otro comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">server:~# amavisd-new showkeys
personal._domainkey.llull.net.  3600 TXT (
&quot;v=DKIM1; p=&quot;
&quot;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoTaWXxsXpNi100Flp7fIKJSlZ&quot;
&quot;ptMP4aCCZjUFgT7TsWokWQJhnGUNnxexEqqPtCDbCUAvEg3iieMRrKwZoHAUDqCf&quot;
&quot;fvW9dcYR7+NdnaxAXCBpOh8Wg5GFJeIid9Gsx3ByBObBQnRGSMOxdBRBO4VXwGb2&quot;
&quot;hKAIOiBMPxaFghdDZQIDAQAB&quot;)</pre></div></div>

<p>Y ya sólo falta añadir la salida del anterior comando a la zona de nuestro dominio en el servidor DNS. La salida está en formato Bind por lo que si usamos ese servidor DNS no tendremos más que añadir  ese texto en el fichero correspondiente.</p>
<p>Acordaos de reiniciar el Postfix, Amavis y Bind para que apliquen las nuevas configuraciones. Para comprobar que todo está funcionando correctamente, podemos enviar un correo a <a title="DKIM Reflectors" href="http://testing.dkim.org/reflector.html">uno de los reflectores existentes</a>.</p>
<p>Ahora ya no tenéis escusa para que vuestro servidor de correo no firme los correos salientes. Si os surge alguna duda, usad los comentarios. Aunque creo que me he acordado de todo, han pasado algunos meses desde que lo configuré y es posible que haya pasado algo por alto.</p>
<p style="text-align: right"><em>Artículo basado en <a title="Setting up DKIM mail signing and verification" href="http://www.ijs.si/software/amavisd/amavisd-new-docs.html#dkim">la documentación oficial de Amavis</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/06/06/firmas-dkim-con-postfix-y-amavis/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>DomainKeys Identified Mail</title>
		<link>http://aleph.llull.net/2008/10/23/domainkeys-identified-mail/</link>
		<comments>http://aleph.llull.net/2008/10/23/domainkeys-identified-mail/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 15:39:54 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[firma digital]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=409</guid>
		<description><![CDATA[DomainKeys Identified Mail, o DKIM, es un sistema de autenticación que permite verificar que el correo realmente proviene de quien dice provenir. Como los spammers suelen falsificar los remitentes de los correos que mandan, también veremos como esa verificación nos puede servir como un método más para luchar contra el correo no deseado. DKIM recuerda [...]]]></description>
			<content:encoded><![CDATA[<p><em>DomainKeys Identified Mail</em>, o DKIM, es un sistema de autenticación que permite verificar que el correo realmente proviene de quien dice provenir. Como los spammers suelen falsificar los remitentes de los correos que mandan, también veremos como esa verificación nos puede servir como un método más para luchar contra el correo no deseado.</p>
<p>DKIM recuerda bastante al <em>Sender Policy Framework</em>, o <abbr title="Sender Policy Framework">SPF</abbr>, cuya finalidad es que <strong>los servidores puedan verificar que el servidor que les está entregando un correo está autorizado a hacerlo</strong>. Es decir, si el servidor mx.example.org está intentando entregar un correo con remitente user@example.com a mi servidor, este usará SPF para verificar si mx.example.org está autorizado a gestionar el correo de ese dominio. La idea es buena pero, por la forma en que se hace, tiene problemas cuando hay redirecciones o <em>forwards</em>. Para más información, podéis leer <a title="SPF: Introduction" href="http://www.openspf.org/Introduction">la introducción a SPF</a> del proyecto <a href="http://www.openspf.org/">OpenSPF</a> o <a title="SPF en la Wikipedia" href="http://es.wikipedia.org/wiki/Sender_Policy_Framework">el artículo de la Wikipedia</a> [<a title="SPF in Wikipedia" href="http://en.wikipedia.org/wiki/Sender_Policy_Framework">en inglés</a>].</p>
<p>Quería introducir un poco SPF para poder compararlo con DKIM ya que ambos tienen finalidades similares y usan el sistema de DNS para publicar la información necesaria. Pero así como SPF publica en DNS qué servidores pueden o no enviar correo de un dominio, DKIM publica una clave pública que se usará para verificar que el correo se originó desde un servidor legítimo, evitando el problema de los <em>forwards</em>. Pero nos estamos avanzando un poco&#8230;</p>
<h3>¿Cómo funciona?</h3>
<p>Simplificando bastante: <strong>a la hora de enviar, el remitente firma el mensaje y añade esa firma al correo. Entonces, cualquiera de los servidores por los que pasa el correo, puede comprobar su autenticidad verificando la firma</strong>. Aunque cualquiera de los servidores puede, la comprobación normalmente se realiza en el servidor destinatario.</p>
<p>Profundizando algo más, DKIM se basa en sistemas muy usados y conocidos como son la criptografía asimétrica, las funciones de hash y, como ya habíamos anticipado, DNS. Para entender mejor su funcionamiento, vemos la infraestructura que hay que configurar para que pueda funcionar:</p>
<ol>
<li>El administrador del dominio de correo debe generar un par de claves asímetricas.</li>
<li>Seguidamente, configurará la clave privada en sus servidores de correo, que la usaran para firmar los mensajes.</li>
<li>Finalmente, publica la clave pública como un registro TXT en la zona DNS de su dominio para que los servidores que quieran comprobar la autenticidad de los correos puedan obtenerla.</li>
</ol>
<p>Ahora ya podemos ver el proceso con más detalle: el servidor remitente calcula el hash del correo teniendo en cuenta el cuerpo y algunas cabeceras, y cifra ese hash con la clave privada generando la firma que se añade al correo. Cuando un servidor quiera verificarlo, como necesitará la clave pública para hacerlo, consultará al sistema DNS para obtenerla y poder realizar la comprobación. <strong>Si el correo se originara desde un servidor ilegítimo, como no tendría la clave privada adecuada, la comprobación de la firma fallaría poniendo en evidencia al servidor como posible spammer o phisher</strong>.</p>
<p>Como la comprobación no se basa en quién nos está entregando el mensaje sino en quién lo originó, este esquema no sufre de los problemas de SPF con los forwards. Sin embargo, al estar basado en firma digital, tiene problemas con las modificaciones que pueda sufrir el correo durante su transmisión. Por ejemplo, si se añade un disclaimer después de que se haya firmado, la verificación fallará.</p>
<p>Para más información sobre DKIM os remito <a title=" DomainKeys Identified Mail Homepage" href="http://www.dkim.org/">su web</a>, donde encontrareis multitud de documentación, y, como nó, a la <a title="DomainKeys Identified Mail in Wikipedia" href="http://en.wikipedia.org/wiki/DomainKeys_Identified_Mail">Wikipedia</a>.</p>
<p>Como referencias, decir que tanto <a href="http://www.yahoo.com/">Yahoo!</a> como <a href="http://www.gmail.com/">Gmail</a> son dos grandes ejemplos de ISPs que usan DKIM en sus servidores.</p>
<h3>DKIM en SpamAssassin</h3>
<p>Finalmente, veamos como podemos configurar <em>SpamAssassin</em> para sacar provecho de este sistema. Estoy dando por supuesto que usamos Debian Etch y que ya tenéis el MTA (<em>Postfix</em> o similar) y el <em>SpamAssassin</em> instalados y configurados. <strong>Sólo mostraré la configuración a realizar para que se empiecen a comprobar las firmas de DKIM</strong>. Desgraciadamente, la versión que viene con Etch no es del todo adecuada por lo que deberemos añadir <a title="Debian backports instructions" href="http://www.backports.org/dokuwiki/doku.php?id=instructions">el repositorio de backports a nuestro <code>source.list</code></a>. Una vez añadido, actualizaremos la lista de paquetes e instalaremos <code>libmail-dkim-perl</code>, con todas sus dependencias, desde backports:</p>
<pre>  server:~# aptitude update
  server:~# aptitude -t etch-backports install libmail-dkim-perl</pre>
<p>Ahora sólo falta habilitar el plugin <code>Mail::SpamAssassin::Plugin::DKIM</code> descomentando la correspondiente línea en el fichero <code>/etc/spamassassin/v312.pre</code>. Recordad reiniciar <em>spamd</em>, <em>amavisd-new</em> o el <em>content-filter</em> que uséis para que se aplique la nueva configuración.</p>
<p>Como ejemplo, veamos las cabeceras de un correo enviado desde gmail:</p>
<pre>X-Spam-Status: No, score=-0.124 required=4.5 tests=[AWL=-0.185,
	BAYES_20=-0.74, <strong>DKIM_SIGNED=0.001</strong>, <strong>DKIM_VERIFIED=-0.001</strong>,
	DNS_FROM_SECURITYSAGE=0.001, HTML_MESSAGE=0.001, P0F_Unknown=0.8,
	SPF_PASS=-0.001]
...
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=gamma;
        h=domainkey-signature:received:received:message-id:date:from:to
         :subject:mime-version:content-type;
        bh=JvMz4j1uNftb2YwcCYFAjZF73T5HtaC0paeyk3KqFao=;
        b=s2/id2fqmQMef9gWIvn6jhs09lz9nnyOrwepQtQQdzd6Bj8iB/7b2G3PN+bLcOW0k1
         kTs7ew+y8P1rROBlA+T8CpsYirWL0gSp6YZidyhN2SHJVg9ZXQ7oWq6czAcqs/y3871n
         l4Wnm53EqPPNn4Tqos6ruDghAfyJ/deBxFY3Q=
DomainKey-Signature: a=rsa-sha1; c=nofws;
        d=gmail.com; s=gamma;
        h=message-id:date:from:to:subject:mime-version:content-type;
        b=U6s9wCp2Q5U7DC0WcQGJ6S6hNwTNmPUiklMd0RtMgB+pJzvP8T/NaqT43Q4QyaukPz
         ig4b3S0/QF3B6uOctVvYQE9YAlgbilx+QxthVzhtc9xvyfePgF63RoebvK28hNlL5VUn
         +0cdEBbEOqkPzo1d1j5XaDGDUV6W/0xHRZb2o=
Received: by 10.210.65.2 with SMTP id n2mr4808273eba.65.1224441206376;
        Sun, 19 Oct 2008 11:33:26 -0700 (PDT)
Received: by 10.210.113.2 with HTTP; Sun, 19 Oct 2008 11:33:26 -0700 (PDT)
Message-ID: &lt;57e22bd310j416695a2d215d0810191133h6297c2b8a@mail.gmail.com&gt;
Date: Sun, 19 Oct 2008 20:33:26 +0200
From: "Gmail user" &lt;user@gmail.com&gt;
To: user@example.com
Subject: DKIM test
MIME-Version: 1.0
Content-Type: multipart/alternative;</pre>
<p>Como podéis ver, con la puntuación que le dá SpamAssassin por defecto no mejoramos la discriminación de spam: +0.001 por venir firmado que se compensa con -0.001 porque la firma es correcta. En la lista de correo de spamassassin-users podemos encontrar <a href="http://www.nabble.com/DKIM---DomainKeys-td8915077.html#a8915811">algunas sugerencias</a> (y <a href="http://www.nabble.com/PayPal-DomainKeys-DKIM-whitelisting---update-td11181187.html">sus actualizaciones</a>).</p>
<h3>Conclusiones</h3>
<p><em>DomainKeys Identified Mail</em> es otro sistema pensado para verificar el origen del correo que, como el resto de alternativas, tiene sus ventajas e inconvenientes. Y hemos dado unas pinceladas sobre como se puede usar para ayudar a nuestro sistema anti-spam. En un futuro post, explicaré como configurar nuestro Postfix y Bind para que nuestro correo use DKIM.</p>
<p>Yo, personalmente, pienso que más que intentar parchear el protocolo <abbr title="Simple Mail Transfer Protocol">SMTP</abbr>, debería tomarse la decisión de <strong>hacer &#8220;borron y cuenta nueva&#8221; y diseñar un nuevo protocolo de transmisión de correo</strong> teniendo en cuenta todo lo aprendido hasta ahora y especialmente pensado para no permitir el spam.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/23/domainkeys-identified-mail/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Protegiendo el correo con Fail2Ban</title>
		<link>http://aleph.llull.net/2008/10/21/protegiendo-el-correo-con-fail2ban/</link>
		<comments>http://aleph.llull.net/2008/10/21/protegiendo-el-correo-con-fail2ban/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 15:28:38 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[cyrus]]></category>
		<category><![CDATA[fail2ban]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=353</guid>
		<description><![CDATA[Recientemente expliqué como Fail2Ban podía ayudarnos a ponérselo más difícil a esos script-kidies que se dedican a intentar entrar por SSH en nuestras máquinas realizando ataques de fuerza bruta.Hoy vamos a ver como usar esa misma herramienta para proteger de esos ataques a los servicios de correo. La configuración que voy a explicar supone que [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Fail2Ban" href="http://aleph.llull.net/2008/10/11/fail2ban">Recientemente</a> expliqué como Fail2Ban podía ayudarnos a ponérselo más difícil a esos script-kidies que se dedican a intentar entrar por SSH en nuestras máquinas realizando ataques de fuerza bruta.Hoy vamos a ver como usar esa misma herramienta para <strong>proteger de esos ataques a los servicios de correo</strong>. La configuración que voy a explicar supone que estamos usando Postfix como MTA, Cyrus como servidor POP3 e IMAP y SASL para autenticar a los usuarios.</p>
<h3>Servidor SMTP</h3>
<p>Como ya he comentado, lo que queremos es proteger el MTA de ataques de fuerza bruta: si alguien consiguiera averiguar unas credenciales correctas podría usar nuestro servidor para hacer relay. Dentro del paquete de fail2ban en Debian tenemos casí toda la configuración que nos hace falta. De hecho, se define el filtro <em>sasl</em>, pero la expresión regular no es del todo correcta. Para solucionarlo, crearemos el fichero <code>/etc/fail2ban/filter.d/sasl.local</code> (tal y como se recomienda en <code>/usr/share/doc/fail2ban/README.Debian.gz&lt;(code&gt;) con el siguiente contenido.</code></p>
<pre>[Definition]
failregex = : warning: .*+\[&lt;HOST&gt;\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed</pre>
<p>Es la misma línea que en <code>sasl.conf</code> pero con ligeras modificaciones, como la eliminación de la marca de final de línea ($) en la expresión regular.</p>
<p>Activaremos la regla <em>sasl</em> modificando/creando el fichero <code>/etc/fail2ban/jail.local</code>:</p>
<pre>[sasl]
enabled  = true</pre>
<p>Para que se aplique la nueva regla, debemos recargar la configuración:</p>
<pre> server:~# fail2ban-client reload
 <em>&lt;pueden salir unos warnings&gt;</em>

 server:~# fail2ban-client status
 Status
 |- Number of jail:      2
 `- Jail list:           <strong>sasl</strong>, ssh</pre>
<p>Si alguno de los comandos da un error de &#8220;<em>Could not find server</em>&#8220;, es que el servidor de fail2ban no está arrancado.</p>
<h3>Servidores POP3 e IMAP</h3>
<p>Por coherencia, si protegemos el servidor SMTP debemos hacer lo propio con los servidores de POP3 e IMAP. Si no, como los tres servicios comparten la base de datos de usuarios, podrían usar uno de los servicios desprotegidos para averiguar la contraseña por fuerza bruta. Como los mensajes de error de autenticación no indican el servicio que ha usado el usuario para conectarse, vamos a tratar los servidores POP3 e IMAP en conjunto. Esto es, al detectarse errores de autanticación se bloquearan todos los servicios.</p>
<p>Para realizar esta configuración, empezaremos creando el filtro en <code>/etc/fail2ban/filter.d/cyrus.local</code> con el siguiente contenido:</p>
<pre>[Definition]
failregex = : badlogin: .*\[&lt;HOST&gt;\] (?:plaintext|LOGIN|(?:CRAM|DIGEST)-MD5|NTLM) .*SASL\(-13\): authentication failure
ignoreregex =</pre>
<p>Y acabamos añadiendo las reglas necesarias al final del fichero <code>/etc/fail2ban/jail.local</code>:</p>
<pre>[pop3]
enabled  = true
port     = pop3
filter   = cyrus
logpath  = /var/log/mail.log

[pop3s]
enabled  = true
port     = pop3s
filter   = cyrus
logpath  = /var/log/mail.log

[imap2]
enabled  = true
port     = imap2
filter   = cyrus
logpath  = /var/log/mail.log

[imaps]
enabled  = true
port     = imaps
filter   = cyrus
logpath  = /var/log/mail.log</pre>
<p>Debemos definir una regla por puerto porque la versión 0.7.5 de fail2ban (la que tenemos en Etch) no soporta que se indique más de un puerto por regla. Versiones más recientes, como la versión 0.8, <a title="Manual Fail2Ban 0.8" href="http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Jails">parece que si lo soportan</a> (Si alguien lo comprueba, que me lo comente.  Gracias).</p>
<p>Como siempre, recargad la configuración y comprobad que se estén usando las reglas recién definidas.</p>
<h3>Conclusiones</h3>
<p>Fail2Ban es una gran medida disuasoria y con estas configuraciones conseguimos frenar en gran medida los ataques de fuerza bruta contra los servicios autenticados de correo: con la configuración por defecto, el servidor no aceptará conexiones de ese cliente durante diez minutos tras tres intentos fallidos.</p>
<p>Aunque la seguridad es necesaria, suele ser incómoda. Pensad en el usuario que intenta configurar su Outlook Expres en casa pero se le ha olvidado la contraseña (como si la hubiera recordado durante más de diez segundos&#8230; cuanto daño ha hecho la opción &#8220;Recordar contraseña&#8221;&#8230;) y tras varios intentos os llama. Como el servidor le ha bloqueado el acceso por un tiempo, aunque le podáis dar la contraseña correcta, deberá esperar. Dependiendo de como sean vuestros usuarios, es posible que debáis jugar un poco con los parámetros <code>bantime</code> y <code>maxretry</code>.</p>
<p>Como véis, no resulta muy complicado dotar de algo más de seguridad a nuestros servidores si conocemos las herramientas adecuadas y como usarlas.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/21/protegiendo-el-correo-con-fail2ban/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O.S. fingerprinting como medida antispam</title>
		<link>http://aleph.llull.net/2008/10/03/os-fingerprinting-como-medida-antispam/</link>
		<comments>http://aleph.llull.net/2008/10/03/os-fingerprinting-como-medida-antispam/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 16:24:25 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[p0f]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=185</guid>
		<description><![CDATA[Hay ocasiones en que el tema del spam me recuerda a una escalada armamentística, en la que las dos partes de un conflicto van evolucionando sus medios y técnicas para obtener ventaja sobre el otro. Un ejemplo de esta escalada en el campo del spam son los filtros bayesianos: hace ya un tiempo los sistemas [...]]]></description>
			<content:encoded><![CDATA[<p>Hay ocasiones en que el tema del <a title="Spam en la Wikipedia" href="http://es.wikipedia.org/wiki/Spam">spam</a> me recuerda a una escalada armamentística, en la que las dos partes de un conflicto van evolucionando sus medios y técnicas para obtener ventaja sobre el otro. Un ejemplo de esta escalada en el campo del spam son los filtros bayesianos: hace ya un tiempo los sistemas antispam implementaron <a href="http://www.genciencia.com/2006/09/17-spam-como-funcionan-los-filtros-bayesianos">filtros bayesianos</a> [<a title="Bayesian spam filtering" href="http://en.wikipedia.org/wiki/Bayesian_spam_filtering">Wikipedia</a>], que básicamente son unos algoritmos que son capaces de &#8220;leer&#8221; los correos y puntuar cuan probable es que ese correo sea spam. Algunos spammers reaccionaron enviando los correos con una imagen en la que incluían el texto de manera que los filtros bayesianos no pudieran leerlo. Para combatir esta técnica, los sistemas antispam implementaron sistemas de reconocimiento de carácteres (<abbr title="Optical Character Recognition,">OCR</abbr>) para poder &#8220;leer&#8221; el texto contenido en las imágenes, a lo que los spammers reaccionaron modificando el fondo de las imágenes para hacer más difícil el reconocimiento. Etc.</p>
<p>En este post os voy a explicar una técnica para luchar contra el spam que he descubierto recientemente y como configurarlo.</p>
<h3>Introducción</h3>
<p>Esta técnica antispam sólo es útil si se implementa a nivel de servidor de correo, y se fundamenta en dos pilares:</p>
<ol>
<li>Como se puede suponer del título del post, uno de los pilares es <strong>la detección de la versión del sistema operativo</strong> del servidor remoto que está intentando entregar un correo a una de las direcciones que alojamos.</li>
<li>El otro pilar es el hecho de que nadie en su sano juicio instalaría un servidor de correo sobre un Windows XP, ya que está destinado a estaciones de trabajo y no a servidores. Pero incluso así, <strong>la gran mayoría de spam proviene de Windows XP</strong>, que seguramente tendrán instalado un virus que los convierte en relayers.</li>
</ol>
<p>Es decir, si somos capaces de determinar que correos entrantes nos los está enviando un Windows XP, lo podremos usar para diferenciar mejor el correo legítimo del spam.</p>
<p><span id="more-185"></span></p>
<h3>Descripción técnica</h3>
<p>El núcleo de esta técnica lo forman amavis, spamassassin y <a title="P0f homepage" href="http://lcamtuf.coredump.cx/p0f.shtml">p0f</a>. Seguramente el único que no os debe sonar es p0f y me imagino que la mayoría ya conoceréis el amavis, sistema de filtrado de correo, y el spamassassin, el sistema antispam por excelencia. <strong>p0f es un sistema de O.S. fingerprining pasivo</strong>. Básicamente es un sniffer que es capaz de identificar la versión del sistema operativo a partir de los paquetes TCP/IP que vé. Es decir, es similar a la opción -O del <a title="nmap homepage" href="http://nmap.org/">nmap</a>, pero de forma pasiva.</p>
<p>La idéa es que cuando amavis vaya a filtrar un nuevo correo entrante, consulte de alguna manera al p0f para saber la versión del sistema operativo de la máquina remota y el spamassassin pueda tener en cuenta esa información para determinar si el correo es spam o no.</p>
<h3>Instalación y configuración</h3>
<p>Los prerequisitos son tener un servidor de correo que use amavisd-new y spamassassin. No voy a explicar como se instalan y configuran ya que depende del MTA que uséis y existen muchos how-tos (como <a title="Configuración de un completo servidor de correo seguro con Postfix y Cyrus" href="http://linuxsilo.net/articles/postfix.html">este</a> de Jaume Sabater [<a title="Bulma: Configuración de un completo servidor de correo seguro con Postfix y Cyrus" href="http://www.bulma.net/body.phtml?nIdNoticia=2163">copia en Bulma</a>]). En cuanto a la distribución, me centraré en una Debian que es lo que tengo por mano.</p>
<h4>Instalación de P0F</h4>
<p>Lo primero es instalar el p0f: <code>aptitude install p0f</code> (o <code>apt-get install p0f</code>, me da igual <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  )</p>
<p>Para la comunicación entre p0f y amavis, usaremos un programilla en perl que viene dentro del paquete de amavisd-new: p0f-analyzer (que se instala en <code>/usr/sbin</code>). Este programa espera recibir los datos del p0f por su entrada estandar y abre un puerto por el que el amavis le hace las consultas. Por defecto, p0f-analyzer escucha en todas las interfaces del servidor aunque implementa unas ACLs muy simples por las que sólo contesta a peticiones que le lleguen del localhost (127.0.0.1). Como a mi no me gusta tener servicios internos escuchando en todas las interfaces, cambie la línea 79 de<code><br />
</code></p>
<pre>  bind(S, sockaddr_in($port,INADDR_ANY)) or die "bind: $!";</pre>
<p>a</p>
<pre>  bind(S, sockaddr_in($port,INADDR_LOOPBACK)) or die "bind: $!";</pre>
<p>Las ACLs se controlan mediante el array <code>@inet_acl</code> que se define en la línea 70.</p>
<p>Si ejecutas /usr/sbin/p0f-analyzer sin parámetros, te da un ejemplo de uso que es el que yo utilicé:</p>
<pre>  /usr/sbin/p0f -l 'tcp dst port 25' 2&gt;&amp;1 | /usr/sbin/p0f-analyzer.pl 2345</pre>
<p>De esta manera, <strong>el p0f identificará las conexiones destinadas al puerto 25/tcp y el p0f-analyzer abre el puerto 2345 para recibir las consultas del amavis</strong>. Primera parte resuelta.</p>
<h4>Configuración de amavis</h4>
<p>El siguiente paso es configurar el amavis para que consulte al p0f-analyzer. Para ello debemos usar el parámetro de configuración $os_fingerprint_method. En el caso de Debian, modifiqué el fichero <code>/etc/amavis/conf.d/50-user</code> e incluí las dos líneas siguientes:</p>
<pre>  $os_fingerprint_method = 'p0f:127.0.0.1:2345';
  $policy_bank{'MYNETS'}{os_fingerprint_method} = undef;</pre>
<p>En la primera línea <strong>le indicamos donde puede consultar al p0f-analyzer</strong> y en la segunda que no use el p0f-analyzer para las máquinas de la red interna.</p>
<p>Finalmente reiniciamos el amavisd-new. Si hemos realizado los cambios en la configuración de forma correcta, en <code>/var/log/mail.log</code> deberíamos encontrar la línea que nos indica que ha activado la opción de OS_Fingerprinting:</p>
<pre>  Oct  3 12:23:14 server amavis[29216]: OS_Fingerprint code  loaded</pre>
<p>Ahora ya sólo falta que el spamassassin use la información que nos proporciona p0f.</p>
<h4>Configuración de spamassassin</h4>
<p>La forma que tiene el amavis para pasar la información que ha recibido del p0f al spamassassin es añadiendo la cabecera X-Amavis-OS-Fingerprint al correo. Esta cabecera no se añade al correo que recibirá el usuario, sólo se usa internamente entre el amavis y el spamassassin.</p>
<p>Como a mi me interesaba que todos los usuarios se beneficiaran de esta nueva técnica, modifiqué el fichero <code>/etc/spamassassin/local.cf</code> para que incluyera la siguiente configuración:</p>
<pre>  #   Set score for different client OS
  #   Needs p0f-analyzer up and running
  header P0F_WindowsXP X-Amavis-OS-Fingerprint =~ /^Windows XP/
  header P0F_Windows   X-Amavis-OS-Fingerprint =~ /^Windows(?! XP)/
  header P0F_Unknown   X-Amavis-OS-Fingerprint =~ /^UNKNOWN/
  header P0F_Unix      X-Amavis-OS-Fingerprint =~ /^Linux|((Free|Open|Net)BSD)|Solaris|HP-UX|Tru64/

  score  P0F_WindowsXP 3.5
  score  P0F_Windows   1.7
  score  P0F_Unknown   0.8
  score  P0F_Unix     -0.5</pre>
<p>Definimos cinco tests y les damos puntuaciones. Las puntuaciones de los tests no son aleatorias, me basé en las que se indican <a title="Lista de correo spamassassin-users" href="http://mail-archives.apache.org/mod_mbox/spamassassin-users/200604.mbox/&lt;200604121239.22708.Mark.Martinec+sa@ijs.si&gt;">aquí</a> pero las modifiqué un poco a mi gusto. Con estas puntuaciones le estamos indicando al spamassassin que es muy probable que los correos que le lleguen desde máquinas Windows XP sean spam, ya que le damos una puntuación de 3.5, mientras que los que le lleguen desde Unixes tienen una menor probabilidad de serlo y por eso le damos una puntuación de -0.5.</p>
<p>Para que se empiecen a aplicar los nuevos tests, si estamos ejecutando el spamassassin en modo daemon (spamd) deberemos reiniciarlo y si se ejecuta de forma interna al amavis, deberemos reiniciar este último.</p>
<p>A partir de ahora, <strong>el spamassassin debería tener en cuenta el sistema operativo de la maquina remota para puntuar los correos</strong>. Si tenéis configurado el amavis para que incluya en las cabeceras los tests del spamassassin, podéis buscarlo allí. Por ejemplo:</p>
<pre>X-Spam-Status: Yes, score=9.25 required=4.5 tests=[BAYES_99=3.5,
    HTML_MESSAGE=0.001, <strong>P0F_Unix=-0.5</strong>, RCVD_IN_BL_SPAMCOP_NET=1.96,
    URIBL_AB_SURBL=1.86, URIBL_BLACK=1.955, URIBL_SC_SURBL=0.474]</pre>
<h4>Conclusión</h4>
<p>La técnica de O.S. fingerprinting no es la panacea en la lucha contra el spam, pero es un complemento al resto de tests, un aspecto más que nuestro sistema antispam puede tener en cuenta para clasificar mejor los mensajes. Y por el trabajo que lleva configurarlo, creo que merece la pena.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/03/os-fingerprinting-como-medida-antispam/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

