<?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>nordri&#039;s Blog &#187; Apache</title>
	<atom:link href="http://www.muspells.net/blog/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muspells.net/blog</link>
	<description>Estamos trabajando en ello...</description>
	<lastBuildDate>Wed, 04 Jan 2012 16:01:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Montar un Servidor Web</title>
		<link>http://www.muspells.net/blog/2011/06/montar-un-servidor-web/</link>
		<comments>http://www.muspells.net/blog/2011/06/montar-un-servidor-web/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 16:29:31 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[debian squeeze]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[virtualhost]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=994</guid>
		<description><![CDATA[Hay muchas formas de llevar a cabo la tarea de desplegar un servidor Web, incluso se puede optar por algún servicio que nos ofrezca un panel de control para administrar el contenido perdidiendo la capacidad de administrar físicamente los servicios. Como digo, existen muchas maneras de hacer esto, esta es una de ellas. Introducción No [...]]]></description>
			<content:encoded><![CDATA[<p>Hay muchas formas de llevar a cabo la tarea de desplegar un servidor Web, incluso se puede optar por algún servicio que nos ofrezca un panel de control para administrar el contenido perdidiendo la capacidad de administrar físicamente los servicios. Como digo, existen muchas maneras de hacer esto, esta es una de ellas.</p>
<h4>Introducción</h4>
<p>No entramos en detalles sobre el hardware de la máquina, ya está instalado un sistema GNU/Linux Debian Squezee. Hemos contratado un servidor que incluye nombre DNS para nuestro dominio <em>midominio.com</em>.</p>
<h4>El usuario</h4>
<p>La ejecución del servidor debe ser bajo un usuario no privilegiado y sin shell válida en el sistema. En Debian, tras instalar Apache, se crea un usuario <em>www-data</em> para esta tarea, pero lo vamos a cambiar por otro por no mantener, en la medida de lo posible, los valores por defecto. Nuestro usuario será <em>webuser</em> que es bastante descriptivo de la labor que tendrá.</p>
<p>Creamos el grupo y el usuario y le asignamos contraseña:</p>
<pre>
# groupadd webuser
# useradd -d /home/webuser -s /bin/false -g webuser -m webuser
# passwd webuser
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente
</pre>
<p>Con esto contamos con el usuario, vamos a instalar Apache.</p>
<h4>Instalando Apache</h4>
<p>Vamos a instalarlo mediante la utilidad <em>tasksel</em> que es gráfica de consola y nos ahorra escribir.</p>
<pre>
# tasksel
</pre>
<p>De las opciones disponibles, elegimos la de Servidor Web, como vemos en la imagen, luego le damos a aceptar.</p>
<div id="attachment_997" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.muspells.net/blog/wp-content/uploads/2011/06/01Tasksel1.png"><img src="http://www.muspells.net/blog/wp-content/uploads/2011/06/01Tasksel1-300x187.png" alt="Tasksel" title="Tasksel" width="300" height="187" class="size-medium wp-image-997" /></a><p class="wp-caption-text">Tasksel</p></div>
<p>Instalará Apache y todas las dependencias.</p>
<div id="attachment_998" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.muspells.net/blog/wp-content/uploads/2011/06/02Instalando.png"><img src="http://www.muspells.net/blog/wp-content/uploads/2011/06/02Instalando-300x187.png" alt="Instalando" title="Instalando" width="300" height="187" class="size-medium wp-image-998" /></a><p class="wp-caption-text">Instalando</p></div>
<p>Ya podemos pasar a configurar el servidor.</p>
<h4>Configurando Apache</h4>
<p>La configuración que trae Debian para Apache es la que me hace elegir esta distribución frente a otras como CentOS que también es conocida por estar presente en muchos servidores web de internet. El primer fichero que vamos a configurar es <em>/etc/apache2/envvars</em> y añadimos el usuario y grupo que hemos creado.</p>
<pre># vim /etc/apache2/envvars</pre>
<pre>
[...]
export APACHE_RUN_USER=webuser
export APACHE_RUN_GROUP=webuser
[...]
</pre>
<p>A continuación deshabilitamos los <strong>VirtualHosts</strong> que vienen por defecto para crear el nuestro, podemos crear tantos como sean necesarios.</p>
<pre>
# a2dissite 000-default
Site default disabled.
Run '/etc/init.d/apache2 reload' to activate new configuration!
</pre>
<p>Ahora creamos nuestro sitio empezando por crear la estructura de directorios. Para ello vamos a crear siguiendo la filosofía que vi en SuSE y me gustó.</p>
<pre># mkdir -p /server/midominio.com </pre>
<p>De esta forma, contamos con el directorio <em>/server</em> y de él colgaran todos los servidores virtuales.</p>
<p>Ajustamos los permisos del directorio:</p>
<pre># chown -R webuser.webuser /server</pre>
<p>Configuramos ahora las <em>stanzas</em> para nuestro servidor, para ello creamos un nuevo fichero <em>/etc/apache2/sites-available/misitio</em>.</p>
<pre># vim /etc/apache2/sites-available/midominio.com</pre>
<pre>
NameVirtualHost *:80
&lt;VirtualHost *:80&gt;
        ServerName midominio.com
        ServerAlias www.midominio.com
        ServerAdmin <span class="mh-email"><a href='http://www.google.com/recaptcha/mailhide/d?k=01YKdTHthsc-GjIi7grn-9Jw==&amp;c=mfYAf3BfzwcluoxtKVUc1UArcejzuP11Q_Pcyb5sR74=' onclick="window.open('http://www.google.com/recaptcha/mailhide/d?k=01YKdTHthsc-GjIi7grn-9Jw==&amp;c=mfYAf3BfzwcluoxtKVUc1UArcejzuP11Q_Pcyb5sR74=', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;" title="Click para desvelar.">Email protegido.</a></span>

        DocumentRoot /server/midominio.com/
        &lt;Directory /&gt;
                Options FollowSymLinks
                AllowOverride all
        &lt;/Directory&gt;
        &lt;Directory /server/midominio.com/&gt;
                Options FollowSymLinks Multiviews Indexes
                AllowOverride all
                Order allow,deny
                allow from all
        &lt;/Directory&gt;

        ErrorLog /var/log/apache2/error.midominio.com.log
        LogLevel warn
        CustomLog /var/log/apache2/error.midominio.com.log combined
        ServerSignature Off
&lt;/VirtualHost&gt;
</pre>
<p>Comentamos que permitimos <em>AllowOverride</em> a <em>all</em> para que podamos customizar el sitio a través de <em>.htaccess</em> y no tener que tocar mucho la configuración del servidor. También personalizamos los archivos de logs por si añadimos más servidores distinguir entre ellos.</p>
<p>Habilitamos el sitio.</p>
<pre># a2ensite misitio</pre>
<p>Ya podemos arrancar el servidor.</p>
<pre># apache2ctl graceful</pre>
<p>Ahora ya podemos abrir un navegador web y entrar en el sitio, aunque no tiene contenido, cosa que resolveremos ahora.</p>
<p>En nuestro panel de control habilitamos que tanto <em>midominio.com</em> como <em>www.midominio.com</em> resuelvan a nuestra web, luego podemos usar un truco como <a href="http://www.aquihaydominios.com/blog/forzar-www-usando-htaccess/">este</a> para que por defecto se utilice las uves dobles que es mejor desde el punto de vista SEO.</p>
<h4>Añadir contenido, el servidor FTP</h4>
<p>El usuario no tiene shell, luego no podemos iniciar una sesión en el servidor para crear los archivos html que queramos servir ni copiarlos por ssh, así que desplegamos un servidor FTP, por razones más históricas que otra cosa, uso Proftpd que tiene una configuración modular similar a la de Apache. Tiene soporte de <em>VirtualHost</em> pero la limitación del protocolo hace que no se pueda usar el mismo puerto en todos los servidores, esto es, cada <em>VirtualHost</em> que configures estará asociado a un puerto.</p>
<p>Pasamos a instalarlo.</p>
<pre># apt-get install proftpd</pre>
<p>Lo instalamos como servidor independiente.</p>
<p>La configuración es esta:</p>
<pre>
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes reload proftpd after modifications.

# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6				off
# If set on you can experience a longer connection delay in many cases.
IdentLookups			off

ServerName			"Mi servidor FTP"
ServerType			standalone
DeferWelcome			off

MultilineRFC2228		on
DefaultServer			on
ShowSymlinks			on

TimeoutNoTransfer		600
TimeoutStalled			600
TimeoutIdle			1200

DisplayLogin                    welcome.msg
DisplayChdir               	.message true
ListOptions                	"-l"

DenyFilter			\*.*/

# Use this to jail all users in their homes
# DefaultRoot			~

# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell		off

# Port 21 is the standard FTP port.
Port				0

# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
PassivePorts                  49152 65534

# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
# MasqueradeAddress		1.2.3.4

# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours
&lt;IfModule mod_dynmasq.c&gt;
# DynMasqRefresh 28800
&lt;/IfModule&gt;

# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances			30

# Set the user and group that the server normally runs at.
User				webuser
Group				webuser

# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask				022  022
# Normally, we want files to be overwriteable.
AllowOverwrite			on

# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd		off

# This is required to use both PAM-based authentication and local passwords
# AuthOrder			mod_auth_pam.c* mod_auth_unix.c

# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile			off

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

&lt;IfModule mod_quotatab.c&gt;
QuotaEngine off
&lt;/IfModule&gt;

&lt;IfModule mod_ratio.c&gt;
Ratios off
&lt;/IfModule&gt;

# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&#038;ID=LSS-2004-10-02
# It is on by default.
&lt;IfModule mod_delay.c&gt;
DelayEngine on
&lt;/IfModule&gt;

&lt;IfModule mod_ctrls.c&gt;
ControlsEngine        off
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
&lt;/IfModule&gt;

&lt;IfModule mod_ctrls_admin.c&gt;
AdminControlsEngine off
&lt;/IfModule&gt;

&lt;VirtualHost midominio.com&gt;
        ServerName "midominio.com"
        Port 21
        DefaultRoot /server/midominio
        &lt;Limit LOGIN&gt;
                AllowUser webuser
                AllowGroup webuser
                DenyAll
        &lt;/Limit&gt;
        RequireValidShell off
        AllowOverwrite on
&lt;/VirtualHost&gt;
</pre>
<p>Hemos cambiado el puerto FTP por el 0 para usar el 21 para el <em>VirtualHost</em> e indicamos que el usuario (webuser) no requiere de una shell valida.</p>
<p>Ahora podemos usar un cliente FTP, por ejemplo <a href="http://filezilla-project.org/">Filezilla</a> para subir ficheros al servidor.</p>
<p>Y ya hemos terminado, hemos creado un servidor web desde cero, aun quedan cosas por hacer pero lo básico está cubierto, os invito a seguir navegando por el blog y veáis como configurar <strong>mod_deflate</strong> para servir <a href="http://www.muspells.net/blog/2011/03/optimizando-el-rendimiento-de-apache-con-mod_expires-y-mod_deflate/">contenido comprimido</a>, <strong>mod_evasive</strong> para evitar <a href="http://www.muspells.net/blog/2010/10/evitar-ataques-dos-con-mod_evasive-e-iptables/">ataques DDOS</a>, o <strong>mod_expires</strong> para almacenar contenido estático en la caché del usuario.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2011%2F06%2Fmontar-un-servidor-web%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Montar un Servidor Web. via @nordri" data-url="http://www.muspells.net/blog/2011/06/montar-un-servidor-web/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/06/montar-un-servidor-web/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Alta Disponibilidad con Apache2 y Heartbeat en Debian Squeeze</title>
		<link>http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/</link>
		<comments>http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 19:44:19 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[alta disponibilidad]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[debian squeeze]]></category>
		<category><![CDATA[heartbeat]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=920</guid>
		<description><![CDATA[A raíz de las últimas entradas en rm-rf.es y systemadmin.es quería probar el demonio de alta disponibilidad (heartbeat) sobre Debian, la entrada sobre Apache que publicó el primero me inspiró a hacer lo que contaba sobre la &#8220;distro&#8221; de la espiral. Partimos de la misma configuración, tenemos dos servidores, cluster01 y cluster02 con las IPs [...]]]></description>
			<content:encoded><![CDATA[<p>A raíz de las últimas entradas en <a href="http://rm-rf.es">rm-rf.es</a> y <a href="http://systemadmin.es">systemadmin.es</a> quería probar el demonio de alta disponibilidad (heartbeat) sobre Debian, la entrada sobre Apache que publicó el primero me inspiró a hacer lo que contaba sobre la &#8220;distro&#8221; de la espiral.</p>
<p>Partimos de la misma configuración, tenemos dos servidores, <strong>cluster01</strong> y <strong>cluster02</strong> con las IPs 192.168.2.98 y 192.168.2.99 y una IP flotante 192.168.2.100</p>
<p>Configuradas ambas máquinas, instalamos los paquetes necesarios:</p>
<pre># apt-get install apache2</pre>
<p>En nuestro caso, para la configuración de Apache editamos <em>/etc/apache2/ports.conf</em> y añadimos la IP flotante a la línea de </strong>NameVirtualHost</strong> así:</p>
<pre>NameVirtualHost 192.168.2.100:80</pre>
<p>Para que Apache no se levante al inicio ya que queremos que el que se encargue de esto es Heartbeat escribimos:</p>
<pre># update-rc.d apache2 remove</pre>
<p>Y detenemos el servicio:</p>
<pre># /etc/init.d/apache2 stop</pre>
<p>A continuación instalamos Heartbeat.</p>
<pre># apt-get install heartbeat</pre>
<p>Y configuramos, estos ficheros de configuración se encuentran todos en <em>/etc/ha.d/</em> y disponemos de plantillas para configurarlos en <em>/usr/share/doc/heartbeat/</em>. Podemos tomar ejemplo para configuraciones más específica.</p>
<p>Para el archivo <strong>ha.cf</strong> usamos la misma:</p>
<pre>logfile /var/log/cluster.log
logfacility local0
warntime 5
deadtime 30
initdead 120
keepalive 2
bcast eth0
udpport 694
auto_failback on
node cluster01
node cluster02
</pre>
<p>La explicación</p>
<ul>
<li><strong>logfile</strong> y <strong>logfacility</strong>: Fichero de log y nivel.</li>
<li><strong>warntime</strong>: Heartbeat avisará cuando un nodo falle tras 5 segundos.</li>
<li><strong>deadtime</strong>: Hearbeat confirmará que un nodo ha caído, 30 segundos.</li>
<li><strong>initdead</strong>: Tiempo máximo que Heartbeat esperará a que un nodo arranque, 60 segundos.</li>
<li><strong>keepalive</strong>: Especifica cada cuanto tiempo Heartbeat enviará paquetes para comprobar la disponibilidad de los nodos, 2 segundos.</li>
<li>Las dos últimas líneas son las listas de nodos que conforman el cluster.</li>
</ul>
<p>Para el fichero <strong>authkeys</strong> que es donde configuramos la comunicación entre los nodos del clúster, también para Debian podemos usar la original:</p>
<pre>
auth 2
2 sha1 clu$ter-4uth
</pre>
<p>Le asignamos los permisos para que sólo root tenga acceso.</p>
<pre># chmod 600 /etc/ha.d/authkeys</pre>
<p>El último fichero cambia en Debian y es el <strong>haresources</strong> que queda con este aspecto:</p>
<pre>cluster01 IPaddr2::192.168.2.100/24/eth0 apache2</pre>
<p>Cambia la forma de escribir la IP flotante que está de una forma más completa y el script de inicio de Apache que en Debian es apache2.</p>
<p>Seguimos la entrada y la propagación se hace ejecutando el siguiente comando:</p>
<pre># /usr/share/heartbeat/ha_propagate</pre>
<p>Levantamos el servicio.</p>
<pre>/etc/init.d/heartbeat start</pre>
<p>Ya está todo configurado, podemos probar a desactivar la interface de cluster01 y ver como al poco tiempo (el que hemos configurado) se levanta cluster02 para seguir sirviendo páginas.</p>
<p>La configuración entre CentOS y Debian es prácticamente la misma, pero tiene los suficientes detalles como para que los escriba aquí para no olvidar como se hace.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2011%2F04%2Falta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Alta Disponibilidad con Apache2 y Heartbeat en Debian Squeeze. via @nordri" data-url="http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Añadiendo marcas de agua al vuelo para evitar hotlinking</title>
		<link>http://www.muspells.net/blog/2011/02/anadiendo-marcas-de-agua-al-vuelo-para-evitar-hotlinking/</link>
		<comments>http://www.muspells.net/blog/2011/02/anadiendo-marcas-de-agua-al-vuelo-para-evitar-hotlinking/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 19:37:57 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[hotlinking]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[mod rewrite]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=665</guid>
		<description><![CDATA[A partir de una entrada que aparecía esta mañana en Tu Receta, he pasado el día intentando mejorar el sistema. Ellos proponen que cuando alguien enlace directamente a una foto de tu sitio, cambiar la url mediante mod_rewrite hacía otra imagen para que en el sitio sólo pueda mostrar una imagen con algún mensaje o [...]]]></description>
			<content:encoded><![CDATA[<p>A partir de una entrada que aparecía esta mañana en <a href="http://tureceta.es">Tu Receta</a>, he pasado el día intentando mejorar el sistema. Ellos proponen que cuando alguien enlace directamente a una foto de tu sitio, cambiar la url mediante <em>mod_rewrite</em> hacía otra imagen para que en el sitio sólo pueda mostrar una imagen con algún mensaje o similar, pero no las imágenes originales. Recordé que mi amigo Migue había pasado por eso y lo resolvió, así que empece a investigar para ver cómo podría solucionarlo.</p>
<p><strong>Requerimientos:</strong></p>
<ol>
<li>Tener activado mod_rewrite en nuestro servidor</li>
<li>PHP5-GD para trabajar con imágenes</li>
<li>Una imagen que será la marca de agua</li>
</ol>
<p>Lo primero que hacemos es añadir a nuestro <em>.htaccess</em> las nuevas reglas para <em>mod_rewrite</em> que son las básicamente las mismas que en Tu Receta pero cambiamos la <em>RewriteRule</em> así:</p>
<pre>
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.muspells.net/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.muspells.net$      [NC]
RewriteRule ^(.*)\.(gif|jpg|png)$ image_script.php?image=$1\.$2   [R]
</pre>
<p>Cambiamos la regla de reescritura para que apunte a un script de PHP donde editaremos al vuelo la imagen para devolverla al REFERER con una marca de agua.</p>
<p>Hemos llamado al script <em>image_script</em> y lo hemos colocado en la raíz de documentos,</p>
<pre>
&lt;?php

// En WordPress por ejemplo las imagenes se guardan en directorios,
// necesitamos el PATH completo a la imagen.
$URI = $_GET['image'];
$URI_PARSER = explode ('/', $URI);
$image = "/path/to/DocumentRoot/".$URI_PARSER[count($URI_PARSER) - 1];

switch (TRUE) {
   case stristr($image,'jpg'):
      $photoImage = ImageCreateFromJpeg("$image");
      break;
   case stristr($image,'gif'):
      $photoImage = ImageCreateFromGIF("$image");
      break;
   case stristr($image,'png'):
      $photoImage = ImageCreateFromPNG("$image");
      break;
}

ImageAlphaBlending($photoImage, true); 

// Añadimos aquí el fichero de marca de agua.
$logoImage = ImageCreateFromPNG("watermark.png");
$logoW = ImageSX($logoImage);
$logoH = ImageSY($logoImage); 

// Los 1's representan el margen con el margen superior izquierdo
ImageCopy($photoImage, $logoImage, 1, 1, 0, 0, $logoW, $logoH); 

ImagePNG($photoImage); // output to browser 

ImageDestroy($photoImage);
ImageDestroy($logoImage);
?&gt;
</pre>
<p>El script colocará la imagen <strong>watermark.png</strong> en la esquina superior izquierda.</p>
<p>Cuando accedemos a alguna imagen de nuestro sitio de forma legítima la veremos así:</p>
<div id="attachment_668" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.muspells.net/blog/wp-content/uploads/2011/02/gnu.png"><img src="http://www.muspells.net/blog/wp-content/uploads/2011/02/gnu-300x293.png" alt="gnu" title="gnu" width="300" height="293" class="size-medium wp-image-668" /></a><p class="wp-caption-text">GNU</p></div>
<p>Mientras que si accedemos enlazando directamente la veremos así:
<p>
<a href="http://www.muspells.net/blog/wp-content/uploads/2011/02/gnu.wm_.png"><img src="http://www.muspells.net/blog/wp-content/uploads/2011/02/gnu.wm_-300x293.png" alt="gnu" title="gnu.wm" width="300" height="293" class="aligncenter size-medium wp-image-669" /></a></p>
<p><strong>Fuentes:</strong></p>
<ol>
<li><a href="http://tureceta.es/evitar-hot-linking-con-htaccess/">Tu Receta: Evitar Hot-linking con .htaccess</a></li>
<li><a href="http://www.simplemachines.org/community/index.php?topic=2441.0">El script</a></li>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2011%2F02%2Fanadiendo-marcas-de-agua-al-vuelo-para-evitar-hotlinking%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Añadiendo marcas de agua al vuelo para evitar hotlinking. via @nordri" data-url="http://www.muspells.net/blog/2011/02/anadiendo-marcas-de-agua-al-vuelo-para-evitar-hotlinking/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/02/anadiendo-marcas-de-agua-al-vuelo-para-evitar-hotlinking/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evitar ataques DOS con mod_evasive e iptables</title>
		<link>http://www.muspells.net/blog/2010/10/evitar-ataques-dos-con-mod_evasive-e-iptables/</link>
		<comments>http://www.muspells.net/blog/2010/10/evitar-ataques-dos-con-mod_evasive-e-iptables/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 20:43:35 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[dos]]></category>
		<category><![CDATA[incron]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[mod_evasive]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=610</guid>
		<description><![CDATA[Vamos a explicar como proteger un servidor web Apache contra ataques DOS y DDOS mediante el módulo mod_evasive y el firewall nativo de Linux IPTables. El servidor corre Debian Lenny, y hago incapie en esto porque la configuración de Apache varía mucho según la distribución que estemos utilizando. Ya tenemos el servidor instalado y configurado [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a explicar como proteger un servidor web Apache contra ataques DOS y DDOS mediante el módulo mod_evasive y el firewall nativo de Linux IPTables.</p>
<p>El servidor corre Debian Lenny, y hago incapie en esto porque la configuración de Apache varía mucho según la distribución que estemos utilizando.</p>
<p>Ya tenemos el servidor instalado y configurado y nos interesa protegerlo, para ello instalamos el módulo de Apache mod_evasive:</p>
<pre>apt-get install libapache2-mod-evasive</pre>
<p>También es posible descargar y compilar, pero prefiero siempre en la medida de lo posible, usar paquetes proporcionados por la distribución.</p>
<p>En Debian Lenny, el archivo de configuración de Apache es <em>/etc/apache2/apache2.conf</em> en el podemos escribir la configuración del módulo, o mejor, comprobar que existe la línea</p>
<pre>Include /etc/apache2/mods-enabled/*.conf</pre>
<p>y añadir la configuración del módulo en un fichero nuevo dedicado, por mantener el orden, por ejemplo <em>mod-evasive.conf</em> La configuración que viene por defecto es la siguiente.</p>
<pre>
&lt;IfModule evasive20_module&gt;
  DOSHashTableSize 3097
  DOSPageCount 2
  DOSSiteCount 50
  DOSPageInterval 1
  DOSSiteInterval 1
  DOSBlockingPeriod 300
&lt;/IfModule&gt;
</pre>
<p>Lo primero que debemos observar es el nombre del módulo, es variable según la distribución en la que nos encontremos o si lo hemos compilado nosotros eligiendo otro nombre.</p>
<p>La explicación de cada parámetro la transcribo de <a href="http://www.tail-f.com.ar/servicios/httpd/apache-httpd-servicios/instalar-mod_evasive-en-apache-para-dificultar-ataques-dos.html">tail -f | systemadmin</a></p>
<ul>
<li><strong>DOSHashTableSize</strong> &lt;valor&gt; – Establece el número de nodos a almacenar para cada proceso de peticiones de la tabla hash (contenedor asociativo de recuperación de peticiones por medio de claves que agiliza las respuestas del servidor). Si aplicamos un número alto a este parámetro obtendremos un rendimiento mayor, ya que las iteraciones necesarias para obtener un registro de la tabla son menores. Por contra, y de forma evidente, aumenta el consumo de memoria necesario para el almacenamiento de una tabla mayor. Se hace necesario incrementar este parámetro si el servidor atiende un número abultado de peticiones, aunque puede no servir de nada si la memoria de la máquina es escasa.</li>
<li><strong>DOSPageCount</strong> &lt;valor&gt; – Indica el valor del umbral para el número de peticiones de una misma página (o URI) dentro del intervalo definido en DOSPageInterval. Cuando el valor del parámetro es excedido, la IP del cliente se añade a la lista de bloqueos.</li>
<li> <strong>DOSSiteCount</strong> &lt;valor&gt; – Cuenta cuántas peticiones de cualquier tipo puede hacer un cliente dentro del intervalo definido en DOSSiteInterval. Si se excede dicho valor, el cliente queda añadido a la lista de bloqueos.</li>
<li><strong>DOSPageInterval</strong> &lt;valor&gt; – El intervalo, en segundos, para el umbral de petición de páginas.</li>
<li><strong>DOSSiteInterval</strong> &lt;valor&gt; – El intervalo, en segundos, para el umbral de petición de objetos de cualquier tipo.</li>
<li><strong>DOSBlockingPeriod</strong> &lt;valor&gt; – Establece el tiempo, en segundos, que un cliente queda bloqueado una vez que ha sido añadido a la lista de bloqueos. Como ya se indicó unas líneas atrás, todo cliente bloqueado recibirá una respuesta del tipo 403 (Forbidden) a cualquier petición que realice durante este periodo.</li>
<li><strong>DOSEmailNotify</strong> &lt;e-mail&gt; – Un e-mail será enviado a la dirección especificada cuando una dirección IP quede bloqueada. La configuración del proceso de envío se establece en el fichero mod_evasive.c de la forma /bin/mail -t %s, siendo %s el parámetro que queda configurado en este parámetro. Será necesario cambiar el proceso si usamos un método diferente de envío de e-mails y volver a compilar el módulo con apxs (por ejemplo, la opción t ha quedado obsoleta en las últimas versiones del comando).</li>
<li><strong>DOSSystemCommand</strong> &lt;comando&gt; – El comando reflejado se ejecutará cuando una dirección IP quede bloqueada. Se hace muy útil en llamadas a herramientas de filtrado o firewalls. Usaremos %s para especificar la dirección IP implicada. Por ejemplo, podemos establecer su uso con iptables de la forma siguiente:
<pre>DOSSystemCommand “/sbin/iptables –I INPUT –p tcp –-dport 80 –s %s –j DROP”</pre>
</li>
<li><strong>DOSLogDir</strong> &lt;ruta&gt; – Establece una ruta para el directorio temporal. Por defecto, dicha ruta queda establecida en /tmp, lo cual puede originar algunos agujeros de seguridad si el sistema resulta violado.</li>
<li><strong>DOSWhitelist</strong> &lt;IP&gt; – La dirección IP indicada como valor del parámetro no será tenida en cuenta por el módulo en ningún caso. Para cada dirección IP a excluir ha de añadirse una nueva línea con el parámetro. Por ejemplo, dejaremos fuera del chequeo del módulo a un posible bot que use los siguientes rangos de direcciones:
<pre>
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
</pre>
</li>
</ul>
<p>Para activar el módulo simplemente</p>
<pre># a2enmod mod-evasive</pre>
<p>Como vemos tiene más opciones, la que ahora nos insteresa es la de <em>DOSSystemCommand</em> que es la que permite ejecutar acciones en el sistema.</p>
<p>IPTables es un programa para crear reglas de filtrado de tráfico de red, es un programa que debe ser ejecutado por un usuario con privilegios (root), pero siguiendo la <strong><a href="http://en.wikipedia.org/wiki/Principle_of_least_privilege">Ley del permiso mínimo</a></strong> el servidor corre bajo un usuario no privilegiado, esta medida protege que ante un desbordamiento no quede una sesión privilegiada colgada.</p>
<p>El usuario que corre el servidor web no puede correr IPTables pero no está todo perdido, lo que tenemos que hacer es pasarle un mensaje a root con la IP que tiene que bloquear, y eso hemos visto ya como se puede hacer.</p>
<p>Primero añadimos la siguiente línea a nuestro fichero de configuración del módulo (en <em>apache2.conf</em> o en <em>mod-evasive.conf</em>)</p>
<pre>DOSSystemCommand "/home/$USER/bin/checkIP %s"</pre>
<p>En $USER/bin hemos escrito un script que actualizará un registro de IP que están haciendo más peticiones de la cuenta, el script tiene una pinte así</p>
<pre>
#!/bin/bash
# Este script llevara un fichero de log de los
# intentos de ataques DOS DDOS al servidor

DATE=$(date +%Y-%m-%d-%k-%M-%S);
LOGFILE="/home/$USER/bin/CheckIp.log";

echo $DATE $1 >> $LOGFILE;
</pre>
<p>Simplemente crea un log de IP&#8217;s con este formato:</p>
<pre>
2010-10-31-20-16-41 1.1.1.2
2010-10-31-20-16-41 86.217.15.159
2010-10-31-20-16-41 92.21.26.197
</pre>
<p>Ahora entra en juego root, que se encargará de supervisar este fichero y actuar si cambia, para ello nos apoyamos en incron, creamos una nueva regla de supervisión del sistema de fichero así
<pre>
Abrimos el fichero
# incrontab -e
Editamos el fichero
/home/$USER/bin/CheckIP.log IN_MODIFY /root/bin/banIP
</pre>
<p>El script que hemos escrito <em>banIP</em> se ejecutará cada vez que se modifique el fichero <em>CheckIP.log</em> y pasara la IP a la lista de IPTables,</p>
<pre>
#!/bin/bash
LOGFILE="/home/$USER/bin/CheckIP.log";
IP=$(tail -n 1 $LOGFILE | cut -d" " -f 2);
/sbin/iptables -I INPUT -p tcp --dport 80 -s $IP -j DROP;
</pre>
<p>Para probar si está funcionando podemos ejecutar el script perl que proporciona el paquete mod_evasive, veremos algo como esto:</p>
<pre>
$ perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
Expiró el tiempo de conexión at test.pl line 12.
</pre>
<p>Con el reinicio del servidor se perderan las reglas si no se guardan.</p>
<p>Con esto hemos ganado unos cuantos puntos de seguridad, de por sí, mod_evasive evita exceso de peticiones, al combinarlo con IPTables liberamos a Apache de ese trabajo dejandolo en manos de un programa diseñado para eso.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F10%2Fevitar-ataques-dos-con-mod_evasive-e-iptables%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Evitar ataques DOS con mod_evasive e iptables. via @nordri" data-url="http://www.muspells.net/blog/2010/10/evitar-ataques-dos-con-mod_evasive-e-iptables/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/10/evitar-ataques-dos-con-mod_evasive-e-iptables/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Midiendo La Curiosidad</title>
		<link>http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/</link>
		<comments>http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 19:00:26 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Es personal]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[estadistica]]></category>
		<category><![CDATA[ips]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=448</guid>
		<description><![CDATA[Después de un viaje decidí compartir con los amigos las fotos que hice. Es un archivo pesado y lo colgué del servidor así http://www.muspells.net/unarchivo.tar.gz La gente lo iba descargando, pero quería mirar cuan curiosos eran, como pasé la URL directa del archivo al darle click ya empieza la descarga. Así que me preguntaba cuantos de [...]]]></description>
			<content:encoded><![CDATA[<p>Después de un viaje decidí compartir con los amigos las fotos que hice. Es un archivo pesado y lo colgué del servidor así</p>
<pre>http://www.muspells.net/unarchivo.tar.gz</pre>
<p>La gente lo iba descargando, pero quería mirar cuan curiosos eran, como pasé la URL directa del archivo al darle click ya empieza la descarga. Así que me preguntaba cuantos de ellos borraron <i>unarchivo.tar.gz</i> y entraron a la dirección del sitio.<br />
Para ello, filtre las peticiones al archivo.</p>
<pre># grep unarchivo.tar.gz access.muspells.net.log | cut -d" " -f1 | sort | uniq </pre>
<p>Obteniendo una lista como esta:</p>
<pre>
88.55.66.33
77.5.47.5
...
</pre>
<p>La lista es un ejemplo, obviamente, me salían 29 IP&#8217;s únicas, ahora hay que cruzar los datos con las visitas a páginas legítimas del blog. Así</p>
<pre>IPS=$(grep unarchivo.tar.gz access.muspells.net.log | cut -d" " -f1 | sort | uniq)
for IP in $IPS
do
grep $IP access.muspells.net.log | grep -v unarchivo.tar.gz | cut -d" " -f1 | sort | uniq
done
</pre>
<p>Que nos da una lista con 9 direcciones IPs que son las personas que han descargado el archivo y han visitado alguna otra página.<br />
Esta estadística es chapucera, pero conociendo el tráfico que tiene el servidor y como son mis amigos, es muy fiable. Nos da que el 36% de mis amigos son curiosos en tecnología.<br />
Ahora voy a contar los que van a intentar descargar <i>unarchivo.tar.gz</i> dando el correspondiente 404.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F04%2Fmidiendo-la-curiosidad%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Midiendo La Curiosidad. via @nordri" data-url="http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

