Tutoriel Linux : un site WordPress accessible uniquement comme hidden service TOR

Ce tutoriel trouve son utilité dans un environnement répressif, dans lequel il pourrait être utile de cacher l’adresse IP réelle d’un serveur web.

Dans ce tutoriel, l’architecture que nous allons monter consiste à monter sur un VPS un conteneur docker contenant le CMS WordPress, associé à un conteneur TOR hidden service. Le conteneur WordPress n’exposant aucun port sur Internet, il ne peut être joint avec une adresse IP v4 ou v6.

Le conteneur TOR hidden service fera l’interface entre le monde des clients TOR et le conteneur WordPress.

Le résultat que nous allons obtenir est un site web WordPress accessible uniquement via TOR sur une adresse en .onion. Ce site web n’aura pas de nom de domaine au sens classique du terme (uniquement une adresse onion TOR) et donc n’aura pas besoin de quémander un certificat https à Letsencrypt (la sécurité des accès sera assurée par le réseau TOR lui-même).

Installation

L’installation se fait grâce à deux conteneurs docker, il faut donc que votre serveur soit prêt à lancer des services docker. Si ce n’est pas le cas, vous trouverez le guide d’installation docker sous Ubuntu ici et celui de Devuan ici.

Dans un répertoire dédié, créons le fichier docker-compose.yml contenant (remplacer votre_mot_de_passe par votre mot de passe aux 3 endroits) :

services:
  wordpress_db:
    image: mariadb:latest
    container_name: wordpress_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: votre_mot_de_passe
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: votre_mot_de_passe
    volumes:
      - ./db_data:/var/lib/mysql
    networks:
      - tor_network

  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    restart: unless-stopped
    depends_on:
      - wordpress_db
    environment:
      WORDPRESS_DB_HOST: wordpress_db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: votre_mot_de_passe
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress_data:/var/www/html
    networks:
      - tor_network

  tor:
    image: bariskisir/hiddenservicereverseproxy 
    container_name: tor_proxy
    restart: unless-stopped
    depends_on:
      - wordpress
    environment:
      APP_IP_DOMAIN: wordpress 
      APP_PORT: 80
    volumes:
      # Persistance des clés .onion (ne pas perdre ce volume !)
      - ./tor_data:/var/lib/tor
    networks:
      - tor_network
    user: root
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        chown -R tor:tor /var/lib/tor
        chmod 700 /var/lib/tor
        exec /entrypoint.sh

networks:
  tor_network:
    driver: bridge

volumes:
  db_data:
  wordpress_data:
  tor_data: # Ce volume contient tes clés privées .onion

On lance ensuite ce service par la commande classique :

docker compose up -d

Lors du premier lancement l’adresse .onion de votre site web apparaît dans le résultat de la commande :

docker logs tor_proxy

Elle est également disponible (et par la suite aussi) dans le fichier ./tor_data/hidden_service/hostname

Avec un navigateur TOR (TOR Browser ou Brave en mode TOR), ouvrez votre site .onion pour faire la configuration initiale de WordPress

Choisissez le français puis cliquez sur « Continuer »

Mettez un titre à votre site puis choisissez un identifiant (ie un nom d’auteur pour bloguer) et son mot de passe. L’adresse email est obligatoire pour pouvoir cliquer sur « Installer WordPress ».

Voilà, c’est installé. Il reste à cliquer sur « Se connecter » et renseigner le login et le mot de passe qu’on a donné.

On arrive alors sur le tableau de bord de configuration classique de WordPress.

A partir de là, on sort du scope de l’article car l’utilisation de WordPress nécessite un minimum d’investissement personnel. Si vous souhaitez apprendre les arcanes de l’utilisation de WordPress, il faut prendre un bon bouquin, comme celui-ci :

Voilà, vous avez votre site WordPress accessible uniquement via TOR.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *