<?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; amavis</title>
	<atom:link href="http://aleph.llull.net/tag/amavis/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>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>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>

