En la web oscura

2020-05-01

¡Hola! Bien podrías estar leyendo esta entrada desde la web oscura, porque este sitio ya está disponible en ella. En esta entrada os cuento qué es la web oscura y cómo he logrado publicar mi página allí.

Actualización: Ya no estoy sirviendo este sitio en la web oscura, pero es posible que vuelva a estar disponible allí en el futuro.

Por qué hacerlo

La web oscura es la parte de internet que es accesible solo a través de ciertas subredes, que están superpuestas a la internet pública y para las que se necesita un software, configuración o autorización concretos. En particular, la red Tor es una de ellas (la más famosa), y es donde he publicado este sitio web.

En pocas palabras, la red Tor consiste en una red donde tu navegación se redirige a través de los nodos que pertenecen a ella, que no son más que servidores que otras personas proporcionan de forma altruista. Además, la comunicación va cifrada una vez por cada nodo, es decir, teniendo una capa de cifrado por cada uno, para que cada uno de ellos tenga acceso solo a la información imprescindible (que puede ser más de lo que crees, ten cuidado y no pienses que es algo infalible). Esto permite a quien usa esta red tener anonimato, ya que la página web visitada no sabe de dónde le viene la información (cree que es un nodo de la red el que se la está pidiendo).

Alrededor de esta red se crean muchos servicios, y hace tiempo que existe onionshare, que sirve para compartir archivos a través de Tor de forma anónima. En su versión 2.2, incorporó una nueva funcionalidad para servir páginas web estáticas. Me lo apunté en un rinconcito de mi memoria para el futuro y, finalmente, ayer lo hice y lo anuncié en el fediverso.

La ventaja que tiene esto es que permite que alguien acceda a mi página de forma anónima. Esto puede ser deseable por varias razones, entre ellas: que no quiera que su proveedor de internet lo sepa, que su proveedor de internet haya censurado mi página por alguna razón, que tenga miedo de que el servidor que se encarga de mi web esté capturando información sobre quién se conecta, etc. Tener una dirección acabada en .onion garantiza que todos esos problemas están solucionados.

Cómo lo hice

El procedimiento no fue nada difícil, pero sí un poco engorroso. Para empezar, onionshare está pensado principalmente para ser ejecutado de forma gráfica, no por línea de comandos, así que tuve que trastear un poco entre la documentación hasta dar con el funcionamiento adecuado y poder configurarlo en mi servidor.

Además, otro problema derivado de estar pensado para ser ejecutado gráficamente es que tiene un montón de dependencias gráficas, que, en un servidor, poca utilidad tienen. Me aguanté y las instalé, a falta de una alternativa mejor.

El archivo de configuración

Resulta que onionshare tiene una forma de ejecutarse por línea de comandos y, aunque para desplegar la web me sirve, está bastante limitada a la hora de configurar todo lo necesario. Eso era un problema, porque en el servidor no tengo interfaz gráfica, así que no podía correr onionshare para configurarlo. Entonces, tuve que trastear en mi propio ordenador para que se creara una configuración con los valores que quería.

Resultó ser algo como esto:

{
  "version": "2.2",
  "connection_type": "bundled",
  "control_port_address": "127.0.0.1",
  "control_port_port": 9051,
  "socks_address": "127.0.0.1",
  "socks_port": 9050,
  "socket_file_path": "/var/run/tor/control",
  "auth_type": "no_auth",
  "auth_password": "",
  "close_after_first_download": false,
  "autostop_timer": false,
  "autostart_timer": false,
  "use_stealth": false,
  "use_autoupdate": true,
  "autoupdate_timestamp": null,
  "no_bridges": true,
  "tor_bridges_use_obfs4": false,
  "tor_bridges_use_meek_lite_azure": false,
  "tor_bridges_use_custom_bridges": "",
  "use_legacy_v2_onions": false,
  "save_private_key": true,
  "private_key": "",
  "public_mode": true,
  "password": "",
  "hidservauth_string": "",
  "data_dir": "/home/usuario/OnionShare",
  "csp_header_disabled": false,
  "locale": "en"
}

Me costó un par de iteraciones conseguirlo, porque tiene truco. Para obtener el fichero de configuración correcto, debes elegir todas las opciones que quieres en la interfaz gráfica, pero no debes empezar a servir la página en ningún momento. Si lo haces, se genera una clave y se mete en el fichero de configuración (en el campo private_key), y es mejor dejarlo sin ninguna y que se vuelva a generar en el servidor.

Esto ocurre porque yo seleccioné que la dirección de mi página quiero que sea siempre la misma (porque si va cambiando de dirección, no la puedo enlazar desde ningún sitio). También, aparte de «Usar una dirección persistente», seleccioné «Modo público» para que no se pida contraseña para acceder y deseleccioné «Dejar de compartir cuando los archivos se hayan enviado», para que la página sea visible para todo el mundo, no solo para la primera persona que llegue.

Una vez que tuve ese archivo de configuración, solo tuve que ponerlo en su sitio en el servidor y ejecutar lo siguiente para desplegar la página:

onionshare --website public/

Además, ese comando te devuelve cuál es la dirección definitiva de tu página. Es buen momento para guardarla, porque ya no cambiará.

Automatización

Después de eso faltaba automatizar el proceso, puesto que no quiero tener que estar actualizando la página en el servidor y volviendo a lanzar ese comando cada vez que haya algún cambio. Entonces, creé una tarea de cron que lo hiciera por mí (si lo haces con systemd morirá un gatito por cada vez que se lance).

En concreto, la tarea de cron se tenía que encargar de:

  1. Parar el servicio que esté sirviendo la página en ese momento.
  2. Actualizar el repositorio con los cambios que haya, aunque entren en conflicto con el último estado sincronizado del repo.
  3. Volver a servir la página.

Entonces, me escribí un guion de consola que me hace el trabajo:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh

while pkill "onionshare|tor"; do
	sleep 2
done

cd /ruta/al/repo/de/la/web

git fetch --all
git reset --hard origin/master
JEKYLL_ENV="dark_web" bundle exec jekyll build -d public

onionshare --website public/

Desglosándolo, podéis ver que:

Después de hacerme ese guion tan bonito, solo me quedaba decírselo a cron, lo cual hice con esta línea:

25 5 * * * nohup /ruta/al/guion.sh > /ruta/al/registro.log 2>&1 &

Así, todos los días a las 5.25 (hora de España peninsular) se actualiza mi web en la internet oscura, que me ha parecido una hora estupenda. Además, si hay algún fallo, queda recogido en el archivo que hayáis puesto como registro, para poderlo arreglar.

Concluyendo

A mí me ha parecido un proceso bastante sencillo y os animo a que lo hagáis con vuestras páginas estáticas, ya que tiene ventajas para quien visite la web.

¡Nos vemos en la próxima!


¿Tienes algún comentario o quieres discutir sobre este tema? ¡No te cortes!, abre un hilo en mi bandeja pública enviando un correo electrónico a ~josealberto4444/public-inbox@lists.sr.ht. Por favor, ten en cuenta que el correo tiene que ser en texto plano o será rechazado. Puedes mirar en https://useplaintext.email/es si necesitas ayuda.

Esta entrada está sujeta a una licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.