Cómo monté mi servidor - El entorno para chroot

14 - El entorno para chroot

[editar]
Tutorial creado por Daniel Clemente. Extraido de: http://www.mononeurona.org/index.php?idp=230
27 de Octubre de 2005

Dentro del directorio /f tenía que crear una estructura de directorios y archivos propia de un sistema UNIX para que se ejecutara el servidor web y los programa CGIs. El chroot lo que hace es convertir en raíz (/) el directorio especificado, por lo que si, dentro de la jaula, el usuario root te hace un rm -rf /, sólo te habrá borrado el directorio de chroot.

Lo primero que pensé es que ya habría mini-distribuciones de Linux preparadas para esto que contengan los programas necesarios: bash, ls, gcc, perl, ... Seguro que hay, pero no busqué mucho y decidí hacerlo a mano. Descubrí que es muy fácil si se usan las herramientas apropiadas. Esta captura de pantalla deja claro el proceso ('captura' en modo texto aquí):


Ejemplo chroot

Y así con cada programa, tienes que copiar las librerías que necesita (ya sabes, man ldd si no sabes qué hace).


Opciones de thttpd

Lo bueno de elegir un servidor sencillo es que pude revisar todo el código fuente y leerme y entender por completo el manual de uso. Sabiendo manejar el programa entero, no tuve ningún problema.

thttpd no necesita archivo de configuración; todas las opciones se pasan como parámetros. Por eso me hice un script que hacía lo siguiente:


#!/bin/sh
/bin/thttpd -p 80 -d /f -r -u webo -dd web -c "\
217.126.10.173/cgi-bin/*|\
danielclemente.com/cgi-bin/*|\
www.danielclemente.com/cgi-bin/*|\
amarok/cgi-bin/*|\
172.26.0.11/cgi-bin/*\
" -l /f/log/este_mes -v

Explicación:

  • -p 80: es el 'por defecto', pero sólo para asegurarme. Mi intención era que thttpd no se ejecutara como root sinó como un usuario normal, y por tanto pensaba usar un puerto no privilegiado (ej. 8000) y hacer NAT desde el router, pero como para el chroot hace falta ser root (luego baja de privilegios), acabéusando el 80.
  • -d /f: directorio al que entra al ejecutar el programa
  • -r: hacer chroot en el directorio del programa (o sea, el /f de la opción anterior)
  • -u webo: usuario al que cambiar después de hacer las cosas que requieren ser root. Es importante no ser root dentro del chroot, porque entonces es 'fácil' salir mandando unas señales.
  • -dd web: directorio al que entra después de haber hecho el chroot. O sea, que las webs están en /f/web
  • -c "blablabla": archivos que deben ejecutarse en vez de mostrarse, o sea CGIs. Además han de ser ejecutables (+x). Tengo que poner cada nombre de host (aunque la web sea la misma) por la diferencia que se hace con lo del virtual hosting: quizás alguien quiera que desde miweb.com vayan los CGIs pero desde www.miweb.com no. Nota que el * lo traduce el bash a los nombres de archivo que hay en ese momento en cada directorio, por lo que si luego añades nuevos CGIs hay que reiniciar el servidor dándole la nueva lista.
  • -l /f/log/este_mes: dónde añadir los logs (lo explico luego)
  • -v: hacer virtual hosting. En /f/web no habrá una web con su index.html, sinó directorios, cada uno llamado con un nombre de host (ej. www.miweb.com) y con su index.html y familia dentro.

El proceso se arranca como demonio; para hacer pruebas va bien el -D que lo deja en primer plano.


Logs

Me hice este script que rota y archiva los logs, muy sencillo. Está en /etc/cron.monthly

#!/bin/sh
# Rotar logs. EJECUTAR EL PRIMER DÍA DE CADA MES
logs
cd /f/log

rm -f hace12meses.gz
mv hace11meses.gz hace12meses.gz
mv hace10meses.gz hace11meses.gz
mv hace9meses.gz hace10meses.gz
mv hace8meses.gz hace9meses.gz
mv hace7meses.gz hace8meses.gz
mv hace6meses.gz hace7meses.gz
mv hace5meses.gz hace6meses.gz
mv hace4meses.gz hace5meses.gz
mv hace3meses.gz hace4meses.gz
mv hace2meses.gz hace3meses.gz
mv hace1mes.gz hace2meses.gz
/bin/gzip este_mes
mv este_mes.gz hace1mes.gz

kill -HUP `pidof thttpd` || /root/servweb

Si no sabías lo que era rotar logs, pues ya lo sabes (es descartar el más viejo para que quepa uno nuevo; sólo tengo 12 posiciones). La última línea reinicia el servidor web o, en caso de que no esté activo, lo inicia.

También podía haber usado herramientas automáticas que lo hacen, como logrotate. Pero mi script es más sencillo porque tiene sólo lo que yo quiero.


Un watchdog para el servidor web

Puede que, por alguna razón rara, el proceso thttpd muera y me quede sin servidor. Por eso me hice un 'watchdog', o 'perro guardián', que comprueba periódicamente si está activo y si no lo está lo inicia. Al principio se ejecutaba cada día porque no encontré un /etc/cron.hourly (lo mímino era daily)... pura vagancia. Luego le añadí 05 *    * * *   root    /root/wdogweb al /etc/crontab para ejecutarlo cada hora a los 05 minutos.

El script es realmente sencillo y muy bonito:

#!/bin/sh
pidof thttpd || /root/servweb
# equivale a:   if ! pidof thttpd; then /root/servweb; fi

Me han comentado que hay utilidades como daemontools que se encargan de arrancar y vigilar servicios, pero ahora que ya he aprendido a usar cron creo que no me hace falta otro programa para hacer lo mismo. No digo que no sea útil; al contrario, va muy bien por si tienes muchos servidores.

[editar]

26 opiniones

Buen tutorial.

Está guay. Yo estoy buscando una idea también sobre el hardware apropiado y creo que lo mejor de lo mejor es esa maravilla que comentas más arriba. Ese mini ordenador que consume poquísimo y no hace nada de ruido. Es cierto que el precio es un poco elevado, pero creo que vale la pena porque se amortizará y es extremadamente cómodo. Creo que optaré por uno de esos.

Está muy bueno lo que hiciste, muy buen trabajo. Pero que servidor usas? por lo que mencionas del flujo de usuarios parece que podrías aprovechar mucho más el rendimiento de la compu. Windows server 2008 te deja controlar muchas de esas opciones de accesibilidad, deberías probarlo a ver como te funciona.
Atencion !!!!.

Hola ! tengo una empresa de arquitectura web y necesito algún proveedor de servidor web para trabajar... Por favor ! tengo mucho trabajo. Al que le interese escríbame al correo. Gracias !!!!!!!!!!!!!.
Gracias!!!.

Sr daniel clemente:

muchas gracias por este excelente trabajo. Saluda atte maximiliano.
Excelente.

Actualmente acabo de adquirir 2 servidores ibm rs6000 me estoy iniciando en esto y van para el mismo proposito si alguien tiene mas conocimiento sobre esto me interesa platicar con el para resolver mis dudas ;) gracias.
1 2 3 4 5 6 | siguiente >

Tutoriales relacionados con 'Cómo monté mi servidor'

Las páginas que estás viendo están alojadas en mi propio servidor (IP 217. 126.10.173), que... Más »
¿Qué es una imagen ISO? Las imágenes ISO son archivos que siguen los estándares ISO-9660... Más »
Curso que profundiza en el gestor de montones (o montículos) dentro de Win32, así como... Más »
Manual para Slackware 10. 0 en el que prescindiremos de usar las X. Esto puede... Más »
Este es un curso sin ninguna relevancia. Pretende ser una pequeña introducción para todos mis... Más »

Autor y licencia de 'Cómo monté mi servidor'


Tutorial de Daniel Clemente. Extraido de: http://www.mononeurona.org/index.php?idp=230 CopyLeft
Este trabajo está licenciado bajo la Creative Commons License. 1999-2005 © :: MonoNeurona.org ::
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.