Linux Vserver en 5 minutos

Linux-Vserver es similar a las zonas de Solaris 9 o a las jaulas de FreeBSD. Permite ejecutar procesos de forma totalmente aislada respecto a los demás, lo que lo convierte en una especie de máquina virtual ultra-rápida.

Ingredientes

Todos son paquetes Debian:

  • linux-image-2.6.17-2-vserver-686
  • util-vserver
  • vserver-debiantools

Introducción

En una receta anterior hablábamos de Xen 3.0 como una buena forma de implementar servidores virtuales en GNU/Linux sin mucho esfuerzo y con poca sobrecarga. Pero cuando el número de servidores virtuales sobre una misma máquina empieza a crecer es el momento de mirar otras alternativas complementarias.

Xen ofrece un aislamiento total, permitiendo la ejecución simultánea de varios núcleos. ¿Pero y si no necesitamos varios núcleos? ¿Y si tan solo queremos limitar el riesgo ante una posible intrusión? ¿Y si tan solo queremos delegar permisos de administración sobre unos servicios?

Una alternativa escalable es Vserver. Se trata de un parche para Linux que permiten crear múltiples contextos de seguridad y manejar todos ellos como si se trataran de máquinas virtuales. Es bastante diferente a Xen, puesto que sólo se ejecuta un núcleo, sólo se dispone de una pila TCP/IP, los recursos están disponibles en todas las máquinas virtuales a no ser que explícitamente se revoquen los permisos.

Instalación

Nada más fácil, todos los paquetes se instalan sin problemas. El kernel con soporte de vserver está ya precompilado y en Debian se incluyen scripts para facilitar el trabajo con nuestra distribución favorita.

# apt-get install linux-image-2.6.17-2-vserver-686 util-vserver vserver-debiantools

El grub o el lilo se actualiza solo y el initrd se genera también automáticamente. Ya sólo queda arrancar el sistema con el nuevo kernel (linux-image-2.6.17-2-vserver-686).

Manejando máquinas virtuales

Para crear un nuevo servidor virtual se puede usar el script newvserver del paquete vserver-debiantools. Este script usa la utilidad vserver para la instalación inicial y luego realiza algunos ajustes para adaptarla a Debian. El script se configura con el archivo /etc/vservers/newvserver-vars. Una configuración sencilla tendría algo así:

DIST="sid"
MIRROR="http://ftp.uk.debian.org/debian"

Osea, utiliza por defecto la distribución sid (unstable) y el mirror de UK. Cámbialo por tus preferencias si quieres.

Crear nuevas máquinas virtuales es tan sencillo como:

# newvserver —hostname nombreDelVserver —domain dominioDelVserver —ip direccionIp

Donde nombreDelVserver es el nombre del nuevo servidor (e.g. atlante), dominioDelVserver es el dominio del nuevo servidor (e.g. dyndns.org) y direccionIp es la dirección IP del nuevo servidor (e.g. 192.168.1.145). La dirección IP puede ser de un rango privado o público, por supuesto.

Tras un rato tendremos un nuevo directorio en /var/lib/vservers que contiene un filesystem completo.

Se puede arrancar el nuevo servidor con:

# vserver nombreDelVserver start

Y pararlo con:

# vserver nombreDelVserver stop

Podemos entrar en la consola de cualquier servidor con:

# vserver nombreDelVserver enter

Y salir de ella simplemente terminando la shell (Ctrl-D o exit).

Dentro de la consola podemos instalar software con apt, como si se tratara de una máquina aislada. Las órdenes de gestión de procesos (ps, kill, etc.) solo afectarán a las de esa máquina virtual aunque todos los procesos se están ejecutando en el mismo núcleo.

Para ver qué maquinas están arrancadas y un mínimo de estadísticas:

$ vserver-stat

Para copiar una máquina virtual cambiando la dirección IP y el nombre:

# vserver-copy —stopstart —ip nuevaIp —domain nuevoDominio nombreDelVserverViejo nombreDelVserverNuevo

Y para borrar una máquina virtual que ya no interesa:

# vserver nombreDelVserver delete

La utilidad vserver permite hacer una enorme cantidad de operaciones. Es más o menos equivalente a la utilidad xm en Xen 3.0.

Detalles de configuración

Compartir los recursos de red

Cada máquina virtual podrá tener una dirección IP distinta, pero todas ellas se asignarán a los mismos interfaces físicos del host. Si, por ejemplo, queremos ejecutar un sshd en una máquina virtual y también en el host tendremos que modificar ligeramente la configuración del sshd. Por defecto en /etc/ssh/sshd_config se asume un:

ListenAddress 0.0.0.0

Esto indica que el servidor de SSH escucha en todas las direcciones IP del host. Debemos cambiarlo tanto en el host como en las máquinas virtuales para indicar una sóla dirección IP.

Mejorar la seguridad

Seguro que muchos de vosotros habréis oido hablar de los bugs de Linux que permitían escapar de una jaula chroot. Vserver usa una jaula chroot, lo que os puede hacer un poco reticentes a usarlo. Afortunadamente hay una solución en linux 2.6 usando los atributos extendidos:

# setattr —barrier /var/lib/vservers

Este atributo dificulta aún más el escapar de una jaula chroot en /var/lib/vservers aunque haya errores en el kernel.

Pero lo más importante es limitar las capacidades de las máquinas virtuales al mínimo necesario. Esto se consigue editando los archivos /etc/vservers/nombreDelVserver/bcapabilities y /etc/vservers/nombreDelVserver/ccapabilities. Se puede impedir desde el montaje de nuevos dispositivos hasta la ejecución de determinadas llamadas del sistema.

Una sola dirección IP pública

Si sólo tienes una dirección IP disponible puedes configurar cada vserver en una dirección privada usando un interfaz de red ficticio (dummy) y luego usar iptables para rutar los paquetes hacia fuera como si vinieran de tu única dirección pública. En esta página tienes cómo.

Coexistencia con Xen

El paquete que incluye el parche de Xen (linux-image-2.6.16-2-xen-vserver-686) también incluye el parche de vserver así que ambos mecanismos pueden hacerse convivir. Se pueden tener algunas máquinas Xen y tantas Vserver como querramos. Incluso puede haber máquinas que se ejecuten indistintamente con Xen o con Vserver.

Referencias

Esta receta solo araña ligeramente las posibilidades de Vserver. Es posible limitar lo que es posible hacer desde una máquina virtual para que ni siquiera root pueda realizar determinadas actividades potencialmente peligrosas, o se puede compartir parte del sistema de archivos entre varias máquinas virtuales. En estas referencias teneis más documentación.