MLDonkey chrooted en OpenBSD 4.0

He hablado otras veces de MLDonkey, de OpenBSD y de la combinación de ambos. Ayer me llegó un correo de Hanz invitándome a traducir su nueva revisión basándose en OpenBSD-4.0, así que no me pude resistir.
MLDonkey Logo
El documento es una explicación de cómo montar el cliente P2P multiprotocolo MLDonkey en OpenBSD 4.0 de forma segura dentro de una jaula (chrooted) para aumentar la seguridad.

Intro

Hay montones de clientes p2p para elegir pero he elegido MLDonkey porque soporta conexiones redes Bittorrent, Edonkey y Overnet. Además viene con un interfaz bonito e intuitivo, y como añadido extra puede ejecutarse sin depender de las X.

Hay un port disponible para OpenBSD en /usr/ports/net/mldonkey, pero depende de X y no puede ejecutarse enjaulado, con lo que he decidido compilar mldonkey a mano y usar chrootuid para enjaularlo en su directorio propio (/mnt/misc/mldonkey en mi equipo).

Instalación

Para su instalación primero descargo las releases que he construido previamente (original, mirror):
# su -
# pkg_add chrootuid-1.3.tgz
# tar xfvz mldonkey-2.8.1.static.i386-OpenBSD.tar.gz
# mkdir /mnt/misc/mldonkey
# mv mldonkey-distrib /mnt/misc/mldonkey/core

Creando el usuario

Después hay que crear el usuario y el grupo a los que corresponderá la tarea de ejecutar mldonkey:
# groupadd _mldonkey
# useradd -g _mldonkey -d /mnt/misc/mldonkey/ -s /bin/sh _mldonkey

Cambios en login.conf

Debemos resolver el problema de siempre, en /etc/login.conf indicamos cuantos recursos del sistema puede usar un usuario, limitaciones para que el sistema no se vuelva inestable o alguien use sus cuotas de forma malintencionada.

La clase por defecto es "daemon", demasiado conservadora por estas razones; pero MLDonkey necesita abrir multitud de archivos y sockets para funcionar eficientemente, con lo que creamos otra clase diferente para root dándole más chance (para más información consultar login.conf(5) y login(1):
# nano -w /etc/login.conf
---
root:\
        :ignorenologin:\
        :datasize=infinity:\
        :maxproc=infinity:\
        :openfiles-cur=2048:\
        :stacksize-cur=8M:\
        :localcipher=blowfish,8:\
        :tc=default:
---
Ahora agregamos root a la clase:
# vipw
---
root:$2a$08$9vuj6yEmq/2I...f3zO:0:0:root:0:0:Charlie &:/root:/usr/bin/ksh
                                    ^^^^
---
Nota: Si recibes notificaciones lowid de algún servidor y estás seguro de que el firewall está configurado correctamente, deberías repasar la directiva openfiles-cur en la clase de login de root.

Dispositivos y configuraciones

Ahora crearemos los dispositivos (devices) y configuraciones adecuados. Necesitamos /dev/null y /dev/random dentro del chroot. También necesitamos un resolv.conf para resolver nombres de dominio:
# mkdir /mnt/misc/mldonkey/dev
# mknod -m 666 /mnt/misc/mldonkey/dev/null c 2 2
# mknod -m 644 /mnt/misc/mldonkey/dev/urandom c 45 2
# mkdir /mnt/misc/mldonkey/etc
# cp /etc/resolv.conf /mnt/misc/mldonkey/etc
# chown -R _mldonkey:_mldonkey /mnt/misc/mldonkey
# chrootuid /mnt/misc/mldonkey _mldonkey core/mlnet -stdout
Ahora MLDonkey se iniciará creando varios archivos de inicio y configuración en /mnt/misc/mldonkey/root/.mldonkey. Salimos de dicha ejecución con ctrl-c echándole un vistazo a los errores que pueda soltar.

Ahora editaremos los archivos de configuración para listar las IP's a las que permitiremos conectar con el interfaz web, las máximas tasas de transferencia y nuestra dirección de correo para cualquier report:
# nano -w /mnt/misc/mldonkey/root/.mldonkey/downloads.ini
---
allowed_ips = [
  "127.0.0.1"; 
  "10.0.0.255";
  "192.168.0.123";]

max_hard_upload_rate = 10
max_hard_download_rate = 70

mail = "my@email.com"
---
Nota: Sigo obteniendo este mensaje de error, sin embargo el dispositivo está adecuadamente creado:
createKey: OS_Rng: open /dev/urandom operation failed with error 6
Debemos asegurarnos que la partición no está montada en /etc/fstab con la opción nodev, es obvio que el problema puede venir por ahí.

Ejecución y rc.local

A continuación ejecutaremos MLDonkey como servicio (daemon) dentro de su jaula y configuraremos password para el admin:
# chrootuid /mnt/misc/mldonkey/ _mldonkey core/mlnet & > /dev/null
# telnet localhost 4000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to MLdonkey
Welcome on mldonkey command-line

Use ? for help

MLdonkey command-line:
> useradd admin mypass
> q
Abre un navegador en http://localhost:4080, loguéate y disfruta. Para iniciar MLDonkey como servicio, al arranque de la máquina, añadimos lo siguiente a /etc/rc.local:
# nano -w /etc/rc.local
---
if [ -x /mnt/misc/mldonkey/core/mlnet ]; then
        echo -n ' mldonkey'; /usr/local/sbin/chrootuid /mnt/misc/mldonkey/
        _mldonkey core/mlnet & > /dev/null
fi
---
Nota: Todas las descargas completas se almacenarán en /mnt/misc/mldonkey/root/.mldonkey/incoming
sysadmin openbsd

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.