<?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; Linux</title>
	<atom:link href="http://www.muspells.net/blog/category/linux/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>Ejecutar Comandos con un Usuario sin Shell Válida</title>
		<link>http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/</link>
		<comments>http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 08:29:23 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[su]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=1060</guid>
		<description><![CDATA[Si tenemos en el sistema usuarios sin shell válida como por ejemplo los usuarios que acceden por FTP o que lanzan demonios y queremos ejecutar algún comando con ellos como por ejemplo actualizar su tabla de tareas de Cron, podemos hacerlo de la siguiente manera: # su $USER -c comando -s /bin/bash En este caso, [...]]]></description>
			<content:encoded><![CDATA[<p>Si tenemos en el sistema usuarios sin shell válida como por ejemplo los usuarios que acceden por FTP o que lanzan demonios y queremos ejecutar algún comando con ellos como por ejemplo actualizar su tabla de tareas de Cron, podemos hacerlo de la siguiente manera:</p>
<pre># su $USER -c comando -s /bin/bash</pre>
<p>En este caso, ejecutara el comando bajo la shell bash.</p>
<p>Como hemos dicho, para alterar la tabla de Cron hacemos.</p>
<pre># su $USER -c "crontab -e" -s /bin/bash</pre>
<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%2F11%2Fejecutar-comandos-con-un-usuario-sin-shell-valida%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="Ejecutar Comandos con un Usuario sin Shell Válida. via @nordri" data-url="http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear un Demonio en Linux</title>
		<link>http://www.muspells.net/blog/2011/09/crear-un-demonio-en-linux/</link>
		<comments>http://www.muspells.net/blog/2011/09/crear-un-demonio-en-linux/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 17:33:11 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[monitorizacion]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=1056</guid>
		<description><![CDATA[En esta entrada vamos a explicar cómo proceder para escribir un demonio bajo GNU/Linux. Lo primero es definir que se entiende por un demonio, y citamos a la wikipedia: Un demonio, daemon o dæmon (de sus siglas en inglés Disk And Execution MONitor), es un tipo especial de proceso informático no interactivo, es decir, que [...]]]></description>
			<content:encoded><![CDATA[<p>En esta entrada vamos a explicar cómo proceder para escribir un demonio bajo GNU/Linux. Lo primero es definir que se entiende por un demonio, y citamos a la wikipedia:</p>
<blockquote><p>
Un demonio, daemon o dæmon (de sus siglas en inglés Disk And Execution MONitor), es un tipo especial de proceso informático no interactivo, es decir, que se ejecuta en segundo plano en vez de ser controlado directamente por el usuario. Este tipo de programas se ejecutan de forma continua (infinita), vale decir, que aunque se intente cerrar o matar el proceso, este continuará en ejecución o se reiniciará automáticamente. Todo esto sin intervención de terceros y sin dependencia de consola alguna.</p></blockquote>
<p>Un ejemplo de demonio es Apache, permanece en ejecución en segundo plano esperando peticiones de páginas web para ser servidas. O cron que es un demonio temporal, es decir, realiza acciones basadas en el tiempo.</p>
<p>El primer paso que debemos tener en cuenta es qué va a realizar el demonio, Linux basa su programación en que cada programa resuelve un único problema pero lo hace bien. Para ilustrar esta entrada construiremos un demonio que supervise si el demonio Apache está funcionando.</p>
<h4>Requisitos</h4>
<p>Necesitamos un compilador de C, normalmente GCC, y las cabezeras de C para linux, esto en Debian se consigue con:</p>
<pre># apt-get install build-essential</pre>
<p>Necesitaremos también un editor para escribir el código.</p>
<h4>Estructura básica de un demonio</h4>
<p>Durante la ejecución del demonio debemos realizar algunas tareas básicas que se resumen en:</p>
<ul>
<li>Hacer fork del proceso padre.</li>
<li>Cambiar la máscara de fichero.</li>
<li>Abrir los archivos de registros necesarios.</li>
<li>Crear un identificador de sesión único.</li>
<li>Cambiar el directorio de trabajo hacia un sitio más seguro.</li>
<li>Cerrar los descriptores de ficheros estandard.</li>
<li>Escribir el código del demonio propiamente.</li>
</ul>
<h4>El código</h4>
<p>He comentado el código con lo más importante y está bastante autoexplicativo:</p>
<pre>

#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;errno.h&gt;
#include &lt;unistd.h&gt;
#include &lt;syslog.h&gt;
#include &lt;string.h&gt;

int main(void) {

  pid_t pid, sid;
  int apachePIDfile, apachePIDread, apachePID, daemonLogFileDesc;
  char buf[5], filename[255];        

  /* Forkeamos el proceso padre */
  pid = fork();
  if (pid < 0) {
    exit(EXIT_FAILURE);
  }
  /* Cuando tenemos un PID correcto podemos cerrar
   * el proceso padre.
   * Atención al control de errores, es una buena
   * técnica de programación comprobar todas las
   * situaciones donde se pueden dar errores. */
  if (pid > 0) {
    exit(EXIT_SUCCESS);
  }

  /* Cambiamos el modo de la mascara de ficheros */
  /* Hacemos esto para que los fichero generados por el
   * demonio sean accesibles por todo el mundo */
  umask(0);

  /* Abrimos los ficheros de logs del demonio */
  /* Esto es opcional pero como vamos a cerrar los descriptores
   * hacemos esto para que exista algo de comunicación con el demonio */
  daemonLogFileDesc = open ("log", O_WRONLY | O_CREAT, 0600);
  if (daemonLogFileDesc == -1) {
    perror ("Error en la apertura del log");
    exit (EXIT_FAILURE);
  }

  /* Creamos un nuevo SID */
  /* Esto se hace porque al haber matado al padre el hijo puede quedarse
   * en el sistema como un proceso zombie, generando un nuevo SID hacemos
   * que el sistema se haga cargo del proceso huérfano otorgándole un nuevo SID */
  sid = setsid();
  if (sid < 0) {
    perror("new SID failed");
    exit(EXIT_FAILURE);
  }

  /* Por seguridad, cambiamos el directorio de trabajo */
  if ((chdir("/")) < 0) {
    perror("Change the current work directory failed");
    exit(EXIT_FAILURE);
  }

  /* Cerramos los descriptores standard */
  /* El demonio no puede usar la terminal, por lo que estos
   * descriptores son inútiles y un posible riesgo de seguridad.*/
  close(STDIN_FILENO);
  close(STDOUT_FILENO);
  close(STDERR_FILENO);

  /* El código del demonio */
  /* Obtenemos el PID con el que está corriendo el proceso apache */
  apachePIDfile = open("/var/run/apache2.pid", O_RDONLY, 0600);
  if (apachePIDfile == -1) {
    perror("Error en la apertura del fichero");
    exit(EXIT_FAILURE);
  }
  apachePIDread = read (apachePIDfile, buf, sizeof(buf));

  /* El gran bucle! */
  /* El demonio ejecutara este bucle toda su vida,
   * abrirá un archivo del pseudo sistema de ficheros /proc
   * y comprobará que existe, si existe Apache está corriendo y lo escribe
   * en el log, en caso contrario sale. */
  while (1) {
    apachePID = atoi (buf);
    snprintf(filename, sizeof(filename), "/proc/%d/cmdline", apachePID);

    if ((open (filename, O_RDONLY, 0600)) == -1) {
      perror ("No puedo abrir el fichero en proc");
      exit(EXIT_FAILURE);
    } else {
      write (daemonLogFileDesc, "Apache running\n", 15);
      sleep(30); /* espera 30 segundos */
    }
  }
  exit(EXIT_SUCCESS);
}
</pre>
<h4>Compilamos</h4>
<p>Para compilar hacemos lo siguiente:</p>
<pre># cc daemon1.c -o daemon1</pre>
<p>A falta de un nombre más original, he llamado al demonio <strong>daemon1</strong>.</p>
<h4>Ejecución</h4>
<p>Para ejecutarlo hacemos:</p>
<pre># ./daemon1</pre>
<p>Podemos ver que está corriendo tanto en el lista de procesos con <em>ps</em> como mirando el fichero <em>log</em> que hemos creado.</p>
<pre>tailf log
...
Apache running
Apache running
Apache running
...
</pre>
<h4>Referencias</h4>
<p>Es una traducción/adaptación de la guía <a href="http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html" target="_blank">Linux Daemon Writing HOWTO</a>, que es más teórica y aquí he querido dar una aplicación práctica, aunque es obvio que existe demonios de monitorización más avanzado quería marcar bien los conceptos de la construcción de un demonio aplicados a un caso particular.</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%2F09%2Fcrear-un-demonio-en-linux%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="Crear un Demonio en Linux. via @nordri" data-url="http://www.muspells.net/blog/2011/09/crear-un-demonio-en-linux/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/09/crear-un-demonio-en-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enumeración NFS</title>
		<link>http://www.muspells.net/blog/2011/07/enumeracion-nfs/</link>
		<comments>http://www.muspells.net/blog/2011/07/enumeracion-nfs/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 19:07:59 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[2049]]></category>
		<category><![CDATA[hosts.allow]]></category>
		<category><![CDATA[hosts.deny]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[nmap]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=1020</guid>
		<description><![CDATA[Como conseguimos securizar nuestros servidores NFS]]></description>
			<content:encoded><![CDATA[<p>Si tenemos algunos servidores conectados a internet es posible que nos interese compartir entre ellos algunos archivos mediante NFS. El problema viene que al crear el servidor conectado directamente a internet cualquiera puede consultar los directorios compartidos.</p>
<p>Esto es lo que se conoce como <strong><a href="http://books.google.es/books?id=6ggHxvYC-7MC&#038;pg=PA148&#038;lpg=PA148&#038;dq=block+showmount+nfs&#038;source=bl&#038;ots=MRaSlRH2Ca&#038;sig=L_FjmYffROWu0sqzEYU1O25-AhQ&#038;hl=en&#038;ei=PkQtTpuiG5GD-wbqkNTsDQ&#038;sa=X&#038;oi=book_result&#038;ct=result&#038;resnum=1&#038;sqi=2&#038;ved=0CBQQ6AEwAA#v=onepage&#038;q=block%20showmount%20nfs&#038;f=false">enumeración NFS</a></strong> y no hay solución vinculada al protocolo.</p>
<p>La solución que propongo consiste en tener en cada servidor dos interfaces de red, una de ellas la configuraremos como privada, la otra quedará expuesta a internet. Ahora cuando algún usuario no autorizado escanee nuestros puertos verá algo así:</p>
<pre>
# nmap -sS servidor.com

Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-25 20:35 CEST
Nmap scan report for servidor.com (xxx.xxx.xxx.xxx)
Host is up (0.060s latency).
Not shown: 990 closed ports
PORT     STATE    SERVICE
***
2049/tcp open     nfs
***

Nmap done: 1 IP address (1 host up) scanned in 5.92 seconds
</pre>
<p>Mostrando el servidor NFS corriendo y abierto. Así podría crear una enumeración como la que sigue</p>
<pre>
# showmount --all servidor.com
All mount points on servidor.com:
192.168.8.2:/path/to/share
192.168.8.3:/path/to/share
192.168.8.4:/path/to/share
192.168.8.5:/path/to/share
192.168.8.6:/path/to/share
...
</pre>
<p>En el listado vemos las distintas máquinas que están conectadas al servidor y el directorio que tienen montado.</p>
<p>Para resolver esto usaremos los ficheros <em>/etc/hosts.allow</em> y <em>/etc/hosts.deny</em> para evitar conexiones sólo desde máquinas de confianza.</p>
<p>El contenido de <em>/etc/hosts.allow</em> sería:</p>
<pre>
portmap: 192.168.8.0/24
nfsd: 192.168.8.0/24
</pre>
<p>y para el caso de <em>/etc/hosts.deny</em></p>
<pre>
nfsd: ALL
portmap:ALL
</pre>
<p>El software de NMap seguiré mostrando el puerto abierto, pero ahora cuando intenten obtener un listado de lo compartido por NFS obtendrán esto:</p>
<pre>
# showmount --all servidor.com
clnt_create: RPC: Program not registered
</pre>
<p>Desde la red privada podremos seguir consultando las comparticiones con <em>showmount</em>, las opciones que le podemos pasar al comando son:</p>
<pre>
       -a or --all
              List both the client hostname or IP address and mounted directory in host:dir format. This
              info should not be considered reliable. See the notes on rmtab in rpc.mountd(8).

       -d or --directories
              List only the directories mounted by some client.

       -e or --exports
              Show the NFS server's export list.
</pre>
<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%2F07%2Fenumeracion-nfs%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="Enumeración NFS. via @nordri" data-url="http://www.muspells.net/blog/2011/07/enumeracion-nfs/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/07/enumeracion-nfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Cluster de Almacenamiento con GlusterFS 3 y CentOS 5.6</title>
		<link>http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/</link>
		<comments>http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/#comments</comments>
		<pubDate>Sat, 14 May 2011 18:26:26 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[glusterfs]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=962</guid>
		<description><![CDATA[En el artículo de hoy vamos a montar un cluster de almacenamiento con dos servidores CentOS. Para la implementación del cluster vamos a usar GlusterFS, que es un sistema de ficheros en espacio de usuarios (FUSE). Sigue la arquitectura clásica de cliente-servidor y puede escalar hasta varios PetaBytes. Introducción. Para este tutorial vamos a utilizar [...]]]></description>
			<content:encoded><![CDATA[<p>En el artículo de hoy vamos a montar un cluster de almacenamiento con dos servidores <a href="http://centos.org/">CentOS</a>. Para la implementación del cluster vamos a usar <a href="http://www.gluster.org/">GlusterFS</a>, que es un sistema de ficheros en espacio de usuarios (<a href="http://es.wikipedia.org/wiki/FUSE_(Linux)">FUSE</a>). Sigue la arquitectura clásica de cliente-servidor y puede escalar hasta varios <a href="http://es.wikipedia.org/wiki/Petabyte">PetaBytes</a>.</p>
<h4>Introducción.</h4>
<p>Para este tutorial vamos a utilizar dos servidores:</p>
<ul>
<li>server1 192.168.2.100</li>
<li>server2 192.168.2.101</li>
</ul>
<p>Y un cliente:</p>
<ul>
<li>client1 192.168.2.102</li>
</ul>
<p>Todos los componentes deben poder resolver los nombres de los demás, si no se puede por DNS debes editar el fichero <em>/etc/hosts</em>:</p>
<pre>
# /etc/hosts
192.168.2.100   server1
192.168.2.101   server2
192.168.2.102   client1
</pre>
<h4>Configuración de los servidores.</h4>
<p>Antes de empezar con GlusterFS, vamos a preparar el sistema añadiendo las herramientas de desarrollo y librerías. En cada uno de los servidores ejecutamos:</p>
<pre>
# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel
</pre>
<p>Descargamos el software y lo compilamos:</p>
<pre>
# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure
</pre>
<p>Al finalizar deberemos ver esto:</p>
<pre>
GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no
</pre>
<p>Entonces compilamos e instalamos.</p>
<pre># make &#038;&#038; make install</pre>
<p>Enlazamos con las librerías dinámicas.</p>
<pre># ldconfig</pre>
<p>Podemos ahora comprobar que se ha instalado correctamente.</p>
<pre># glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
</pre>
<p>Vamos ahora a crear una estructura de directorio desde el que exportar el volumen. En este tutorial queremos compartir <em>/home</em> por lo que vamos a montar una porción de disco sobre el directorio que exportamos con Gluster para más adelante montar en el cliente en <em>/home</em>.</p>
<p>Creamos los siguientes directorios.</p>
<pre># mkdir -p /data/{exports,export-ns} /etc/glusterfs</pre>
<p>En <em>/etc/glusterfs/glusterfsd.vol</em> añadimos el fichero de configuración para nuestro volumen.</p>
<pre>
volume posix
  type storage/posix
  option directory /data/exports
end-volume

volume locks
  type features/locks
  subvolumes posix
end-volume

volume brick
  type performance/io-threads
  option thread-count 8
  subvolumes locks
end-volume

volume server
  type protocol/server
  option transport-type tcp/server
  option auth.addr.brick.allow 192.168.2.*
  subvolumes brick
end-volume
</pre>
<p>Para aumentar la seguridad, sólo se permiten las direcciones listadas en la línea <em>option auth.addr.brick.allow</em>, admite comodines y varias direcciones separadas por comas. En este ejemplo hemos dado acceso a todo el rango 192.168.2.0/24.</p>
<p>Como hemos compilado sin pasar ninguna opción previa al configure, vamos a crear un enlace simbólico para que el sistema encuentre el binario.</p>
<pre># ln -s /usr/local/sbin/glusterfsd /sbin/glusterfsd</pre>
<p>Ya podemos arrancar el demonio y configurar su nivel de arranque.</p>
<pre>
# chkconfig --levels 35 glusterfsd on
# /etc/init.d/glusterfsd start
Starting glusterfsd:                           [  OK  ]
</pre>
<p>Ahora vamos a añadir una partición en <em>/etc/fstab</em> la cual montaremos en <em>/data/exports</em></p>
<pre># vim /etc/fstab</pre>
<pre>
/dev/sda3     /data/exports     ext3     defaults     0 0
</pre>
<p>En cada servidor se hace esto, es lo que ofreceremos a los clientes a través de Gluster.</p>
<h4>Configuración de los clientes.</h4>
<p>Pasamos ahora a la configuración de los clientes, empezamos instalando las dependencias de compilación y librerías para acabar montando el volumen Gluster en <em>/home</em>. Estos pasos hay que hacerlos en cada cliente.</p>
<pre>
# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel
</pre>
<p>Ahora cargamos el módulo <em>fuse</em> que se encargará de hacer de interface con el Kernel.</p>
<pre># modprobe fuse</pre>
<p>Configuramos el sistema para que cargue el módulo con cada arranque.</p>
<pre>
# echo "modprobe fuse" >> /etc/rc.modules
# chmod +x /etc/rc.modules
</pre>
<p>En cada cliente descargamos e instalamos el software. Tal y como hemos hecho antes.</p>
<pre>
# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure
</pre>
<p>Al finalizar deberemos ver esto:</p>
<pre>
GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no
</pre>
<p>Entonces compilamos e instalamos.</p>
<pre># make &#038;&#038; make install</pre>
<p>Enlazamos con las librerías dinámicas.</p>
<pre># ldconfig</pre>
<p>Podemos ahora comprobar que se ha instalado correctamente.</p>
<pre># glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
</pre>
<p>Creamos el directorio de configuración de GlusterFS.</p>
<pre># mkdir /etc/glusterfs</pre>
<p>Añadimos lo siguiente al fichero <em>glusterfs.vol</em></p>
<pre>vim /etc/glusterfs/glusterfs.vol</pre>
<pre>

volume remote1
  type protocol/client
  option transport-type tcp/client
  option remote-host server1
  option remote-subvolume brick
end-volume

volume remote2
  type protocol/client
  option transport-type tcp/client
  option remote-host server2
  option remote-subvolume brick
end-volume

volume stripe
  type cluster/stripe
  option block-size 1MB
  subvolumes remote1 remote2
end-volume

volume writebehind
  type performance/write-behind
  option window-size 1MB
  subvolumes stripe
end-volume

volume cache
  type performance/io-cache
  option cache-size 512MB
  subvolumes writebehind
end-volume
</pre>
<p>Y ya podemos montar el volumen en <em>/home</em>:</p>
<pre> # glusterfs -f /etc/glusterfs/glusterfs.vol /home</pre>
<p>Podemos consultar que está montado ejecutando <em>mount</em>:</p>
<pre>
# mount

glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)
</pre>
<p>También ver el espacio disponible con <em>df</em>:</p>
<pre>
# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
glusterfs#/etc/glusterfs/glusterfs.vol
              fuse    6,5G  143M  6,1G   3% /home
</pre>
<p>Para hacer el montaje permanente, añadimos la siguiente línea a <em>/etc/fstab</em></p>
<pre>/etc/glusterfs/glusterfs.vol  /home             glusterfs          defaults,_netdev  0  0</pre>
<h4>Fallos.</h4>
<p>Si has llegado hasta aquí significa que todo ha ido bien, si has encontrado algún problema los ficheros de <em>logs</em> de Gluster se encuentra en:</p>
<pre>/usr/local/var/log/glusterfs/</pre>
<p>Revisa que todas las máquinas resuelven los nombres, que la línea <em>auth.addr.brick.allow</em> está bien configurada y que has escrito correctamente los nombres de los directorios. Estos son problemas comunes.</p>
<p>Por ejemplo, si algún cliente no está autorizado a montar el volumen, pasará esto:</p>
<pre># glusterfs -f /etc/glusterfs/glusterfs.vol /home
# mount 

/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)

# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
/dev/sda3     ext3    6,5G  143M  6,1G   3% /data/exports
df: «/home»: Argumento inválido
</pre>
<p>Vemos que se ha producido un error que no es muy descriptivo del problema real que está ocurriendo ya que sí ha montado el volumen.</p>
<h4>Conclusión.</h4>
<p>Este sistema proporciona escalabilidad y tolerancia. El echo de exportar un directorio nos permite montar en ese directorio el disco físico un volumen LVM, un RAID, combinaciones de ambos, sistemas NAS o DAS y así montar nuestro propio DropBox! <img src='http://www.muspells.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </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%2F05%2Fcluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6%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="Cluster de Almacenamiento con GlusterFS 3 y CentOS 5.6. via @nordri" data-url="http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

