05/12/2010

Devenez miroir de Wikileaks sans risque (corrigé)

Bon, d’habitude on se refuse de parler politique sur Geekfault… Mais on ne peut pas se taire plus longtemps sur ce qui se passe du côté de Wikileaks. En tant que geeks nous devons nous lever et protester contre ces atteintes à la liberté d’expression sur Internet.

Wikileaks a aujourd’hui publié sa solution à la censure : le mirroring. Si Wikileaks est consultable sur des centaines de noms de domaine et des centaines d’IPs, il sera d’autant plus difficile de tous les faire taire.

A noter que cet article, bien qu’entièrement orienté autour de ce sujet, s’applique aussi si vous souhaitez offrir à quelqu’un un accès SSH chrooté et aux commandes limitées.

Mise à jour : Mes mesures de sécurité étaient trop optimistes : Rsync n’utilise pas du SFTP mais doit pouvoir lancer un serveur Rsync sur sa destination en SSH. Voici donc une nouvelle version de cet article, testé et approuvé.

Le problème

Pour décentraliser la chose, les administrateurs de Wikileaks demande à tous les volontaires de leur offrir un accès en SSH à leur serveur pour pouvoir y pousser un miroir de Wikileaks et le garder à jour grâce à Rsync.

Ca qui m’a dérangé c’est le fait de donner un accès SSH à des inconnus sur mon serveur. Mais la solution existe : CHROOTER ce compte à un endroit où il ne peut faire aucun mal au système. Voici comment faire.

Attention : cet article ne porte bien évidemment pas sur la sécurisation de votre serveur. Il présente juste une manière d’éviter que les administrateurs de Wikileaks (que vous ne connaissez pas) aient trop de libertés sur votre serveur (et, oui, je suis paranoïaque sur le coup).

NB : Si vous souhaitez devenir très simplement un miroir Wikileaks et que vous leur faites entièrement confiance, les étapes “Créer l’utilisateur“, “Configurer un nom de domaine et un VirtualHost” et “Soumettre votre miroir à Wikileaks” sont suffisantes.

Sécuriser OpenSSH

On va donner à Wikileaks (ou toute personne ayant leur clé RSA privée) un accès SSH sur notre serveur. Mais on ne veut prendre aucun risque : cet accès n’aura aucune autre possibilité que de déposer des fichiers là où on l’y autorise, c’est-à-dire dans sa home.

Pour cela, modifiez votre fichier /etc/ssh/sshd_config. Vérifiez d’abord que vous avez ces trois lignes qui autorisent la connexion avec une clé publique RSA.

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

Dernièrement, à la fin du fichier créez une nouvelle règle d’override telle que celle-ci :

Match user wikileaks
         ChrootDirectory /home/wikileaks
         X11Forwarding no
         AllowTcpForwarding no

Cette règle est assez explicite et fait simplement en sorte que l’utilisateur wikileaks soit Chrooté dans sa home. Redémarrez SSHd.

Créer l’utilisateur

Rien de bien sorcier :

# mkdir /home/wikileaks
# useradd -d /home/wikileaks -s /bin/bash wikileaks
# chown wikileaks:wikileaks /home/wikileaks

Ensuite autorisons la connexion des administrateurs de Wikileaks :

# su - wikileaks
$ mkdir ~/.ssh
$ wget http://wikileaks.ch/id_rsa.pub -O ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

Pour finir, n’oublions pas de créer le répertoire où sera hébergé le miroir :

$ mkdir ~/www

Créer l’environnement chroot

Pour qu’un chroot fonctionne correctement, il faut que sa racine appartienne à root. Nous créons aussi les deux répertoires indipensables à l’exécution d’un rsync : /bin et /lib.

# chown root:root /home/wikileaks
# mkdir /home/wikileaks/bin
# mkdir /home/wikileaks/lib

Ensuite copions les binaires nécessaires pour faire un Rsync :

# cp `which bash` /home/wikileaks/bin/bash
# cp `which rsync` /home/wikileaks/bin/rsync

Pour que ces binaires fonctionnent, il faut aussi copier les librairies nécessaires. Pour lister ces librairies vous pouvez exécuter un ldd puis copiez une à une ces libraires

# ldd `which bash` `which rsync`
# cp /lib/libncurses.so.5 /home/wikileaks/lib/
...

Attention : si votre serveur est un système 64bits il faudra créer le dossier /home/wikileaks/lib64/ et le peupler avec les librairies venant de /lib64.

Au final vous devriez arriver à une structure proche de celle-ci :

bin
 |- bash
 |- rsync
lib
 |- ld-linux.so.2
 |- libacl.so.1
 |- libattr.so.1
 |- libc.so.6
 |- libdl.so.2
 |- libncurses.so.5
 |- libpopt.so.0

Dès maintenant, si on se chroote dans /home/wikileaks on n’aura que très très peu de possibilités : les commandes internes à bash et rsync.

Un dummyshell

Oui, je suis d’accord, les commandes internes de bash c’est encore trop! Nous permettons un accès SSH qui pourrait potentiellement lancer une fork bomb par exemple. Nous allons donc créer un shell stupide qui ne permet que de lancer un serveur Rsync. Créez le fichier /home/wikileaks/bin/dummyshell :

#!/bin/bash
if (( $# == 0 )); then
        printf "%s\n" "shell access is disabled. sorry."
        exit 1
elif (( $# == 2 )) && [[ $1 == "-c" && $2 == "rsync --server"* ]]; then
        exec $2
fi

Il faut ensuite le rendre exécutable et utilisé comme shell par défaut de l’utilisateur :

# chmod +x /home/wikileaks/bin/dummyshell
# ln -s /home/wikileaks/bin/dummyshell /bin/dummyshell
# usermod -s /bin/dummyshell wikileaks

C’est maintenant officiel, l’utilisateur wikileaks ne peut rien faire de plus que lancer un serveur Rsync ! Et il y a aussi la sécurité du Chroot.

Test

Je vous recommande de tester le tout, pour être sûr que Wikileaks pourra uploader son site sur votre serveur. Pour cela ajoutez votre propre clé RSA dans une nouvelle ligne de /home/wikileaks/.ssh/authorized_keys et tentez d’envoyer un fichier :

$ rsync -ave ssh test.html wikileaks@votreServeur:/www

Vous pouvez également éprouver la sécurité en tentant de vous connecter en SSH ou d’exécuter une commande en SSH -t.

Configurer un nom de domaine et un VirtualHost

Je suppose que vous vous en sortirez sur ce point-là : créez un nom de domaine (ou un sous-domaine) pour votre miroir et configurez votre serveur web en conséquence.

Le DocumentRoot à spécifier est bien /home/wikileaks/www

Profitez-en pour empêcher l’exécution de scripts sur le répertoire :

<Directory "/home/wikileaks/www">
        AllowOverride None
        Options -ExecCGI
</Directory>

Soumettre votre miroir à Wikileaks

Rendez-vous sur http://46.59.1.2/mass-mirror.html et soumettez votre miroir !

Sous “absolute path where we should upload the html data” mettez simplement “/www/”.

Normalement Wikileaks pushera l’entièreté du site sur votre serveur. Félicitations, vous défendez la liberté d’expression sans risque majeur pour votre serveur !