<?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; SysAdmin</title>
	<atom:link href="http://aleph.llull.net/category/informatica/sysadmin/feed/" rel="self" type="application/rss+xml" />
	<link>http://aleph.llull.net</link>
	<description></description>
	<lastBuildDate>Wed, 08 Sep 2010 16:54:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Actualización automática de los plugins de WordPress por SSH</title>
		<link>http://aleph.llull.net/2009/07/11/actualizacion-automatica-de-los-plugins-de-wordpress-por-ssh/</link>
		<comments>http://aleph.llull.net/2009/07/11/actualizacion-automatica-de-los-plugins-de-wordpress-por-ssh/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 15:09:37 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=823</guid>
		<description><![CDATA[Las versiones recientes de WordPress te permiten actualizar los plugins instalados con un simple click. Aunque interesante, nunca había usado esa funcionalidad porque requería tener instalado y configurado un servidor FTP o FTPS. Y, la verdad, me daba mucha pereza tener que mantener un servicio sólo para esto. Pero hoy, tras actualizar a la versión [...]]]></description>
			<content:encoded><![CDATA[<p>Las versiones recientes de <a href="http://wordpress.org/">WordPress</a> te permiten actualizar los <em>plugins</em> instalados con un simple <em>click</em>. Aunque interesante, nunca había usado esa funcionalidad porque requería tener instalado y configurado un servidor <acronym title="File Transfer Protocol">FTP</acronym> o <acronym title="File Transfer Protocol over SSL">FTPS</acronym>. Y, la verdad, me daba mucha pereza tener que mantener un servicio sólo para esto.</p>
<p>Pero hoy, tras actualizar a la <a href="http://wordpress.org/development/2009/07/wordpress-2-8-1/">versión 2.8.1</a>, por casualidad he lanzado un <em>grep</em> en un directorio que no tocaba y he descubierto el fichero <code>wp-admin/includes/class-wp-filesystem-ssh2.php</code>. Resulta que WordPress también puede usar <acronym title="Secure SHell">SSH</acronym> para realizar esas actualizaciones. Normalmente esa opción no aparece por que no disponemos de todo el software necesario para que funcione, pero es bastante sencillo conseguirlo. Veamos como hacerlo en una <a href="http://www.debian.org/">Debian</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libssh2-<span style="color: #000000;">1</span> libssh2-<span style="color: #000000;">1</span>-dev php5-dev
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pecl <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">-f</span> ssh2
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php5<span style="color: #000000; font-weight: bold;">/</span>conf.d<span style="color: #000000; font-weight: bold;">/</span>ssh2.ini
    <span style="color: #007800;">extension</span>=ssh2.so
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 restart</pre></div></div>

<p>Una vez tenemos instalada la extensión <strong>ssh2.so</strong> de <a href="http://www.php.net/">PHP</a>, podemos desinstalar los paquetes de desarrollo que instalamos en el primer paso.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> remove libssh2-<span style="color: #000000;">1</span> libssh2-<span style="color: #000000;">1</span>-dev php5-dev</pre></div></div>

<p>Listo, ya podemos actualizar los <em>plugins</em> desde la comodidad de nuestro navegador sin necesidad de tener un servidor FTP o FTPS. Seguramente también se puede usar para actualizar el propio WordPress, aunque no lo puedo confirmar ya que yo lo <a title="`Como usar subversion para actualizar versiones` por Perroverd" href="http://mitago.net/archives/2009/05/19/T19_32_33/index.html">actualizo usando subversión</a>.</p>
<p>Como se puede ver es bastante sencillo. De todas formas, os dejo un screencast que he hecho sobre la instalación (inaugurando mi cuenta de YouTube).</p>
<p style="text-align: center;"><span class="youtube">
<object type="application/x-shockwave-flash" width="480" height="360" data="http://www.youtube.com/v/v6IyBoLznRo&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=0&amp;hd=1">
<param name="movie" value="http://www.youtube.com/v/v6IyBoLznRo&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=0&amp;hd=1" />
<param name="allowFullScreen" value="true" />
<param name="wmode" value="transparent" />
</object>
</span><p><a href="http://www.youtube.com/watch?v=v6IyBoLznRo&fmt=18"><img src="http://img.youtube.com/vi/v6IyBoLznRo/default.jpg" width="130" height="97" border=0></a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/07/11/actualizacion-automatica-de-los-plugins-de-wordpress-por-ssh/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;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</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;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</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;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</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;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</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>SSL en subdominios con una única dirección IP</title>
		<link>http://aleph.llull.net/2008/10/27/ssl-en-subdominios-con-una-unica-direccion-ip/</link>
		<comments>http://aleph.llull.net/2008/10/27/ssl-en-subdominios-con-una-unica-direccion-ip/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 08:03:05 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=309</guid>
		<description><![CDATA[La aparición a mediados de 1998 de los VirtualHosts basados en nombre en la versión 1.3 del servidor web de Apache significó un cambio importante en el mundo de los servidores web ya que permitía configurar webs en diferentes dominios, todos ellos compartiendo la misma dirección IP. Tampoco hay que olvidar que esa mejora fue [...]]]></description>
			<content:encoded><![CDATA[<p>La aparición a mediados de 1998 de los VirtualHosts basados en nombre en la <a href="http://httpd.apache.org/docs/1.3/">versión 1.3 del servidor web de Apache</a> significó un cambio importante en el mundo de los servidores web ya que permitía configurar webs en diferentes dominios, todos ellos compartiendo la misma dirección <abbr title="Internet Protocol">IP</abbr>. Tampoco hay que olvidar que esa mejora fue posible gracias a que los navegadores (por aquel entonces disponíamos de <a href="http://en.wikipedia.org/wiki/Netscape_Communicator">Netscape Communicator 4.5</a> e <a href="http://en.wikipedia.org/wiki/Internet_Explorer_4">Internet Explorer 4.0</a> [<a href="#nota-1">1</a>]) implementaron la versión 1.1 del protocolo <abbr title="HyperText Transfer Protocol">HTTP</abbr>, según la cual el navegador debe enviar el nombre del dominio al que se están conectando en la cabecera <em>Host</em>, usada por los servidores web para discriminar que a VirtualHost deben enviar la petición.</p>
<p>Desgraciadamente, las webs seguras nunca han podido beneficiarse de esta mejora por la forma en que funciona el protocolo HTTPS (HTTP sobre <abbr title="Secure Sockets Layer">SSL</abbr>). La cabecera Host que permite al servidor discernir el host virtual al que va dirigida la petición del usuario está a nivel HTTP, debajo del cual tenemos SSL y su negociación. En esa negociación es cuando el servidor envía al cliente su certificado X.509 y el navegador comprueba la validez del certificado comparando el campo <abbr title="Common Name">CN</abbr> del certificado con el nombre del dominio al que se está conectando. <strong>Por tanto, el servidor debe enviar el certificado correcto, y por tanto del host virtual correcto, al navegador antes que este le pueda indicar mediante la cabecera Host el dominio al que se quiere conectar</strong>. La única solución es usar VirtualHosts basados en dirección IP.</p>
<p>Sin embargo, si los diferentes dominios que tenemos en el servidor son subdominios que comparten el <a href="http://en.wikipedia.org/wiki/Second-level_domain">second-level domain</a>, o SLD, podemos conseguir que todos ellos dispongan de web segura usando una única dirección IP. Por ejemplo www.example.com y mail.example.com tienen el SLD example.com en común.</p>
<p>Para conseguirlo, también es imprescindible el uso de un <em>Wildcard SSL Certificate</em> (he decidido no traducirlo porque ninguna de las tradicciones que se me han ocurrido me acababa de gustar), que es un certificado SSL en el que el nombre del dominio contiene un comodín. Por ejemplo: *.example.com. De esta manera, indicamos al navegador que este certificado es válido para cualquier subdominio de example.com. No voy a explicar como se generan los certificados SSL ya que <a title="Busqueda 'SSL certificates Howto' en Google" href="http://www.google.com/search?q=ssl+certificates+howto">buscando un poco por google</a> se encuentran multitud de páginas al respecto. Si le vamos a dar un uso personal, podéis crear un <em>self signed certificate</em>. La única diferencia con los tutoriales que podáis encontrar es que como dominio introduciremos &#8220;*.&lt;dominio&gt;&#8221; (Por ejemplo: *.example.com).</p>
<h3>Configuración del servidor web de Apache</h3>
<p>Voy a suponer que en nuestro servidor tenemos configurado un servidor web Apache2 con varios host virtuales (www.example.com, mail.example.com y un servidor WebDAV para el Subversion en svn.example.com), y que el servidor sólo dispone de una dirección IP.</p>
<p>Lo primero que hay que hacer es poner el servidor web a escuchar en el puerto 443 (puerto estándar de HTTPS) y configurar un host virtual sobre ese puerto:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Listen</span> <span style="color: #ff0000;">443</span>
&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">443</span>&gt;
  <span style="color: #00007f;">ServerName</span> *.<span style="color: #00007f;">example</span>.com
  <span style="color: #00007f;">ErrorLog</span> /var/log/apache2/https-error.log
&nbsp;
  <span style="color: #adadad; font-style: italic;"># Possible values include: debug, info, notice, warn, error, crit,</span>
  <span style="color: #adadad; font-style: italic;"># alert, emerg.</span>
  <span style="color: #00007f;">LogLevel</span> warn
&nbsp;
  <span style="color: #00007f;">CustomLog</span> /var/log/apache2/https-access.log combined
  <span style="color: #00007f;">ServerSignature</span> <span style="color: #0000ff;">Off</span>
&nbsp;
  SSLEngine <span style="color: #0000ff;">On</span>
  SSLCertificateFile /path/to/certs/<span style="color: #00007f;">example</span>.com.pem
  SSLCertificateKeyFile /path/to/private-keys/<span style="color: #00007f;">example</span>.com.key
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;</pre></div></div>

<p>Con esto ya tenemos la capa SSL configurada. El certificado indicado en el parámetro <code>SSLCertificateFile</code> es el <em>Widlcard SSL Certificate</em> que hemos creado anteriormente. A partir de aquí, <strong>el &#8220;truco&#8221; está en el uso creativo del mod_proxy</strong>, que conseguiremos añadiendo la siguiente configuración dentro del hosts virtual que acabamos de crear:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">  &lt;<span style="color: #000000; font-weight:bold;">Proxy</span> *&gt;
    <span style="color: #00007f;">Order</span> <span style="color: #00007f;">deny</span>,<span style="color: #00007f;">allow</span>
    <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">all</span>
  &lt;/<span style="color: #000000; font-weight:bold;">Proxy</span>&gt;
&nbsp;
  <span style="color: #adadad; font-style: italic;"># Proxy requests to ourselves preserving the Host header</span>
  <span style="color: #00007f;">ProxyPass</span> / http://localhost/
  <span style="color: #00007f;">ProxyPassReverse</span> / http://localhost/
  ProxyPreserveHost <span style="color: #0000ff;">on</span></pre></div></div>

<p>Con esta configuración estamos reenviando todas las peticiones que nos lleguen a este host virtual por HTTPS hacia el propio servidor, pero cambiando el protocolo de HTTPS a HTTP. <strong>Es importante destacar la última línea, que le indica al servidor web que debe mantener la cabecera Host al hacerse la petición a sí mismo</strong>, gracias a la cual no tendrá ningún problema a la hora de determinar que página quiere ver el usuario.</p>
<p>Para que las aplicaciones web puedan distinguir si la petición que les llega a entrado por HTTP o HTTPS, configuraremos el host virtual para que añada la cabecera <code>X_FORWARDED_PROTO</code> a las peticiones que se hace a sí mismo:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">  <span style="color: #adadad; font-style: italic;"># Add the X_FORWARDED_PROTO=https to allow applications to identify</span>
  <span style="color: #adadad; font-style: italic;"># proxyed https connections</span>
  RequestHeader set X_FORWARDED_PROTO https</pre></div></div>

<p>Ya sólo queda un detalle, necesario únicamente si vamos a usar esta configuración para proteger un WebDAV. El problema de esta configuración con WebDAV viene a la hora de intentar hacer un &#8216;<code>svn mv</code>&#8216;, por ejemplo. Este comando indica el destino en la cabecera HTTP <code>Destination</code>. Como el cliente se esta conectando a https://svn.example.com/repo/etc, la cabecera tendrá ese valor. Pero el host virtual que tiene la configuración de WebDAV sólo está configurado para HTTP por lo que espera que la cabecera <code>Destination</code> empiece por http://svn&#8230; <strong>Para solucionar la inconsistencia entre la cabecera esperada y la recibida echaremos mano del mod_rewrite</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">  <span style="color: #adadad; font-style: italic;"># Workarrounf for WebDAV Destination header</span>
  <span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
  <span style="color: #00007f;">RewriteCond</span> %{HTTP:Destination} ^https://(.*)$
  <span style="color: #00007f;">RewriteRule</span> . - [env=DESTINATION:http://%1,PT]
  RequestHeader set Destination %{DESTINATION}e env=DESTINATION</pre></div></div>

<h3>Resumen de la configuración</h3>
<p>Una vez explicadas las diferentes partes de la configuración, os pongo toda la configuración tal cual se debe escribir en los ficheros de configuración del servidor web para que no haya problemas de &#8220;¿y esto donde va?, ¿dentro o fuera del virtualhost?&#8221; <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  :</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Listen</span> <span style="color: #ff0000;">443</span>
&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">443</span>&gt;
  <span style="color: #00007f;">ServerName</span> *.<span style="color: #00007f;">example</span>.com
  <span style="color: #00007f;">ErrorLog</span> /var/log/apache2/https-error.log
&nbsp;
  <span style="color: #adadad; font-style: italic;"># Possible values include: debug, info, notice, warn, error, crit,</span>
  <span style="color: #adadad; font-style: italic;"># alert, emerg.</span>
  <span style="color: #00007f;">LogLevel</span> warn
&nbsp;
  <span style="color: #00007f;">CustomLog</span> /var/log/apache2/https-access.log combined
  <span style="color: #00007f;">ServerSignature</span> <span style="color: #0000ff;">Off</span>
&nbsp;
  SSLEngine <span style="color: #0000ff;">On</span>
  SSLCertificateFile /path/to/certs/<span style="color: #00007f;">example</span>.com.pem
  SSLCertificateKeyFile /path/to/private-keys/<span style="color: #00007f;">example</span>.com.key
&nbsp;
  &lt;<span style="color: #000000; font-weight:bold;">Proxy</span> *&gt;
    <span style="color: #00007f;">Order</span> <span style="color: #00007f;">deny</span>,<span style="color: #00007f;">allow</span>
    <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">all</span>
  &lt;/<span style="color: #000000; font-weight:bold;">Proxy</span>&gt;
&nbsp;
  <span style="color: #adadad; font-style: italic;"># Workarrounf for WebDAV Destination header</span>
  <span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
  <span style="color: #00007f;">RewriteCond</span> %{HTTP:Destination} ^https://(.*)$
  <span style="color: #00007f;">RewriteRule</span> . - [env=DESTINATION:http://%1,PT]
  RequestHeader set Destination %{DESTINATION}e env=DESTINATION
&nbsp;
  <span style="color: #adadad; font-style: italic;"># Add the X_FORWARDED_PROTO=https to allow applications to identify</span>
  <span style="color: #adadad; font-style: italic;"># proxyed https connections</span>
  RequestHeader set X_FORWARDED_PROTO https
&nbsp;
  <span style="color: #adadad; font-style: italic;"># Proxy requests to ourselves preserving the Host header</span>
  <span style="color: #00007f;">ProxyPass</span> / http://localhost/
  <span style="color: #00007f;">ProxyPassReverse</span> / http://localhost/
  ProxyPreserveHost <span style="color: #0000ff;">on</span>
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;</pre></div></div>

<h3>Conclusiones</h3>
<p>Personalmente veo está configuración como una solución válida para servidores personales en los que se suelen usar <em>self signed certificates</em> o de <a href="http://www.cacert.org/">CAcert</a>. Para pequeñas empresas (con unos pocos dominios) puede ser una solución, pero los <em>Widlcard SSL Certificates</em> de <a title="Thawte Wildcard SSL Certificates" href="https://www.thawte.com/ssl-digital-certificates/wildcardssl/index.html">autoridades</a> <a title="Verisign Wildcard SSL Certificates" href="http://www.verisign.com/ssl-certificates/wildcard-ssl-certificates/">certificadoras</a> <a title="Go Daddy SSL Certificates" href="http://www.godaddy.com/gdshop/ssl/ssl.asp?ci=9039">comerciales</a> (cuyos certificados raíz vienen en los navegadores) no son baratos. Dependiendo del <em>hosting</em> creo que saldría más barato contratar IPs adicionales para el servidor y certificados individuales que no usar el <em>Widlcard SSL Certificate</em> en un servidor con una sóla IP.</p>
<p>En empresas medianas o grandes, puede justificarse el uso de <em>Widlcard SSL Certificates</em> si tienen un gran número de subdominios que quieren asegurar ya que puede suponer un ahorro, pero no veo el motivo de tenerlo todo sobre una sóla dirección IP. Por tanto, no veo que la configuración aquí explicada sea aplicable en este tipo de empresas.</p>
<p>A mi, esta solución me está funcionando muy bien y de momento no he encontrado ningún problema.</p>
<h3>Notas adicionales</h3>
<p>[<span id="nota-1">1</span>] Para los nostálgicos, ¿os acordáis de la <a href="http://es.wikipedia.org/wiki/Guerra_de_navegadores">guerra de navegadores</a>?</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/27/ssl-en-subdominios-con-una-unica-direccion-ip/feed/</wfw:commentRss>
		<slash:comments>0</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>¿Deben los programadores tener acceso a producción?</title>
		<link>http://aleph.llull.net/2008/10/17/deben-los-programadores-tener-acceso-a-produccion/</link>
		<comments>http://aleph.llull.net/2008/10/17/deben-los-programadores-tener-acceso-a-produccion/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 11:36:04 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=385</guid>
		<description><![CDATA[Hoy quiero reflexionar, y me gustaría conocer vuestras opiniones al respecto, sobre si los equipos de desarrollo deben tener o no acceso al entorno productivo de un sistema informático. Como soy muy puntilloso en lo que a terminología se refiere (y los que me conocen lo saben muy bién), empezaré con un poco de introducción [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-387" title="Servers" src="http://aleph.llull.net/wp-content/files/servers.jpg" alt="" width="240" height="180" />Hoy quiero reflexionar, y me gustaría conocer vuestras opiniones al respecto, sobre si los equipos de desarrollo deben tener o no acceso al entorno productivo de un sistema informático. Como soy muy puntilloso en lo que a terminología se refiere (y los que me conocen lo saben muy bién), empezaré con un poco de introducción para fijar conceptos.</p>
<p>Entendemos por entorno como el conjunto de servidores necesarios para que nuestras aplicaciones funcionen. Es decir, en una <a title="Multitier architecture @ Wikipedia" href="http://en.wikipedia.org/wiki/Three_layer_architecture#Web_Development_usage">aplicación web de tres capas</a>, cada entorno lo formarían el servidor de base de datos, el servidor de aplicaciones y el servidor web.</p>
<p>Los sistemas medianamente complejos suelen disponer de vários. Típicamente, tres:</p>
<ul>
<li>Desarrollo: sobre el que los programadores realizan los cambios.</li>
<li>Preproducción: que suele usarse para la integración de los cambios de los diferentes equipos, pero puede usarse también para pruebas de despliegue (deployment) y para pruebas de QA.</li>
<li>Producción: al que los usuarios se conectan para usar las aplicaciones. Este es el entorno en el que se produce el negocio y por tanto el más crítico.</li>
</ul>
<p>Al disponer de estos entornos, cualquier cambio suele pasar por los tres: se programa en desarrollo, se comprueba en preproducción y finalmente se despliega en el productivo para ponerlo a disposición de los usuarios.</p>
<p>Una vez introducidos los conceptos, mi opinión es que si los desarrolladores tienen acceso al entorno productivo, es posible que puedan sentirse tentados a realizar cambios directamente en él, saltándose el ciclo normal del cambio, debido a la presión de los usuarios y es posible que pueda provocar problemas  en un entorno que debería ser, por encima de ninguna otra cosa, estable. Estoy seguro que si un cambio provocara un problema, sería de forma involuntaria, pero errar es humano.</p>
<p>Por otra parte, es cierto que el proceso de resolución de incidencias puede complicarse ya que el desarrollador no puede monitorizar el sistema mientras reproduce la incidencia. Pero creo que los entornos de preproducción, correctamente mantenidos, se podrían usar para esto. Además, soy de la opinión de que los ficheros de log, correctamente usados, pueden ser de gran ayuda para la resolución de incidencias. Lo complicado está en determinar qué es necesario registrar: si loggueamos de más, el seguimiento y estudio puede complicarse por la cantidad de &#8220;ruido&#8221; que hay; y si nos quedamos cortos no dispondremos de la información suficiente para diagnosticar el problema.</p>
<p>He aquí el dilema: por la estabilidad del entorno productivo es mejor que no tengan acceso, pero esto puede dificultar la resolución de incidencias. Personalmente opino que las ventajas de que no tengan acceso superan con creces los inconvenientes, pero soy consciente de que por mi trabajo como administrador de sistemas puedo tener una visión sesgada del problema. <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Y vosotros, ¿que opináis? ¿Deben o no tener los equipos de desarrollo acceso a producción?</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/17/deben-los-programadores-tener-acceso-a-produccion/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>One time passwords con OPIE</title>
		<link>http://aleph.llull.net/2008/10/14/one-time-passwords-con-opie/</link>
		<comments>http://aleph.llull.net/2008/10/14/one-time-passwords-con-opie/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 09:15:23 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[pam]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=240</guid>
		<description><![CDATA[Continuando con mis posts sobre seguridad, tema que me apasiona, hoy voy a explicar como implantar un sistema de One-Time-Password en nuestros servidores Linux. Como se puede sobreentender de su nombre, los sistemas de One-Time-Password son sistemas de autenticación en los que cada contraseña se utiliza una única vez. Esto nos puede resultar útil en [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con mis posts sobre <a title="Posts sobre seguridad" href="http://aleph.llull.net/tag/seguridad">seguridad</a>, tema que me apasiona, hoy voy a explicar como implantar un sistema de One-Time-Password en nuestros servidores Linux.</p>
<p>Como se puede sobreentender de su nombre, los sistemas de One-Time-Password son sistemas de autenticación en los que <strong>cada contraseña se utiliza una única vez</strong>. Esto nos puede resultar útil en el caso de que debamos hacer login en situaciones comprometidas: usando un protocolo con el que las credenciales viajan en claro (sin cifrar) por la red, desde un equipo del que no podemos asegurar su integridad (que no tenga <a title="Keyloggers en la Wikipedia" href="http://es.wikipedia.org/wiki/Keylogger">keyloggers</a> instalados, por ejemplo), etc.</p>
<p>Aunque existen tres formas de implementar sistemas <abbr title="One Time Passwords">OTP</abbr>, desde un punto de vista práctico existen dos tipos:</p>
<ul>
<li>Basados en secuencia: cada vez que usamos una contraseña esta deja de ser válida y el sistema nos pedirá la siguiente en el proximo login. Mientras no hagamos login, el sistema nos seguirá pidiendo la misma.</li>
<li>Basados en relojes sincronizados: la contraseña va cambiando con el tiempo, se use o no. El principal requisito de estos sistemas es que el servidor y el generador de la contraseña deben estar sincronizados en el tiempo.</li>
</ul>
<p>El sistema que os presento es <abbr title="One-time Passwords In Everything">OPIE</abbr>, que está basado en secuencia, es una implementación de <a title="S/Key en la Wikipedia" href="http://en.wikipedia.org/wiki/S/Key">S/Key</a>. Si elegí este fué por sencillez de implementación ya que todo el software necesario esta disponible desde los repositorios oficiales de Debian. Pero le he encontrado dos &#8220;problemas&#8221;: <a title="OPIE homepage" href="http://www.inner.net/opie">la página del proyecto</a> no funciona (al menos mientras estoy escribiendo este post) y que no hay desarrollos nuevos desde 1998.</p>
<p><span id="more-240"></span></p>
<p>Las contraseñas de OPIE son independientes de las del sistema operativo, cosa necesaria ya que sino de poco nos serviría si a partir de la contraseña de OPIE se pudiera averiguar la del sistema operativo. Para funcionar, OPIE se basa en tres datos: <strong>un número de secuencia, una semilla y una passphrase </strong>(donde reside la fortaleza del sistema frente a ataques de fuerza bruta).</p>
<p>La forma que tiene de generar la contraseña de un sólo uso es concatenando la semilla y la passphrase, y aplicando la función de hash MD5 tantas veces como le indique el número de secuencia. El resultado se convierte en seis palabras inglesas. Todo este cálculo se realiza desde el cliente. La passphrase nunca se almacena en el servidor.</p>
<p>Para poder validar la contraseña, el servidor necesita almacenar la última contraseña que se usó y el número de secuencia y semilla para podérselo indicar al usuario al hacer login (para los curiosos, esta información se almacena en <code>/etc/opiekeys</code>, que es un fichero que sólo puede leer el usuario <em>root</em>). El sistema dará por buena la contraseña si el MD5 de la contraseña proporcionada por el usuario coincide con la contraseña que tenía almacenada. Una vez se ha verificado la contraseña el número de secuencia se decrementa y cuando este llega a 1 es necesario reinicializar el contador con una nueva semilla (si no, las contraseñas se repetirían) Como el MD5 es una función unidireccional, es imposible encontrar la nueva contraseña a partir de la anterior.</p>
<h3>Instalación y configuración</h3>
<p>Cómo siempre, empezaremos instalando el software necesario. En este caso deberemos instalar paquetes tanto en el servidor como en un equipo de confianza que nos hará de cliente. Para distinguir los comandos que debemos ejecutar en uno u otro equipo, usare los prompts <code>server:~#</code> y <code>client:~#</code> para el servidor y el cliente respectivamente.</p>
<pre>  server:~# aptitude install libpam-opie opie-server opie-client
  client:~# aptitude install opie-client</pre>
<p>Una vez instalado el software,<strong> cada usuario que quiera usar este sistema de autenticación debe inicializarlo</strong>. Hay dos formas de hacerlo, en una se supone que el acceso que tenemos al servidor es seguro y en la otra esta suposición no es necesaria. Si estamos implementando este sistema significa que la seguridad nos preocupa (algunos dirían que somos paranoicos <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ) y por eso sólo explicaré el segundo método, que no es mucho más complicado y si es más seguro. En este proceso hay que ejecutar comandos tanto en el servidor como en el equipo de confianza (cliente). Supongamos que el usuario <em>username</em> quisiera inicializarlo:</p>
<ul>
<li>Debería empezar por usar <code>opiepasswd</code> en el servidor.
<pre>username@server:~$ opiepasswd
Adding username:
You need the response from an OTP generator.
New secret pass phrase:
        otp-md5 <strong>499 se4569</strong>
        Response:</pre>
</li>
<li>En este momento vamos a un terminal del cliente (máquina de confianza) y ejecutamos <code>opiekey </code>pasándole como parámetros los valores del número de secuencia y semilla que aparecen al lado de otp-md5. Cuando nos lo pida, le introduciremos la passphrase que queremos configurar. Recordad que cuanto más complicada sea la passphrase, mejor.
<pre>client:~$ opiekey <strong>499 se4569</strong>
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <em>&lt;introducimos la passphrase&gt;</em>
<strong><strong><strong><strong>WOOL ARTY FUM SNUG WARN WICK</strong></strong></strong></strong></pre>
</li>
<li>Volvemos a la consola que tenemos en el servidor y pegamos la última línea que obtuvimos con  <code>opiekey</code> en el cliente. Lo remarcado en cursiva es lo que ya teníamos en pantalla.
<pre><em>username@server:~$ opiepasswd
Adding username:
You need the response from an OTP generator.
New secret pass phrase:
        otp-md5 499 se4569
        Response:</em> <strong><strong>WOOL ARTY FUM SNUG WARN WICK</strong></strong>

ID username OTP key is 499 se4569
WOOL ARTY FUM SNUG WARN WICK</pre>
</li>
</ul>
<p>Con esto, el usuario <em>username</em> dispone de 499 contraseñas de un sólo uso.</p>
<p><strong>Para hacer que el sistema empiece a usar OPIE como sistema de autenticación debemos indicárselo al <abbr title="Pluggable Authentication Modules">PAM</abbr></strong>. La forma más sencilla es sobreescribir el fichero <code>/etc/pam.d/common-auth</code> con el que podemos encontrar en <code>/usr/share/doc/libpam-opie/examples/pam.d/common-auth</code> (recomiendo hacer una copia de seguridad del antiguo) en el que se indica que el primer método de autenticación seguirá siendo la contraseña del sistema operativo pero si este fallá se usará OPIE:</p>
<pre>server:~$ cat /etc/pam.d/common-auth
#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.).  The default is to use the
# traditional Unix authentication mechanisms.
#
auth    sufficient      pam_unix.so
auth    sufficient      pam_opie.so
auth    required        pam_deny.so</pre>
<p>Si lo hacemos de esta forma, <strong>cualquier servicio que autentique por PAM se podrá beneficiar del sistema de One Time Password</strong>: ssh, su, etc. De nada serviría poder usar OTP para hacer login desde un equipo del que no nos fiamos y luego tecleamos la clave de <em>root</em> en la misma máquina. En el caso de usarlo también para obtener permisos de administrador, aconsejo usar <code>sudo</code> antes que <code>su</code> por la sencilla razón que para usar el primero se pide la contraseña del usuario que pide los privilegios (que ya está usando OTP) mientras que el segundo pide la contraseña de <em>root</em>.</p>
<p>En el caso de SSH debemos realizar una pequeña comprobación en la configuración del servidor de sshd (fichero <code>/etc/ssh/sshd_config</code>): <strong>el parámetro <code>ChallengeResponseAuthentication</code> debe estar a yes</strong>. Si no estuviera así, el sistema no le indicaría al usuario el número de secuencia y semilla al intentar hacer login.</p>
<h3>Ejemplo de uso</h3>
<p>Ya lo tenemos todo listo. Veamos un ejemplo de conexión SSH usando OPIE:</p>
<ul>
<li>Desde la máquina de dudosa seguridad nos conectamos como normalmente:
<pre>unsecure:~$ ssh username@example.com
Password:</pre>
</li>
<li>El sistema nos pide la contraseña como siempre, ya que así lo hemos configurado en las PAM. Pero como no nos fiamos de la seguridad de esa máquina no introducimos la contraseña:
<pre>unsecure:~$ ssh username@example.com
Password: <em>&lt;enter&gt;
</em>otp-md5 <strong>498 se4569</strong> ext, Response:</pre>
</li>
<li>Como la autenticación por contraseña a fallado, ha entrado en acción OPIE que nos indica el siguiente número de secuencia (498) y la semilla (se4569). Desde un equipo de confianza usamos <code>opiekey</code> para obtener el OTP, pasándole el secuencial y la semilla:
<pre>secure:~$ opiekey <strong>498 se4569</strong>
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <em>&lt;introducimos la passphrase que usamos al configurarlo&gt;</em>
<strong>GWYN OAF HIRE ALOE CASK CERN</strong></pre>
</li>
<li>Una vez tenemos la contraseña, se la indicamos al servidor y si todo ha ido bien, ya estamos dentro (lo remarcado en cursiva es lo que ya teníamos en pantalla):
<pre><em>unsecure:~$ ssh username@example.com
Password:</em><em>
otp-md5 498 se4569 ext, Response:</em> &lt;introducimos la contraseña generada (no se ve)&gt;
Last login: Mon Apr  9 10:01:18 2008 from 192.168.0.10
username@server:~$</pre>
</li>
<li>Si nos intentamos conectar de nuevo, veremos como el número de secuencia se ha decrementado:
<pre>unsecure:~$ ssh username@example.com
Password: <em>&lt;enter&gt;
</em>otp-md5 <strong>497</strong> se4569 ext, Response:</pre>
</li>
</ul>
<h3>Generadores de claves</h3>
<p>Me imagino que os deberéis estar preguntando que ventaja tiene este sistema si de todas formas necesitas un equipo de confianza para generar la contraseña. Es decir, ¿si tengo un portátil para ejecutar <code>opiekey</code>, por que no lo uso para conectarme directamente desde él? Entre otros motivos se me ocurre que ese portátil no pueda tener conexión a Internet porque, por política de seguridad, la red en la que estás no permita que equipos externos tengan acceso al exterior. Pero yo nunca he dicho que necesitemos un PC para generar la contraseña. Existen, como mínimo, dos alternativas:</p>
<p><strong>Podemos imprimir una lista de contraseñas</strong> y llevarlas bien cerca de nosotros. Para hacerlo, en el cliente de confianza ejecutaremos:</p>
<pre>client:~$ opiekey -n 5 499 se4569
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <em>&lt;introducimos la passphrase que usamos al configurarlo&gt;
</em>495: CRAB YEAR MAO JAG BEAD KUDO
496: CLOD REED BOND COMA DELL HEFT
497: ERIC WEE WISE TOLD NINA DIVE
498: GWYN OAF HIRE ALOE CASK CERN
499: WOOL ARTY FUM SNUG WARN WICK</pre>
<p>Donde en la opción -n se le indica el número de contraseñas que queremos que nos imprima y el 499 es el número de secuencia más alto que queremos que aparezca en la lista.</p>
<p>Y si no queremos llevar las contraseñas por escrito, <strong>podemos usar nuestro móvil o PDA para calcular la contraseña</strong> instalando el equivalente al <code>opiekey</code>. Para hacerlo necesitaremos que el dispositivo pueda ejecutar código Java. Yo he encontrado tres aplicaciones GPL: <a title="j2me-otp: The Java OTP Calculator for cell phones." href="http://tanso.net/j2me-otp/">j2me-otp</a>, <a title="S/Key Generator for J2ME architecture" href="http://sourceforge.net/projects/otp-j2me">otp-j2me</a> (sí, no son muy originales con los nombres) y <a title="One-Time Password Generator" href="http://marcin.studio4plus.com/en/otpgen/">otpgen</a>. No voy a explicar como se instalan, ya que depende mucho del móvil que tengáis.</p>
<p>De los tres, el que más me gusta es el tercero pues es más cómodo: te permite definir cuentas en las que mantiene el seed y el número de secuencia, que se va decrementando a medida que obtienes contraseñas. Además estoy seguro de que no hace cosas raras ya que lo he auditado (lo que os dará igual si no os fiáis de mí <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) y al que he hecho dos pequeñas aportaciones: el número de secuencia sólo se decrementa cuando aceptamos la contraseña que nos ha proporcionado y he añadido una opción de configuración para que se muestren o no asteriscos al escribir la passphrase.</p>
<p>A pesar de haber mandado el parche al desarrollador, la verdad es que me animé tanto con esta aplicación que he terminado reescribiéndola casi por completo y podéis ver el resultado en <a title="S/KeyGen - One-time password generator" href="http://aleph.llull.net/one-time-password-generator">la página del proyecto</a>.</p>
<h3>Mantenimiento</h3>
<p>Como a medida que vamos usando contraseñas el número de secuencia va decrementando, debemos reinicializarlo cuando este se acerque a uno. Para hacerlo usaremos las mismas herramientas que usamos para inicializarlo (<span style="font-family: Courier New;">opiekey</span> y <span style="font-family: Courier New;">opiepasswd</span>) y el proceso es casi el mismo. La única diferencia es que en esta ocasión <span style="font-family: Courier New;">opiepasswd</span> nos solicitará la actual contraseña antes de solicitarnos la nueva:</p>
<pre>username@server:~$ opiepasswd
Updating username:
You need the response from an OTP generator.
Old secret pass phrase:
        otp-md5 495 se4569 ext
        Response: <strong>CRAB YEAR MAO JAG BEAD KUDO</strong> <em>&lt;contraseña actual obtenida con opiekey&gt;</em>
New secret pass phrase:
        otp-md5 499 se1984
        Response: <strong>NINA TOLD ALIA LAKE LARK THIS</strong> <em>&lt;contraseña nueva obtenida con opiekey&gt;</em>

ID username OTP key is 499 se1984
NINA TOLD ALIA LAKE LARK THIS</pre>
<p>Es muy importante no repetir nunca la misma semilla, si mantenemos la passphrase, ya que las contraseñas se calculan a partir de estos dos datos y si en alguna ocasión repitiéramos, las contraseñas que se generarían serían repetidas y ya no serían de un sólo uso.</p>
<h3>Seguridad del sistema</h3>
<p>Las contraseñas de este sistema son generadas mediante algoritmos de hashing, por lo que empezaremos estudiando la seguridad o robustez del sistema a partir de estos algoritmos y en concreto de la dificultad de averiguar el texto a partir del resultado de la función. Por la forma en que se generan las contraseñas, significa revisar lo dificultad de averiguar la siguiente contraseña a partir de la actual. Aunque en 1996 se descubrió <a href="http://en.wikipedia.org/wiki/Md5#Vulnerability">una vulnerabilidad en el algoritmo MD5</a>, que es el que usa OPIE, esta vulnerabilidad no afecta al aspecto que nos preocupa. (para los curiosos, dicha vulnerabilidad es un problema de colisiones: resulta más o menos fácil encontrar dos textos que den el mismo resultado, pero esto no significa que, dado un resultado, se pueda calcular un texto que lo genere). Por lo tanto, no debemos preocuparnos en este aspecto. La robustez del sistema dependerá de la robustez de las contraseñas generadas, que es el siguiente punto a considerar.</p>
<p>OPIE genera contraseñas de 64 bits de longitud a partir de los 128 bits resultantes del MD5 haciendo una XOR entre los 64 primeros bits y los 64 últimos. Consideraremos que los 64 bits son aleatorios ya que se calculan mediante funciones de hashing. Eso significa que estas contraseñas tienen una robustez de 64 bits. Para poder comparar, <a title="Password Strength" href="http://en.wikipedia.org/wiki/Password_strength#Human_generated_passwords">según la Wikipedia</a>, una contraseña de la misma longitud (ocho carácteres) generada por un usuario tiene la robustez equivalente de entre 18 y 30 bits. Por lo tanto, en este aspecto es mejor que las contraseñas que usamos habitualmente: <a title="RC5-64 Overall Project Stats" href="http://stats.distributed.net/projects.php?project_id=5">distributed.net necesitó 4 años, 9 meses y 23 días</a> para romper una clave de 64 bits mientras que, <a href="http://en.wikipedia.org/wiki/Password_strength#Time_needed_for_password_searches">también según la Wikipedia</a>, sólo se necesitarían 16 minutos para averiguar una contraseña creara por un usuario.</p>
<p>Por lo tanto, parece que el sistema es seguro. Si véis algun error en mi razonamiento, por favor, indicádmelo mediante los comentarios.</p>
<p>Por otro lado, ya que estamos hablando de seguridad y si habéis llegado hasta aquí posiblemente signifique que os interesa poderos conectar por SSH a un servidor vuestro desde una red potencialmente insegura, dejadme que os dé un consejo: llevad con vosotros, y a buen recaudo, el figerprint de la clave de vuestro servidor y verificad que coincida con el que se os indica al iniciar la conexión por primera vez. De esta manera os aseguraréis que no estáis siendo sujetos de un <a title="Ataque man-in-the-middle en la Wikipedia" href="http://es.wikipedia.org/wiki/Ataque_Man-in-the-middle">ataque man-in-the-middle</a>. Puede que muchos de vosotros ya lo estéis haciendo, pero seguro que hay otros muchos que no.</p>
<h3>Conclusiones</h3>
<p>Aunque el post es bastante largo (a veces pienso que me enrollo demasiado) este sistema es bastante sencillo de implementar, la seguridad que ofrece es adecuada y, si lo configuráis como os he indicado, no tiene impacto en el día a día ya que podéis usar vuestras contraseñas de siempre cuando trabajáis desde entornos seguros, pero dispondréis de esta alternativa en casos donde la seguridad no esté tan clara. Además, ¿sabéis la cara que pone la gente cuando usas el móvil para calcular una contraseña al intentar hacer login en un sistema? <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Si tenéis algo que decir sobre el post o si encontráis alguna burrada (cosa posible ya que dada la longitud del post lo he escrito en varias tandas), no dudéis en usar los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/14/one-time-passwords-con-opie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fail2ban</title>
		<link>http://aleph.llull.net/2008/10/11/fail2ban/</link>
		<comments>http://aleph.llull.net/2008/10/11/fail2ban/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 09:26:33 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[fail2ban]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[seguridad]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=234</guid>
		<description><![CDATA[Una de las principales preocupaciones de cualquier administrador de sistemas es la seguridad de sus servidores, y más particularmente de las intrusiones. La principal medida que se suele usar para evitarlas es el uso de Firewalls, pero siempre debemos dejar abiertos los puertos por los que da servicio (un servidor al que no nos pudiéramos [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las principales preocupaciones de cualquier administrador de sistemas es la seguridad de sus servidores, y más particularmente de las intrusiones. La principal medida que se suele usar para evitarlas es el uso de Firewalls, pero siempre debemos dejar abiertos los puertos por los que da servicio (un servidor al que no nos pudiéramos conectar no es muy útil <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  ), y si esos servicios son autenticados, pueden ser sujetos de ataques de fuerza bruta para averiguar contraseñas. Uno de los principales servicios que sufren este tipo de ataques es el de SSH y para protegerlo disponemos de <a title="Fail2Ban homepage" href="http://www.fail2ban.org/">fail2ban</a>.</p>
<p>Fail2ban es un servicio que <strong>vigila una serie de ficheros de log y cuando detecta intentos fallidos bloquea la dirección IP</strong>desde la que se han realizado añadiendo una regla de iptables.</p>
<p>Para instalarlo, en Debian basta con un <code>"aptitude install fail2ban"</code>. La configuración por defecto trae activada la protección de SSH y a parte de bloquear la IP infractora envía un correo a root. A parte de la protección de SSH, trae configuraciones para apache, postfix, qmail, vsftpd, etc. y soporte para otros sistemas de firewall a parte de iptables.</p>
<p>Fail2ban no nos asegura una protección total, es sólo una medida más para ponérselo más difícil a los que intentan entrar de forma no autorizada en nuestro servidor, principalmente contra <a title="Script Kiddie en la Wikipedia" href="http://es.wikipedia.org/wiki/Script_Kiddie">script-kiddies</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/10/11/fail2ban/feed/</wfw:commentRss>
		<slash:comments>1</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>
		<item>
		<title>Portal captivo muy simple</title>
		<link>http://aleph.llull.net/2008/09/21/portal-captivo-muy-simple/</link>
		<comments>http://aleph.llull.net/2008/09/21/portal-captivo-muy-simple/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 16:00:19 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[LAN]]></category>
		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=85</guid>
		<description><![CDATA[Introducción Recientemente se me ocurrió la idea de si sería posible que si un equipo no registrado se conectara a una red privada (un consultor que llega a una empresa, por ejemplo) se le presentara una página web indicando que debe ponerse en contacto con el soporte técnico para que le den acceso. Vaya, una [...]]]></description>
			<content:encoded><![CDATA[<h3>Introducción</h3>
<p>Recientemente se me ocurrió la idea de si sería posible que si un equipo no registrado se conectara a una red privada (un consultor que llega a una empresa, por ejemplo) se le presentara una página web indicando que debe ponerse en contacto con el soporte técnico para que le den acceso. Vaya, una especie de portal captivo pero mucho más simple.</p>
<p>Después de darle unas pocas vueltas llegué a una posible solución, que es la que voy a exponer a continuación. Mi intención no es dar una configuración detallada al 100%, básicamente porque no dispongo de un entorno donde poderlo probar todo. Lo que quiero es dar las ideas y poner parte de las configuraciones  necesarias para conseguirlo.</p>
<p>La idea es la siguiente:</p>
<ol>
<li>Tenemos el <acronym title="Dynamic Host Configuration Protocol">DHCP</acronym> configurado de tal manera que a los equipos de la red se les asigna siempre la misma dirección IP de un determinado rango a partir de su dirección <acronym title="Media Access Control">MAC</acronym>. A las MACs no registradas les asignamos una dirección <acronym title="Internet Protocol">IP</acronym> de un pool formado por direcciones de una rango totalmente diferente al de la red que se le asigna a las MACs conocidas y que no está enrutada (por tanto no tiene salida fuera de la red local). El pool &#8220;captivo&#8221; estará configurado para que el servidor <acronym title="Domain Name System">DNS</acronym> que se asignará a esos dispositivos sea uno que estará en el mismo segmento de red y dentro de la misma red IP que las direcciones (recordad que la red del pool no esta enrutada).</li>
<li>Configuraremos el servidor DNS que usaran esos equipos no registrados de manera que resuelva todos los nombres de dominio con una misma dirección IP, la de un servidor local que también estará dentro de la misma red IP que el pool (que es la única red que pueden ver).</li>
<li>Y el servidor Web siempre devolverá la misma página independientemente de la URL que se le solicite. En esa página se le indicará al usuario que el equipo desde el que está accediendo no esta autorizado, que se ha registrado su acceso y que se ponga en contacto con el soporte técnico para que le den acceso.</li>
</ol>
<p>Por ejemplo, supongamos que en nuestra red usamos las direcciones 192.168.0.0/24, que el DNS &#8220;bueno&#8221; está en la dirección 192.168.0.1 y el default gateway también es el 192.168.0.1. Para las MACs no registradas, el pool tendrá direcciones de la red 172.16.0.0/24, de la 172.16.0.16 a la 172.16.0.254, el servidor DNS para los equipos no registrados será la 172.16.0.1 y el servidor web estará en la misma máquina.</p>
<p>De esta forma, cuando alguien enchufe un PC a la red y no lo haya notificado previamente, cuando intente acceder a alguna web le saldrá la página que le indicará que debe registrar su equipo.</p>
<h3>Configuración</h3>
<p>Vamos a ver como debemos configurar los diferentes servicios que intervienen para implementar esta funcionalidad.</p>
<h4>DHCP</h4>
<p>La configuración del servidor de DHCP no tiene mucho misterio. Básicamente es traducir los requisitos a nivel de DHCP a configuración. Pego la parte relevante de la configuración.</p>
<p>/etc/dhcp.conf</p>
<pre>shared-network LAN {
  subnet 172.16.0.0 netmask 255.255.255.0 {
    allow unknown-clients;
    option routers 172.16.0.1;
    option domain-name-servers 172.16.0.1;
    range   172.16.0.16 172.16.0.254;
    max-lease-time 30;
    default-lease-time 30;
  }

  subnet 192.168.0.0 netmask 255.255.255.0 {
    option routers 192.168.0.1;
    option domain-name-servers 192.168.0.1;
    option subnet-mask 255.255.255.0;
    max-lease-time 86400;
    default-lease-time 86400;
  }
}

# Equipos registrados
group {
  host PC1 {
    hardware ethernet 00:01:02:e7:ef:15;
    fixed-address 192.168.17;
  }

  host PC2 {
    hardware ethernet 00:00:21:cb:22:fa;
    fixed-address 192.168.18;
  }
}</pre>
<h4>Bind</h4>
<p>Como servidor DNS usaremos el Bind y tal y como he comentado anteriormente, debemos configurarlo de manera que resuelva cualquier nombre de dominio que le solicitemos con la dirección IP del servidor en el que configuraremos el Apache. Por suerte, Bind tiene soporte de <em>wildcards</em>.</p>
<p><strong>Importante</strong>: poner el TTL de esas resoluciones muy bajo, varios segundos a lo sumo. Si no, tras registrar el PC, seguiría sin ver las páginas a las que hubiera intentado acceder mientras tenÍa configurado el DNS del portal captivo ya que la cache de DNS de su S.O. seguiría &#8220;resolviendo&#8221; el nombre de dominio como la IP de la web del portal captivo.</p>
<p>/etc/bind/named.conf</p>
<pre>options {
  directory "/var/cache/bind";
  listen-on { 172.16.0.1; };
  version "Captive Portal DNS Server";
  recursion no;
};

zone "." {
  type master;
  file "/etc/bind/db.captive";
};</pre>
<p>/etc/bind/db.captive<strong><br />
</strong></p>
<pre>$TTL    1
@       IN      SOA     captive.local. netmaster.local. (
                        0000001         ; Serial
                        604800         ; Refresh
                        86400         ; Retry
                        2419200         ; Expire
                        1 )       ; Negative Cache TTL
;
@       IN      NS      captive.local.
*.      IN      A       172.16.0.1</pre>
<h4>Apache</h4>
<p>Partiremos de una instalación estándar de Apache2 de Debian y configuraremos el host virtual por defecto de manera que la web tendrá simplemente una página HTML y como mucho unas cuantas imágenes (por ejemplo, el logo de la empresa). También configuraremos unas reglas de rewrite para que pidan la URL que pidan salga la misma página.</p>
<p><strong>Importante</strong>: para evitar problemas con las caches de los navegadores, la página debería tener una cabecera de <em>Cache-Control</em> forzando que el navegador siempre se la descargue en cada consulta.</p>
<p>/etc/apache2/sites-available</p>
<pre>&lt;Directory /var/www/&gt;
  Options Indexes FollowSymLinks MultiViews
  AllowOverride FileInfo
  Order allow,deny
  allow from all
&lt;/Directory&gt;</pre>
<p>Pondremos el index.html que queramos mostrar en /var/www/index.html y crearemos el fichero .htaccess con las reglas de reescritura y de no-cache:</p>
<p>/var/www/.htaccess</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
&lt;/IfModule&gt;

&lt;IfModule mod_headers.c&gt;
  Header set Cache-Control "no-cache"
&lt;/IfModule&gt;</pre>
<p>No debemos olvidarnos de habilitar los modulos de rewrite y header:</p>
<pre>a2enmod rewrite
a2enmod headers</pre>
<p>Y con esto ya tendríamos nuestro portal captivo.</p>
<h3>Mejoras</h3>
<p>Si no quisiéramos/pudiéramos tener un servidor dedicado al portal captivo, podríamos poner la configuración necesaria de DNS en una vista y configurar el Bind para que las IPs del rango captivo fueran a esa vista en particular, y a nivel de Apache podríamos usar un Virtual Host basado en dirección IP. Si alguien no supiera como hacerlo, le debería ser bastante fácil encontrar documentación en Internet sobre somo hacerlo.</p>
<p>Si lo que nos interesa es que los equipos no registrados no tengan ningún tipo de conectividad, escenario mucho más seguro, deberemos pensar en una solución basada en <a href="http://en.wikipedia.org/wiki/802.1x">802.1x</a>. Pero para ello, tanto la electrónica de red como los equipos deben soportar ese protocolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2008/09/21/portal-captivo-muy-simple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
