<?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>systemadmin.es</title>
	<atom:link href="http://systemadmin.es/feed" rel="self" type="application/rss+xml" />
	<link>http://systemadmin.es</link>
	<description>Tu referencia para la administración de sistemas</description>
	<lastBuildDate>Fri, 03 Feb 2012 06:51:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Ofuscación con ROT13</title>
		<link>http://systemadmin.es/2012/02/ofuscacion-con-rot13</link>
		<comments>http://systemadmin.es/2012/02/ofuscacion-con-rot13#comments</comments>
		<pubDate>Fri, 03 Feb 2012 06:45:07 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3705</guid>
		<description><![CDATA[Resulta bastante común que se use ROT13 para ofuscar ciertas partes de código y evitar así que se entienda lo que esta haciendo esa parte de código. Vamos a ver como codificar-lo y des codificarlo. Mediante tr podemos pasar del alfabeto normal al alfabeto rotado: echo "tmhapbzcerff" &#124; tr a-z n-za-m gzuncompress En el caso [...]]]></description>
			<content:encoded><![CDATA[<p>Resulta bastante común que se use <a href="http://en.wikipedia.org/wiki/ROT13">ROT13</a> para ofuscar ciertas partes de código y evitar así que se entienda lo que esta haciendo esa parte de código. Vamos a ver como codificar-lo y des codificarlo.</p>
<div id="attachment_3734" class="wp-caption aligncenter" style="width: 310px"><a href="http://systemadmin.es/wp-content/uploads/2012/02/codigo-ofuscado-con-ROT13.jpg"><img src="http://systemadmin.es/wp-content/uploads/2012/02/codigo-ofuscado-con-ROT13-300x29.jpg" alt="Ejemplo de código ofuscado con ROT13" title="Ejemplo de código ofuscado con ROT13" width="300" height="29" class="size-medium wp-image-3734" /></a><p class="wp-caption-text">Ejemplo de código ofuscado con ROT13</p></div>
<p><!-- more --></p>
<p>Mediante <a href="/2009/12/convertir-un-texto-de-mayusculas-a-minusculas-con-el-comando-tr">tr</a> podemos pasar <strong>del alfabeto normal al alfabeto rotado</strong>:</p>
<pre>
echo "tmhapbzcerff" | tr a-z n-za-m
gzuncompress
</pre>
<p>En el caso que tengamos que aplicarlo a un fichero lo podemos hacer mediante la <strong>opción !</strong> del <strong>vi</strong> para ejecutar comandos externos:</p>
<pre>
:%!tr a-z n-za-m
</pre>
<p>En el caso de <strong>PHP</strong> existe la <strong>función str_rot13()</strong> para hacerlo directamente:</p>
<pre>
$ php -r 'echo str_rot13('hola');'
ubyn
</pre>

	Tags: <a href="http://systemadmin.es/tag/php" title="PHP" rel="tag">PHP</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2009/01/seguridad-en-php-deshabilitar-funciones" onclick="pageTracker._trackEvent('relacionados','1302');" title="Seguridad en PHP: deshabilitar funciones (25/January/2009)">Seguridad en PHP: deshabilitar funciones</a></li>
	<li><a href="http://systemadmin.es/2009/05/php-configure-error-utf8_mime2text-has-new-signature-but-u8t_canonical-is-missing" onclick="pageTracker._trackEvent('relacionados','1705');" title="PHP: configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing (14/May/2009)">PHP: configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing</a></li>
	<li><a href="http://systemadmin.es/2011/08/ofuscacion-de-puertos-mediante-overflow-de-shorts" onclick="pageTracker._trackEvent('relacionados','3508');" title="Ofuscación de puertos mediante overflow de shorts (29/August/2011)">Ofuscación de puertos mediante overflow de shorts</a></li>
	<li><a href="http://systemadmin.es/2010/01/intrusion-mediante-php-shell" onclick="pageTracker._trackEvent('relacionados','2222');" title="Intrusión mediante PHP Shell (26/January/2010)">Intrusión mediante PHP Shell</a></li>
	<li><a href="http://systemadmin.es/2011/02/instalar-nginx-con-php-5-3-mediante-php-fpm-y-eaccelerator" onclick="pageTracker._trackEvent('relacionados','3247');" title="Instalar nginx con php 5.3 mediante php-fpm y eAccelerator (23/February/2011)">Instalar nginx con php 5.3 mediante php-fpm y eAccelerator</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/02/ofuscacion-con-rot13/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Definir una ruta para los clientes con OpenVPN</title>
		<link>http://systemadmin.es/2012/02/definir-una-ruta-para-los-clientes-con-openvpn</link>
		<comments>http://systemadmin.es/2012/02/definir-una-ruta-para-los-clientes-con-openvpn#comments</comments>
		<pubDate>Thu, 02 Feb 2012 06:52:40 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Redes]]></category>
		<category><![CDATA[OpenVPN]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3285</guid>
		<description><![CDATA[Mediante OpenVPN podemos conectar redes privadas a través de redes públicas. En la configuración más sencilla sencilla simplemente queremos conectar dos puntos de forma segura usando un cierto direccionamiento privado. Si estos dos puntos se trata de equipos que hacen rutado IP podemos publicar rutas para forzar cierto tráfico que pase por la VPN. Para [...]]]></description>
			<content:encoded><![CDATA[<p>Mediante <strong>OpenVPN</strong> podemos conectar redes privadas a través de redes públicas. En la configuración más sencilla sencilla simplemente queremos <strong>conectar dos puntos de forma segura</strong> usando un cierto direccionamiento privado. Si estos dos puntos se trata de equipos que hacen rutado IP podemos <strong>publicar rutas</strong> para forzar cierto tráfico que pase por la VPN.</p>
<p><!-- more --></p>
<p>Para ello deberemos indicar al <strong>fichero de configuración de OpenVPN</strong> (normalmente <strong>openvpn.conf</strong>) que deseamos mandar una ruta a los clientes que se conecten mediante la opción <strong>push</strong>.</p>
<p>Con la opción <strong>route</strong> indicaríamos la ruta que queremos definir a través de nuestro túnel mediante IP y máscara. Por ejemplo para una única IP (por ejemplo, la 192.168.1.7) haríamos:</p>
<pre>
push "route 192.168.1.7 255.255.255.255"
</pre>
<p>O para una <strong>red /24</strong> entera:</p>
<pre>
push "route 192.168.1.7 255.255.255.0"
</pre>
<p>En el caso que el cliente no haga rutado simplemente afectaremos las decisiones de rutado de ese equipo.</p>

	Tags: <a href="http://systemadmin.es/tag/openvpn" title="OpenVPN" rel="tag">OpenVPN</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2009/02/usar-chroot-en-openvpn" onclick="pageTracker._trackEvent('relacionados','1476');" title="Usar chroot en OpenVPN (5/February/2009)">Usar chroot en OpenVPN</a></li>
	<li><a href="http://systemadmin.es/2008/12/securidad-en-redes-wireless-mediante-openvpn-ii" onclick="pageTracker._trackEvent('relacionados','704');" title="Seguridad en redes wireless mediante OpenVPN (II) (2/December/2008)">Seguridad en redes wireless mediante OpenVPN (II)</a></li>
	<li><a href="http://systemadmin.es/2008/11/securidad-en-redes-wireless-mediante-openvpn-i" onclick="pageTracker._trackEvent('relacionados','455');" title="Seguridad en redes wireless mediante OpenVPN (I) (11/November/2008)">Seguridad en redes wireless mediante OpenVPN (I)</a></li>
	<li><a href="http://systemadmin.es/2010/11/instalar-un-cliente-openvpn-en-windows" onclick="pageTracker._trackEvent('relacionados','3014');" title="Instalar un cliente OpenVPN en Windows (29/November/2010)">Instalar un cliente OpenVPN en Windows</a></li>
	<li><a href="http://systemadmin.es/2010/10/instalar-un-cliente-openvpn-en-linux" onclick="pageTracker._trackEvent('relacionados','2880');" title="Instalar un cliente OpenVPN en Linux (15/October/2010)">Instalar un cliente OpenVPN en Linux</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/02/definir-una-ruta-para-los-clientes-con-openvpn/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creación de un disco en memória con tmpfs</title>
		<link>http://systemadmin.es/2012/02/creacion-de-un-disco-en-memoria-con-tmpfs</link>
		<comments>http://systemadmin.es/2012/02/creacion-de-un-disco-en-memoria-con-tmpfs#comments</comments>
		<pubDate>Wed, 01 Feb 2012 07:13:07 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Sistema de ficheros]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3733</guid>
		<description><![CDATA[Mediante el sistema de ficheros tmpfs podemos un sistema de ficheros en memoria. Para montar el sistema de fichero tmpfs deberemos indicar el tamaño mediante la opción size: mount -t tmpfs -o size=100M tmpfs /tmp2 A continuación ya lo tendremos disponible para su uso: df -hP Filesystem Size Used Avail Use% Mounted on (...) tmpfs [...]]]></description>
			<content:encoded><![CDATA[<p>Mediante el sistema de ficheros <strong>tmpfs</strong> podemos un sistema de ficheros en memoria.</p>
<p><!-- more --></p>
<p>Para montar el sistema de fichero <strong>tmpfs</strong> deberemos indicar el tamaño mediante la <strong>opción size</strong>:</p>
<pre>
mount -t tmpfs -o size=100M tmpfs /tmp2
</pre>
<p>A continuación ya lo tendremos disponible para su uso:</p>
<pre>
df -hP
Filesystem            Size  Used Avail Use% Mounted on
(...)
tmpfs                 100M     0  100M   0% /tmpshared
</pre>
<p>Evidentemente, al ser un <strong>disco en memoria</strong> si lo desmontamos (o reiniciamos el equipo) perderemos los datos:</p>
<pre>
# mount -t tmpfs -o size=100M tmpfs /mnt/tmp/
# touch /mnt/tmp/aaa
# ls -l /mnt/tmp/
total 0
-rw-r--r-- 1 root root 0 Jan 31 21:06 aaa
# umount /mnt/tmp/
# mount -t tmpfs -o size=100M tmpfs /mnt/tmp/
# ls -l /mnt/tmp/
total 0
</pre>
Post sin tags
	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li>No hay posts relacionados.</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/02/creacion-de-un-disco-en-memoria-con-tmpfs/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Local root con las versiones 1.8.0-1.8.3p1 de sudo</title>
		<link>http://systemadmin.es/2012/01/local-root-con-las-versiones-1-8-0-1-8-3p1-de-sudo</link>
		<comments>http://systemadmin.es/2012/01/local-root-con-las-versiones-1-8-0-1-8-3p1-de-sudo#comments</comments>
		<pubDate>Tue, 31 Jan 2012 07:35:53 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[sudo]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3732</guid>
		<description><![CDATA[Ayer a través de un tweet de RoMaNSoFt me enteré de un &#8220;bug de libro&#8221; en sudo. En el advisory nos indican la siguiente de función: void sudo_debug(int level, const char *fmt, ...) { va_list ap; char *fmt2; if (level > debug_level) return; /* Backet fmt with program name and a newline to make it [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer a través de un <a href="https://twitter.com/#!/roman_soft/status/164052041205952512">tweet de RoMaNSoFt</a> me enteré de un &#8220;<strong>bug de libro</strong>&#8221; en <strong>sudo</strong>.</p>
<p><!-- more --></p>
<p>En el <strong>advisory</strong> nos indican la siguiente de función:</p>
<pre>
void
sudo_debug(int level, const char *fmt, ...)
{
    va_list ap;
    char *fmt2;

    if (level > debug_level)
        return;

    /* Backet fmt with program name and a newline to make it a single
    write */
    easprintf(&#038;fmt2, "%s: %s\n", getprogname(), fmt);
    va_start(ap, fmt);
    vfprintf(stderr, fmt2, ap);
    va_end(ap);
    efree(fmt2);
}
</pre>
<p>Por partes, en la función:</p>
<pre>
easprintf(&#038;fmt2, "%s: %s\n", getprogname(), fmt);
</pre>
<p>Se pasa <strong>getprogname()</strong>, que se trata de <strong>argv[0]</strong> al buffer temporal <strong>fmt2</strong> y luego se pasa a la función <strong>vfprintf</strong> directamente:</p>
<pre>
vfprintf(stderr, fmt2, ap);
</pre>
<p>Por lo que el <strong>vfprintf</strong> acaba siendo controlado por el usuario que puede modificar una posiciones de memoria con <strong>%n</strong> (un <a href="http://en.wikipedia.org/wiki/Format_string_attack">format string attack</a>). Podemos ver cómo se explotan en los <a href="/2010/06/wargame-narnia-nivel-6">niveles 6</a> y <a href="/2010/06/wargame-narnia-nivel-6">8 del wargame narnia</a>.</p>
<p>En el caso se <strong>sudo</strong>, al ser un binario con el <strong>setuid bit</strong> podemos <strong>conseguir root</strong> explotando dicha vulnerabilidad.</p>
<p>Al ser bastante evidente es normal que en el <strong>advisory</strong> diga que el programador estaba <strong>avergonzado</strong>:</p>
<pre>
2012-01-24 Send vulnerability details to sudo maintainer
2012-01-24 Maintainer is embarrased
</pre>
<p>En el caso de <strong>CentOS/RHEL</strong> estamos libres de este fallo ya que se usan versiones anteriores:</p>
<ul>
<li><strong>CentOS 5</strong>: 1.7.2</li>
<li><strong>CentOS 6</strong>: 1.7.4</li>
</ul>

	Tags: <a href="http://systemadmin.es/tag/sudo" title="sudo" rel="tag">sudo</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2012/01/sudo-auth-could-not-identify-password-for" onclick="pageTracker._trackEvent('relacionados','3722');" title="sudo: auth could not identify password for (27/January/2012)">sudo: auth could not identify password for</a></li>
	<li><a href="http://systemadmin.es/2010/12/sudo-te-insulta-si-te-equivocas-de-contrasena" onclick="pageTracker._trackEvent('relacionados','3095');" title="sudo te insulta si te equivocas de contraseña (22/December/2010)">sudo te insulta si te equivocas de contraseña</a></li>
	<li><a href="http://systemadmin.es/2010/06/evitando-el-paso-a-una-shell-con-sudo" onclick="pageTracker._trackEvent('relacionados','2669');" title="Evitando el paso a una shell con sudo (21/June/2010)">Evitando el paso a una shell con sudo</a></li>
	<li><a href="http://systemadmin.es/2008/10/editando-el-fichero-etcsudoers-para-el-comando-sudo" onclick="pageTracker._trackEvent('relacionados','85');" title="Editando el fichero /etc/sudoers para delegar operaciones mediante el comando sudo (16/October/2008)">Editando el fichero /etc/sudoers para delegar operaciones mediante el comando sudo</a></li>
	<li><a href="http://systemadmin.es/2008/12/como-ejecutar-comandos-como-root-sin-password" onclick="pageTracker._trackEvent('relacionados','824');" title="Como ejecutar comandos como root sin password (8/December/2008)">Como ejecutar comandos como root sin password</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/local-root-con-las-versiones-1-8-0-1-8-3p1-de-sudo/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Añadir opciones a tomcat</title>
		<link>http://systemadmin.es/2012/01/anadir-opciones-a-tomcat</link>
		<comments>http://systemadmin.es/2012/01/anadir-opciones-a-tomcat#comments</comments>
		<pubDate>Mon, 30 Jan 2012 08:40:15 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[LAMP y web]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3729</guid>
		<description><![CDATA[Para añadir opciones adicionales al tomcat lo podemos hacer de varias formas quizá la forma más limpia es usando setenv.sh Dentro del CATALINA_BASE/bin y el CATALINA_HOME/bin podemos crear un fichero que se llame setenv.sh que se ejecutará desde el catalina.sh: if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then . "$CATALINA_BASE/bin/setenv.sh" elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then . [...]]]></description>
			<content:encoded><![CDATA[<p>Para añadir opciones adicionales al tomcat lo podemos hacer de varias formas quizá la forma más limpia es usando <strong>setenv.sh</strong></p>
<p><!-- more --></p>
<p>Dentro del <strong>CATALINA_BASE/bin</strong> y el <strong>CATALINA_HOME/bin</strong> podemos crear un fichero que se llame <strong>setenv.sh</strong> que se ejecutará desde el <strong>catalina.sh</strong>:</p>
<pre>
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi
</pre>
<p>Tal y como podemos apreciar, si tenemos en el <strong>CATALINA_BASE</strong> un <strong>setenv.sh</strong> no se ejecuta el del <strong>CATALINA_HOME</strong> (que se supone más genérico). Dicho fichero puede ser cualquier ejecutable, por ejemplo:</p>
<pre>
#!/bin/bash

export JAVA_OPTS="$JAVA_OPTS -Dcatalina.base=$CATALINA_BASE -Xms256M -Xmx2048M -XX:MaxPermSize=128m -server -XX:+UseConcMarkSweepGC"
</pre>

	Tags: <a href="http://systemadmin.es/tag/tomcat" title="Tomcat" rel="tag">Tomcat</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2012/01/instalacion-de-un-certificado-ssl-en-tomcat-keystore" onclick="pageTracker._trackEvent('relacionados','3717');" title="Instalación de un certificado SSL en tomcat (keystore) (17/January/2012)">Instalación de un certificado SSL en tomcat (keystore)</a></li>
	<li><a href="http://systemadmin.es/2011/05/instalacion-de-tomcat-7-en-linux" onclick="pageTracker._trackEvent('relacionados','3378');" title="Instalación de tomcat 7 en Linux (5/May/2011)">Instalación de tomcat 7 en Linux</a></li>
	<li><a href="http://systemadmin.es/2009/11/info-the-apr-based-apache-tomcat-native-library-which-allows-optimal-performance-in-production-environments-was-not-found-on-the-javalibrarypath" onclick="pageTracker._trackEvent('relacionados','2076');" title="INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path (27/November/2009)">INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path</a></li>
	<li><a href="http://systemadmin.es/2012/01/conector-mod_jk-para-apachetomcat" onclick="pageTracker._trackEvent('relacionados','3718');" title="Conector mod_jk para Apache/Tomcat (20/January/2012)">Conector mod_jk para Apache/Tomcat</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/anadir-opciones-a-tomcat/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sudo: auth could not identify password for</title>
		<link>http://systemadmin.es/2012/01/sudo-auth-could-not-identify-password-for</link>
		<comments>http://systemadmin.es/2012/01/sudo-auth-could-not-identify-password-for#comments</comments>
		<pubDate>Fri, 27 Jan 2012 06:39:40 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[sudo]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3722</guid>
		<description><![CDATA[Resulta rutinario añadir un comando en concreto al sudo para poder ejecuitarlo con los permisos de otro usuario, pero si nos despistamos nos podemos volver locos con el siguiente error: Jan 20 16:26:56 picamoixons sudo: pam_unix(sudo:auth): conversation failed Jan 20 16:26:56 picamoixons sudo: pam_unix(sudo:auth): auth could not identify password for [test] La línea en el [...]]]></description>
			<content:encoded><![CDATA[<p>Resulta rutinario <a href="/2008/10/editando-el-fichero-etcsudoers-para-el-comando-sudo">añadir un comando en concreto al sudo para poder ejecuitarlo con los permisos de otro usuario</a>, pero si nos despistamos <strong>nos podemos volver locos</strong> con el siguiente error:</p>
<pre>
Jan 20 16:26:56 picamoixons sudo: pam_unix(sudo:auth): conversation failed
Jan 20 16:26:56 picamoixons sudo: pam_unix(sudo:auth): auth could not identify password for [test]
</pre>
<p><!-- more --></p>
<p>La línea en el <strong>sudoers</strong> era:</p>
<pre>
test ALL =(ALL) NOPASSWD: /usr/local/bin/restart_tomcat
</pre>
<p>El error resulta poco claro y hace pensar que el usuario este mal creado o que exista algún problema con la autenticación (los modulos pam o el fichero de <a href="/2010/08/formato-del-fichero-etcpasswd">passwd</a> o <a href="/2010/08/formato-del-fichero-etcshadow">shadow</a>.</p>
<p>En realidad simplemente el comando a ejecutar <strong>no tenia permisos de ejecución</strong>, por lo que simplemente con añadir los permisos se soluciona el problema:</p>
<pre>
chmod +x /usr/local/bin/restart_tomcat
</pre>

	Tags: <a href="http://systemadmin.es/tag/sudo" title="sudo" rel="tag">sudo</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/12/sudo-te-insulta-si-te-equivocas-de-contrasena" onclick="pageTracker._trackEvent('relacionados','3095');" title="sudo te insulta si te equivocas de contraseña (22/December/2010)">sudo te insulta si te equivocas de contraseña</a></li>
	<li><a href="http://systemadmin.es/2012/01/local-root-con-las-versiones-1-8-0-1-8-3p1-de-sudo" onclick="pageTracker._trackEvent('relacionados','3732');" title="Local root con las versiones 1.8.0-1.8.3p1 de sudo (31/January/2012)">Local root con las versiones 1.8.0-1.8.3p1 de sudo</a></li>
	<li><a href="http://systemadmin.es/2010/06/evitando-el-paso-a-una-shell-con-sudo" onclick="pageTracker._trackEvent('relacionados','2669');" title="Evitando el paso a una shell con sudo (21/June/2010)">Evitando el paso a una shell con sudo</a></li>
	<li><a href="http://systemadmin.es/2008/10/editando-el-fichero-etcsudoers-para-el-comando-sudo" onclick="pageTracker._trackEvent('relacionados','85');" title="Editando el fichero /etc/sudoers para delegar operaciones mediante el comando sudo (16/October/2008)">Editando el fichero /etc/sudoers para delegar operaciones mediante el comando sudo</a></li>
	<li><a href="http://systemadmin.es/2008/12/como-ejecutar-comandos-como-root-sin-password" onclick="pageTracker._trackEvent('relacionados','824');" title="Como ejecutar comandos como root sin password (8/December/2008)">Como ejecutar comandos como root sin password</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/sudo-auth-could-not-identify-password-for/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generar un certificado autofirmado con openssl</title>
		<link>http://systemadmin.es/2012/01/generar-un-certificado-autofirmado-con-openssl</link>
		<comments>http://systemadmin.es/2012/01/generar-un-certificado-autofirmado-con-openssl#comments</comments>
		<pubDate>Thu, 26 Jan 2012 08:32:12 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[openSSL]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3725</guid>
		<description><![CDATA[Anteriormente ya vimos cómo generar una petición de firmado de una clave (CSR), en el caso que sea un certificado de prueba no tenemos porque pasar por una entidad certificadora sino que nos lo podemos firmar nosotros mismos con la misma clave privada. Suponiendo que tenemos los siguientes ficheros: Petición de firmado, generada también con [...]]]></description>
			<content:encoded><![CDATA[<p>Anteriormente ya vimos <a href="/2012/01/generar-un-fichero-csr-peticion-de-firmado">cómo generar una petición de firmado de una clave (CSR)</a>, en el caso que sea un certificado de prueba no tenemos porque pasar por una entidad certificadora sino que nos lo podemos firmar nosotros mismos con la misma clave privada.</p>
<p><!-- more --></p>
<p>Suponiendo que tenemos los siguientes ficheros:</p>
<ul>
<li><a href="/2012/01/generar-un-fichero-csr-peticion-de-firmado">Petición de firmado</a>, generada también con OpenSSL: <strong>cert.csr</strong>
<li>Clave privada: <strong>privkey.pem</strong></li>
</ul>
<p>A continuación mediante <strong>openssl</strong> podemos generar el certificado autofirmado indicando el número de días que será válido con <strong>-days</strong>:</p>
<pre>
$ openssl x509 -req -days 10000 -in cert.csr -signkey privkey.pem -out cert.crt
Signature ok
subject=/C=ES/ST=Barcelona/L=Barcelona/O=systemadmin.es/CN=systemadmin.es
Getting Private key
</pre>
<p>El <strong>certificado autofirmado</strong> generado se encuentra en el fichero <strong>cert.crt</strong> que ya podremos usar para instalarlo, por ejemplo en <a href="/2012/01/instalacion-de-un-certificado-ssl-en-tomcat-keystore">tomcat</a> o bien en <a href="/2012/01/instalacion-de-certificado-ssl-de-servidor-en-nginx">nginx</a>.</p>
<p>Al ser autofirmado al acceder con el navegador nos dará un error conforme no se confía en la autoridad certificadora (nosotros mismos):</p>
<div id="attachment_3726" class="wp-caption aligncenter" style="width: 310px"><a href="http://systemadmin.es/wp-content/uploads/2012/01/error-autofirmado.jpg"><img src="http://systemadmin.es/wp-content/uploads/2012/01/error-autofirmado-300x300.jpg" alt="Error Firefox certificado autofirmado" title="Error Firefox certificado autofirmado" width="300" height="300" class="size-medium wp-image-3726" /></a><p class="wp-caption-text">Error Firefox certificado autofirmado</p></div>
<p>Si miramos los detalles del certificado podemos ver como el certificado esta firmado por el emisor:</p>
<div id="attachment_3727" class="wp-caption aligncenter" style="width: 254px"><a href="http://systemadmin.es/wp-content/uploads/2012/01/certificado-autofirmado.jpg"><img src="http://systemadmin.es/wp-content/uploads/2012/01/certificado-autofirmado-244x300.jpg" alt="Certificado autofirmado" title="Certificado autofirmado" width="244" height="300" class="size-medium wp-image-3727" /></a><p class="wp-caption-text">Certificado autofirmado</p></div>

	Tags: <a href="http://systemadmin.es/tag/openssl" title="openSSL" rel="tag">openSSL</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2012/01/instalacion-de-un-certificado-ssl-en-tomcat-keystore" onclick="pageTracker._trackEvent('relacionados','3717');" title="Instalación de un certificado SSL en tomcat (keystore) (17/January/2012)">Instalación de un certificado SSL en tomcat (keystore)</a></li>
	<li><a href="http://systemadmin.es/2012/01/instalacion-de-certificado-ssl-de-servidor-en-nginx" onclick="pageTracker._trackEvent('relacionados','3715');" title="Instalación de certificado SSL de servidor en nginx (16/January/2012)">Instalación de certificado SSL de servidor en nginx</a></li>
	<li><a href="http://systemadmin.es/2012/01/generar-un-fichero-csr-peticion-de-firmado" onclick="pageTracker._trackEvent('relacionados','3710');" title="Generar un fichero CSR (petición de firmado) (13/January/2012)">Generar un fichero CSR (petición de firmado)</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/generar-un-certificado-autofirmado-con-openssl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los plugins de Nessus y su forma de hacer las cosas</title>
		<link>http://systemadmin.es/2012/01/los-plugins-de-nessus-y-su-forma-de-hacer-las-cosas</link>
		<comments>http://systemadmin.es/2012/01/los-plugins-de-nessus-y-su-forma-de-hacer-las-cosas#comments</comments>
		<pubDate>Wed, 25 Jan 2012 06:49:42 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Nessus]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3634</guid>
		<description><![CDATA[Escaneando la red en busca de vulnerabilidades con Nessus (con OpenVAS es el mismo caso) me di cuenta que ciertos bugs que sabía que debían estar presentes no aparecían. Así que me miré lo que hacen los plugins. Dentro del directorio que hayamos instalado nessus podemos encontrar los plugins (/opt/nessus/lib/nessus/plugins) con extensión nasl que son [...]]]></description>
			<content:encoded><![CDATA[<p>Escaneando la red en <a href="/2011/03/nessus-escaner-de-vulnerabilidades">busca de vulnerabilidades con Nessus</a> (con <a href="/2011/03/openvas-en-centos-5-5-escaner-de-vulnerabilidades">OpenVAS</a> es el mismo caso) me di cuenta que <strong>ciertos bugs</strong> que sabía que debían estar presentes no aparecían. Así que me miré lo que hacen los plugins.</p>
<p><!-- more --></p>
<p>Dentro del directorio que hayamos instalado nessus podemos encontrar los plugins (<strong>/opt/nessus/lib/nessus/plugins</strong>) con extensión <strong>nasl</strong> que son simples scripts:</p>
<pre>
(...)
include("compat.inc");

if(description)
{
 script_id(10926);
 script_version("$Revision: 1.33 $");

 script_cve_id("CVE-2002-0052");
 script_bugtraq_id(4158);
 script_osvdb_id(763);
(...)
</pre>
<p>En algunos casos me he encontrado con la <strong>desagradable sorpresa</strong> que hacen lo siguiente:</p>
<pre>
if(get_port_state(port))
{
banner = get_http_banner(port: port);
if(!banner)exit(0);
</pre>
<p>Por lo tanto, si tenemos por ejemplo el <a href="/2009/01/como-eliminar-la-informacion-sobre-versiones-de-los-headers-http">banner de Apache en Prod</a> algunos plugins pueden no indicar si es o no vulnerable un servidor ya que <strong>se basan en la versión que obtienen de los headers</strong>.</p>
<p>Entiendo que para ciertos casos puede ser la única manera de comprobar si un servidor es vulnerable, por ejemplo, pero lo he visto en el caso del <a href="/2011/08/range-header-ataque-de-denegacion-de-servicio-para-apache-1-x-y-2-x">CVE-2011-3192</a> por lo que no me parece muy justificado.</p>
<p>Así que <strong>deberemos tener presente que hacen los plugins</strong> antes de dar el resultado por válido,</p>

	Tags: <a href="http://systemadmin.es/tag/nessus" title="Nessus" rel="tag">Nessus</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2011/03/nessus-escaner-de-vulnerabilidades" onclick="pageTracker._trackEvent('relacionados','3233');" title="Nessus &#8211; Escaner de vulnerabilidades (24/March/2011)">Nessus &#8211; Escaner de vulnerabilidades</a></li>
	<li><a href="http://systemadmin.es/2011/04/comparativa-openvas-vs-nessus" onclick="pageTracker._trackEvent('relacionados','3331');" title="Comparativa OpenVAS vs Nessus (1/April/2011)">Comparativa OpenVAS vs Nessus</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/los-plugins-de-nessus-y-su-forma-de-hacer-las-cosas/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Replicación MySQL y la clausula LIMIT</title>
		<link>http://systemadmin.es/2012/01/replicacion-mysql-y-la-clausula-limit</link>
		<comments>http://systemadmin.es/2012/01/replicacion-mysql-y-la-clausula-limit#comments</comments>
		<pubDate>Tue, 24 Jan 2012 08:15:02 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[DBA]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3723</guid>
		<description><![CDATA[Tal y como podemos encontrar en el manual del MySQL, el uso de LIMIT en queries que modifican tablas es inseguro en modo STATEMENT (por defecto). Si lo hacemos nos encontraremos en el log mensajes similares a: 120123 19:06:01 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The [...]]]></description>
			<content:encoded><![CDATA[<p>Tal y como podemos encontrar en el manual del <strong>MySQL</strong>, el <a href="http://dev.mysql.com/doc/refman/5.5/en/replication-features-limit.html">uso de LIMIT en queries que modifican tablas es inseguro</a> en modo <strong>STATEMENT</strong> (por defecto). Si lo hacemos nos encontraremos en el <strong>log</strong> mensajes similares a:</p>
<pre>
120123 19:06:01 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Statement: DELETE FROM casas
		WHERE DATEDIFF(NOW(), casa_date) > 31 limit 1000
</pre>
<p><!-- more --></p>
<p>Esto se debe a que aunque existan los mismos registros:</p>
<pre>
master> select * from fib;
+------+-------+
| id   | valor |
+------+-------+
|    6 |     8 |
|    7 |    13 |
|    8 |    21 |
|    9 |    34 |
+------+-------+
4 rows in set (0.00 sec)
</pre>
<p>Si no indicamos ningún <strong>ORDER BY</strong> los registros no tiene porque seguir ningún orden por lo que en un slave nos podrían aparecer los datos en otro orden (siendo igualmente consistentes con el master):</p>
<pre>
slave> select * from fib;
+------+-------+
| id   | valor |
+------+-------+
|    8 |    21 |
|    9 |    34 |
|    7 |    13 |
|    6 |     8 |
+------+-------+
4 rows in set (0.00 sec)
</pre>
<p>Por lo que las queries que borran registros no podemos saber cuales han borrado y cuales no. Por ejemplo, si en los casos anteriores ejecutamos:</p>
<pre>
DELETE FROM fib LIMIT 1;
</pre>
<p>En el master borraríamos el registro con <strong>ID 6</strong> pero en el slave borrariamos el de <strong>ID 8</strong>. La misma query en el master y en el slave produce resultados diferentes (<strong>no es determinista</strong>).</p>
<p>Es por esto que debemos evitar este tipo de queries ya que <strong>podemos causar inconsistencias entre el master y el slave</strong>. </p>
<p>Aún así, también nos puede resultar útil dicha característica. Suponiendo que se ejecuta la siguiente query sobre una tabla <strong>MyISAM</strong>:</p>
<pre>
DELETE FROM fib WHERE ID > 4;
</pre>
<p>Si se cancela la query (porque esta bloquenado la tabla) a medio ejecutar con un <a href="/2009/05/matar-sesiones-en-mysql">KILL de MySQL</a> habremos <strong>borrado algunos registros</strong> en el master (pero ninguno en el slave), parandose la replicación con los slaves con el error:</p>
<pre>
Query partially completed on the master
</pre>
<p>Por lo que deberemos rehabilitar la replicación con:</p>
<pre>
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
</pre>
<p>En este punto <strong>tendremos la tabla en el master diferente del slave</strong>, para igualarlas podemos usar precisamente la <strong>característica insegura de LIMIT</strong>. Si <strong>ejecutamos repetidamente</strong> con un pequeño <strong>sleep</strong> entre las queries:</p>
<pre>
DELETE FROM fib WHERE ID > 4 LIMIT 10;
</pre>
<p>Conseguiremos:</p>
<ol>
<li><strong>Borrar poco a poco de la tabla</strong> sin bloquearla durante el tiempo que tarde el borrado de todos los registros, sino que únicamente mientras esta borrando una parte y dejando entrar más queries mientras dejamos el proceso en sleep.</li>
<li><strong>Igualar las tablas entre el master y los slaves</strong>:  La deberemos ejecutar en el master aunque ya no tenga registros a borrar allí para que se transmita a los slaves y borre los registros que se borraron de la query cancelada. </li>
</ol>
<p>Evidentemente podemos ir slave por slave a hacer lo mismo manualmente, pero si tenemos varios slaves puede resultar mucho más cómodo usar el <strong>LIMIT</strong> e ir igualando los slaves desde un único punto.</p>

	Tags: <a href="http://systemadmin.es/tag/mysql" title="MySQL" rel="tag">MySQL</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2009/03/vistas-views-en-mysql" onclick="pageTracker._trackEvent('relacionados','1586');" title="Vistas (views) en MySQL (27/March/2009)">Vistas (views) en MySQL</a></li>
	<li><a href="http://systemadmin.es/2011/05/ver-el-usuario-con-el-que-estamos-conectados-en-oracle-y-mysql" onclick="pageTracker._trackEvent('relacionados','3383');" title="Ver el usuario con el que estamos conectados en Oracle y MySQL (4/May/2011)">Ver el usuario con el que estamos conectados en Oracle y MySQL</a></li>
	<li><a href="http://systemadmin.es/2011/11/ver-el-estado-de-un-mysql" onclick="pageTracker._trackEvent('relacionados','3627');" title="Ver el estado de un MySQL (8/November/2011)">Ver el estado de un MySQL</a></li>
	<li><a href="http://systemadmin.es/2009/07/uso-de-mk-find-para-realizar-analyze-y-optimize-de-las-tablas-mysql" onclick="pageTracker._trackEvent('relacionados','1803');" title="Uso de mk-find para realizar analyze y optimize de las tablas MySQL (17/July/2009)">Uso de mk-find para realizar analyze y optimize de las tablas MySQL</a></li>
	<li><a href="http://systemadmin.es/2008/12/uso-de-maatkit-para-detectar-indices-duplicados-en-mysql" onclick="pageTracker._trackEvent('relacionados','742');" title="Uso de Maatkit para detectar índices duplicados en MySQL (4/December/2008)">Uso de Maatkit para detectar índices duplicados en MySQL</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/replicacion-mysql-y-la-clausula-limit/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación de un servidor LAMP (apache con PHP y XCache)</title>
		<link>http://systemadmin.es/2012/01/instalacion-de-un-servidor-lamp-apache-con-php-y-xcache</link>
		<comments>http://systemadmin.es/2012/01/instalacion-de-un-servidor-lamp-apache-con-php-y-xcache#comments</comments>
		<pubDate>Mon, 23 Jan 2012 08:17:10 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[LAMP y web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XCache]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3522</guid>
		<description><![CDATA[Para instalar PHP con Apache en un entorno de producción se suele acompañar de un opcode cache para evitar el overhead de parsear y compilar el código PHP a cada petición. Otras veces hemos visto cómo instalar eAccelerator pero dicho proyecto se ha quedado parado por lo que hoy lo veremos con XCache sobre CentOS [...]]]></description>
			<content:encoded><![CDATA[<p>Para instalar <strong>PHP con Apache</strong> en un entorno de producción se suele acompañar de un <strong>opcode cache</strong> para evitar el overhead de parsear y compilar el código PHP a cada petición. Otras veces hemos visto <a href="/2009/08/instalacion-de-un-servidor-lamp-v-apache-con-php-y-eaccelerator">cómo instalar eAccelerator</a> pero dicho proyecto se ha quedado parado por lo que hoy lo veremos con <strong>XCache</strong> sobre <strong>CentOS 6</strong>:</p>
<p><!-- more --></p>
<p>Primero deberemos <strong>instalar Apache</strong>, lo descargamos y descomprimimos:</p>
<pre>
cd /usr/local/src
yum install zlib-devel -y
wget http://apache.rediris.es//httpd/httpd-2.2.21.tar.gz
tar xzf httpd-2.2.*.tar.gz
cd httpd-2.2.*
</pre>
<p>A continuación lo compilamos con las opciones más comunes y deshabilitando algunos módulos como <strong>autoindex</strong>:</p>
<pre>
./configure --prefix=/usr/local/apache22 --exec-prefix=/usr/local/apache22 --enable-so --disable-autoindex --enable-rewrite --enable-deflate --enable-expires --disable-asis --disable-userdir
make &#038;&#038; make install
useradd apache
sed -i 's%^#Include conf/extra/httpd-default.conf%Include conf/extra/httpd-default.conf%' /usr/local/apache22/conf/httpd.conf
sed -i 's%^#Include conf/extra/httpd-vhosts.conf%Include conf/extra/httpd-vhosts.conf%' /usr/local/apache22/conf/httpd.conf
sed -i 's/^User daemon/User apache/' /usr/local/apache22/conf/httpd.conf
sed -i 's/^Group daemon/Group apache/' /usr/local/apache22/conf/httpd.conf
sed -i 's%^#Include conf/extra/httpd-mpm.conf%Include conf/extra/httpd-mpm.conf%' /usr/local/apache22/conf/httpd.conf
sed -i 's%^#Include conf/extra/httpd-info.conf%Include conf/extra/httpd-info.conf%' /usr/local/apache22/conf/httpd.conf
sed -i 's/^ServerSignature On/ServerSignature Off/' /usr/local/apache22/conf/extra/httpd-default.conf
sed -i 's/^ServerTokens Full/ServerTokens Prod/' /usr/local/apache22/conf/extra/httpd-default.conf
sed -i 's/^KeepAliveTimeout 5/KeepAliveTimeout 2/' /usr/local/apache22/conf/extra/httpd-default.conf
sed -i 's/^MaxKeepAliveRequests 100/MaxKeepAliveRequests 512/' /usr/local/apache22/conf/extra/httpd-default.conf
echo "TraceEnable off" >> /usr/local/apache22/conf/httpd.conf
echo "AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/x-javascript text/xml" >> /usr/local/apache22/conf/httpd.conf
cat > /usr/local/apache22/conf/extra/httpd-vhosts.conf &lt;&lt;EOF
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

# HERE BE DRAGONS
&lt;VirtualHost *:80&gt;

 DocumentRoot /var/www/void

 &lt;Directory /var/www/void&gt;
  Options FollowSymLinks
  AllowOverride None
  Order deny,allow
  Allow from all
 &lt;/Directory&gt;

 Include conf/extra/httpd-info.conf

&lt;/VirtualHost>

Include conf/extra/vhosts/*.conf
EOF
cat > /usr/local/apache22/conf/extra/httpd-info.conf &lt;&lt;EOF

&lt;Location /server-status&gt;
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
&lt;/Location&gt;

EOF
echo "ExtendedStatus On" >> /usr/local/apache22/conf/httpd.conf
mkdir -p /usr/local/apache22/conf/extra/vhosts
mkdir -p /var/www/void
</pre>
<p>Para la gestión de los logs podemos usar <strong>cronolog</strong> para que se roten automáticamente:</p>
<pre>
cd /usr/local/src
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar xzf cronolog-1.6.2.tar.gz
svn export http://nagios-systemadmin.googlecode.com/svn/trunk/patchs/cronosyslog.patch /usr/local/src/cronosyslog.patch
cd cronolog-1.6.2
patch -p1 < ../cronosyslog.patch
./configure &#038;&#038; make &#038;&#038; make install
</pre>
<p>A continuación instalamos <strong>PHP 5.3</strong>, actualmente <strong>PHP 5.2 ya se encuentra sin soporte</strong>:</p>
<pre>
yum install libxml2-devel -y
yum install openssl-devel -y
yum install libxslt-devel -y
yum install curl-devel -y
yum install libjpeg-devel -y
yum install libmcrypt-devel -y
yum install libjpeg-devel -y
yum install libpng-devel -y
yum install libtool-ltdl-devel -y
yum install libc-client-devel -y
cd /usr/local/src
wget http://fr.php.net/get/php-5.3.8.tar.gz/from/this/mirror
tar xzf php-5.3.8.tar.gz
cd php-5.3.8
./configure --with-apxs2=/usr/local/apache22/bin/apxs --with-mysql=/usr/local/mysql/ \
            --with-config-file-path=/usr/local/apache22/conf/ --with-zlib --with-gd \
            --with-jpeg-dir=/usr/ --with-gettext --with-mcrypt --with-iconv \
            --enable-mbstring=all --enable-mbregex --with-png-dir=/usr \
            --with-libdir=lib64
make &#038;&#038; make install
cp php.ini-production /usr/local/apache22/conf/php.ini
mkdir /var/www/php/sessions -p
mkdir /var/www/php/tmp -p
chown -R apache. /var/www/php
sed -i 's%^;session.save_path = \"/tmp\"%session.save_path = \"/var/www/php/sessions\"%' /usr/local/apache22/conf/php.ini
sed -i 's%^;upload_tmp_dir =%upload_tmp_dir = /var/www/php/tmp%' /usr/local/apache22/conf/php.ini
sed -i 's#libphp5.so$#libphp5.so\n&lt;FilesMatch \\.php\$&gt;\nSetHandler application/x-httpd-php\n&lt;/FilesMatch&gt;\n#' /usr/local/apache22/conf/httpd.conf
sed 's#expose_php = On#expose_php = Off#g' -i /usr/local/apache22/conf/php.ini
sed 's/;\(date.timezone =\)/\1"Europe\/Andorra"/g' -i /usr/local/apache22/conf/php.ini
</pre>
<p>Finalmente instalamos <strong>XCache</strong> de una forma muy similar a la que se hacía con <strong>eAccelerator</strong>:</p>
<pre>
cd /usr/local/src/
wget http://xcache.lighttpd.net/pub/Releases/1.3.2/xcache-1.3.2.tar.gz
tar xzf xcache-1.3.2.tar.gz
phpize
./configure --enable-xcache
make &#038;&#038; make install
</pre>
<p>Para terminar la <strong>instalación de XCache</strong> definimos algunas variables</p>
<pre>
export XCACHETMP=$(mktemp /tmp/xcache.XXXXXXXXXXXXXXXXXXX)
pwgen 20 > $XCACHETMP
/usr/local/apache22/conf/
cat &lt;&lt;EOF &gt;&gt; /usr/local/apache22/conf/php.ini
[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20090626/xcache.so

[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "xcacheadmin"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = "$(echo -n "$(cat $XCACHETMP)" | md5sum | awk '{ print $1 }')" ;password: $(echo -n "$(cat $XCACHETMP)")

[xcache]
; ini only settings, all the values here is default unless explained

; select low level shm/allocator scheme implemenation
xcache.shm_scheme =        "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size  =               128M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count =                 $(cat /proc/cpuinfo |grep -c processor)
; just a hash hints, you can always store count(items) > slots
xcache.slots =                16K
; ttl of the cache item, 0=forever
xcache.ttl   =                 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval =           0

; same as aboves but for variable cache
xcache.var_size  =            4M
xcache.var_count =             $(cat /proc/cpuinfo |grep -c processor)
xcache.var_slots =            8K
; default ttl
xcache.var_ttl   =             0
xcache.var_maxttl   =          0
xcache.var_gc_interval =     300

xcache.test =                Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path =    "/dev/zero"

; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory =   ""

; per request settings
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =           Off

[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager =          Off

; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""
EOF
rm $XCACHETMP
unset XCACHETMP
</pre>
<p>A continuación podemos arrancar el apache con <a href="/2011/10/upstart-en-centos-6">upstart</a>:</p>
<pre>
cat &lt;&lt;EOF > /etc/init/apache22.conf
author      "systemadmin.es"
start on runlevel 3

respawn

exec /usr/local/apache22/bin/httpd -DNO_DETACH -f /usr/local/apache22/conf/httpd.conf
EOF
</pre>
<p>Y lo arrancamos con <strong>initctl</strong>:</p>
<pre>
initctl start apache22
</pre>
<p>Podemos comprobar que se ha <strong>instalado el XCache</strong> con <strong>php -v</strong>:</p>
<pre>
# php -v
PHP 5.3.9 (cli) (built: Jan 22 2012 12:30:35)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
<strong>    with XCache v1.3.2, Copyright (c) 2005-2011, by mOo</strong>
</pre>

	Tags: <a href="http://systemadmin.es/tag/httpd" title="Apache" rel="tag">Apache</a>, <a href="http://systemadmin.es/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://systemadmin.es/tag/xcache" title="XCache" rel="tag">XCache</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/12/w00tw00t-at-isc-sans-dfind" onclick="pageTracker._trackEvent('relacionados','3071');" title="w00tw00t.at.ISC.SANS.DFind:) (17/December/2010)">w00tw00t.at.ISC.SANS.DFind:)</a></li>
	<li><a href="http://systemadmin.es/2009/01/virtualhost-por-defecto-de-apache" onclick="pageTracker._trackEvent('relacionados','1178');" title="VirtualHost por defecto de Apache (17/January/2009)">VirtualHost por defecto de Apache</a></li>
	<li><a href="http://systemadmin.es/2008/12/uso-de-memcached-como-cache-de-contendio-de-apache-para-soportar-el-efecto-barrapunto" onclick="pageTracker._trackEvent('relacionados','840');" title="Uso de memcached como cache de contendio de Apache para soportar el efecto Barrapunto (11/December/2008)">Uso de memcached como cache de contendio de Apache para soportar el efecto Barrapunto</a></li>
	<li><a href="http://systemadmin.es/2009/09/uso-de-htcacheclean" onclick="pageTracker._trackEvent('relacionados','1917');" title="Uso de htcacheclean (8/September/2009)">Uso de htcacheclean</a></li>
	<li><a href="http://systemadmin.es/2011/08/solucion-del-dos-de-apache-mediante-el-header-range" onclick="pageTracker._trackEvent('relacionados','3512');" title="Solución del DoS de Apache mediante el header Range (31/August/2011)">Solución del DoS de Apache mediante el header Range</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2012/01/instalacion-de-un-servidor-lamp-apache-con-php-y-xcache/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

