12 de Diciembre, 2004

Corriendo un tracker 'seguro'

Para estar completamente seguros tendríamos que emplear chroot, pero dado que el tracker que uso está hecho en Python, la cosa sería demasiado complicada (por meter todo el intérprete en el chroot).

Así que vamos a tomar algunas medidas interesantes orientadas a mejorar la seguridad del sistema, al menos mientras sea necesario distribuir los vídeos de las jornadas.

Estas medidas no quitan que no sea obligatorio actualizar el programa cuando hayan correcciones de seguridad. En realidad nos preparamos para un posible periodo de tiempo desde que se conoce el problema, y puede que alguien intente explotarlo, hasta que hay una solución que podemos aplicar.

Lo que vamos a hacer es correr el proceso con un usuario/grupo sin privilegios, así, en caso de haber problemas, el proceso que corre el tracker no podrá hacer gran cosa en el sistema.

Normalmente esta característica nos la suele ofertar el servicio, pero no siempre es así (como en este caso).

Creamos un grupo y su usuario para este menester:

# groupadd bitt
# useradd -g bitt -c 'bttracker' -d /nonexistent -s /sbin/nologin bitt

El usuario no tiene directorio HOME ni SHELL, no obstante hay que instalar el tracker en algún sitio. Yo he elegido /home/bitt.

Todos los ficheros serán propietarios de root:wheel, salvo uno: dstate (o dos si llevamos un registro de la actividad; pero es opcional).

Este dstate es donde el tracker lleva el estado de los clientes, semillas, conexiones, etc., y pertenecerá a bitt:bitt.

Es importante que ese debe ser el único fichero en el que puede escribir nuestro usuario bitt. Mi tracker nunca ha pasado de 4KB, así que podemos ajustar las quotas para ese usuario y cubrirnos las espaldas ante una posible denegación de servicio intentando llenar el disco (en mi caso no hay peligro ya que solo llenaría la partición de /home, en la que no hay otros servicios).

Ahora solo queda arrancar el tracker en cada inicio, como ya vimos. Editamos /etc/rc.local:

... arranque de otros servicios ...
# bit torrent tracker
if [ X"${bttracker}" != X"NO" -a -x /home/bitt/bitt/bttrack.py ]; then
        echo -n " bttracker"; cd /home/bitt/bitt && /usr/bin env -i\
 HOME=/home/bitt su -m bitt -c \
"./bttrack.py --port 6969 --dfile ../dstate --allowed_dir ../track\
 > /dev/null &"
# OJO: no tengo claro que la linea de arriba se pueda partir
# porque tiene comillas, la parto aquí solo porque no cabe
fi

echo '.'
# fin de rc.local

De la linea de ejecución se desprende mi estructura de directorios:

/home/bitt/dstate (propietario bitt:bitt)
/home/bitt/track/ (directorio con los torrent permitidos)
/home/bitt/bitt/ (directorio con los ejecutables)

Nos situamos en /home/bitt/bitt y con su ejecutamos el tracker indicando que debe correr con el usuario bitt (con el -m se hereda el entorno actual, porque este usuario no tiene SHELL ni HOME, necesarios para su). Ejecutamos el su dentro de env para limpiar el entorno que haya en la ejecución de los scripts de arranque y poner un HOME más adecuado.

Ahora solo queda activar el servicio en /etc/rc.conf.local:

# NO para desactivar
bttracker=""

Y así es como lo he hecho. Espero que desde ahora no haya más caídas del tracker (ayer reinicié para cambiar un cable y no arranqué el servicio :P).

Anotación por Juan J. Martínez.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.