Cloud personnel et synchronisation ou comment se passer des Dropbox like (en milieu hostile...)

Disposer d'un serveur dédié c'est naturellement aussi avoir la capacité de se passer des multiples hébergeurs "cloud" qui, à force d'offres gratuites, ne peuvent que susciter la méfiance.
Le principe est le suivant : je travaille essentiellement avec trois machines :
  1. Mon (beau) PC fixe sous Debian Wheezy
  2. Mon (vieux, mais toujours vaillant) PC portable sous Ubuntu 14.04
  3. Ma (splendide) tablette hybride TF700 sous Android. J'utilise ma tablette pour prendre mes notes au travail. C'est en fait un simple substitut à mon ancien cahier. Je prends mes notes avec un simple éditeur ASCII ce qui me permet de les relire avec n'importe quel outil. La tablette est aussi utilisée pour accéder à mes données.
Il s'agit pour moi de disposer de mes données et de mes notes en permanence sur l'ensemble de ces supports. Le dossier des données pèse environ 10 Go pour 10.000 fichiers et est sur une partition NTFS parce qu'il m'est parfois nécessaire d'y accéder à partir de Windows.

Solution d'évidence actuellement, j'ai installé un serveur Owncloud. Je synchronisais la tablette avec FolderSync en Webdav. Tout a bien marché pendant quelques semaines, même s'il m'arrivait de recevoir l'un de ces messages ésotériques que Owncloud se plaît à envoyer en cas de souci. Au bout de quelque temps, l'instabilité s'est renforcée, les conflits de synchronisation se multipliaient et j'en suis même arrivé à perdre des données. La réinitialisation des clients n'y ayant rien fait, j'ai fini par décider de trouver une alternative. En ce sens, les multiples complaintes que l'on peut trouver au sujet de la synchronisation d'Owncloud se sont, au moins pour moi, révélées fondées. J'ai d'ailleurs beaucoup de mal à comprendre pourquoi cette fonction essentielle semble délaissée au profit du seul développement des fonctions collaboratives. C'est très dommage, Owncloud a un potentiel important et une vraie notoriété. J'ai donc décidé de ne conserver Owncloud que pour la gestion de mes notes (quelques dizaines de fichiers et quelques ko) la charge étant faible.

Après une recherche, je me suis penché sur Seafile qui a visiblement une excellente réputation. L'installation s'est révélée un peu délicate, mais la documentation étant bien faite, j'y suis parvenue sans trop de difficultés (à un détail près, si l'on veut que Seafile pointe sur un sous-domaine, il faut que l'alias pointe sur seafmedia et non sur media comme le dit la doc). Tout marchait parfaitement jusqu'à ce que j'arrive au bureau et que, content de mon nouveau système, je lance le client Seafile. Impossible de se connecter ! Eh oui, Seafile utilise des ports exotiques (10001 ou 12001  par exemple) qui sont naturellement fermés sur notre réseau (je sais que la paranoïa est une qualité des administrateurs systèmes, mais il faut avouer qu'elle est parfois un peu agaçante !)

J'aurais aimé tester BitTorrent Sync, mais les clients BitTorrent sont rarement bienvenus en milieu professionnel (on se demande bien pourquoi...). Ayant eu l'occasion de tester AjaXplorer, je me suis intéressé à Pydio, mais ai finalement renoncé en constatant que le client de synchronisation reste en béta.

En désespoir de cause, j'ai décidé de revenir aux fondamentaux. Puisque je ne trouve pas d'outil "moderne" adapté, je vais simplement reprendre les bases Linux et utiliser Unison, au moins je serai sûr d'avoir quelque chose de fiable et opérationnel. Problème, Unison utilise SSH et le port 22 est fermé au bureau (de même que le port alternatif que j'utilise). Il fallait donc que je me connecte en VPN avant de lancer la synchronisation. Sachant en outre que tout ceci devait être aussi automatique et transparent que possible, j'ai  dû mettre un peu les mains dans le cambouis.

Synchronisation automatique avec Unison et openVPN


On paramètre Unison avec des fichiers "profils" qui sont dans ~/.unison. Ces profils  sont très simples et je vous renvoie à documentation Unison pour en voir les différentes formes. Le mien (syncData.prf) ressemble à ca :

# Roots of the synchronization
root = /Chemin/local/complet
root = ssh://user@IP/chemin/distant/complet

# Ignore
ignore = Name *.avi
ignore = Name *.mkv
ignore = Name *.mpg
ignore = Name *.flv
ignore = Name *.mp4
ignore = Name *.ogv
ignore = Name *.vob
ignore = Name *.mov
ignore = Name *~
ignore = Name ~*
ignore = Name .~*

# id_rsa est la clé ssh qui permet d'éviter de s'identifier
sshargs=-p 0000 -C -i /home/user/.ssh/id_rsa #0000 est le numéro du port SSH
fat = true
#ignorearchives = true
batch = true
times = true
ignorecase = true
perms = 0


Les premières lignes pointent sur les dossiers locaux et distants. On a ensuite la liste des fichiers ignorés (je ne synchronise pas les video, je n'ai pas la fibre à la maison, je fais donc ça en local).
On a ensuite les paramètres SSH. Afin d'avoir un lancement automatique (sans mot de passe), il faut naturellement paramétrer la connexion SSH de manière à ce qu'elle utilise les certificats (voir par exemple ici).
fat permet des gérer les données NTFS.
ignorearchive est commenté. On l'activera simplement quand on souhaite réinitialiser les fchiers d'archive.
batch permet d'assurer la synchronisation sans poser de question (les conflits sont alors ignorés).
times permet de synchroniser les dates des fichiers.
ignorecase et perms sont théoriquement inutiles, du fait de l'option fat, mais se sont révélés nécessaires dans mon cas (!).

On peut alors très simplement lancer la synchronisation avec la fonction unison syncData.

Cryptage

On va crypter les données distantes avec Encfs.
On commence par créer sur le serveur distant 2 dossiers, celui qui contiendra les données cryptées et celui qui servira à l'accès en clair.

mkdir .DataCrypt
mkdir DataClair

Pour accéder aux données, il suffit de monter le dossier crypté dans le dossier en clair.

encfs /chemin/complet/.DataCrypt /chemin/complet/DataClair

Lors du premier appel, on précisera à Encfs les paramètres de cryptage et le mot de passe.

On peut ensuite transférer les données dans le dossier DataClair, le cryptage est alors transparent.
Il suffit de démonter le dossier clair pour supprimer l'accès et ne laisser que les données cryptées.

fusermount -umount DataClair

A partir de là, l'idéal est de monter localement le dossier crypté, par exemple avec un sshfs, puis de le décrypter dans un dossier local (en le montant avec encfs). Dans ce contexte, le serveur distant ne contient jamais de données en clair. Le problème est qu'au moment de la synchronisation, Unison va devoir charger localement un volume potentiellement important de données. La synchronisation est alors trop longue pour être réellement utilisable au quotidien.
Pour accélérer le processus tout en préservant la sécurité autant que faire se peut, j'ai opté pour une solution hybride. On utilisera les données distantes, mais on ne les décryptera que durant la synchronisation. Les échanges se faisant à travers le tunnel SSH, aucune donnée en clair ne circulera.

Synchronisation

Afin d'accéder à la synchronisation de n'importe où (notamment du bureau où les ports SSH sont fermés), on doit au préalable se connecter au VPN. On va donc écrire un script qui connecte le VPN, décrypte les données, lance la synchronisation et enfin démonte le dossier crypté :

#!/bin/bash

# On vérifie que le VPN n'est pas déjà lancé
proc=$(ps aux | grep openvpn | grep uservpn)
if [ "$proc" == "" ]; then
  echo "Création du tunnel"
else
  echo "Le tunnel existe déjà ($proc)"
  exit 0
fi

# On se connecte au VPN
# Le changement de dossier est nécessaire
cd /Chemin complet vers le fichier de configuration openvpn
openvpn config.ovpn &

# On s'assure que le tunnel est bien ouvert
i=0
while [ "$(ifconfig | grep tun)" = "" ]
do   
    sleep 2
    ((i++))
    if [ $i -gt 4 ]
        then
            echo "Connexion impossible"
            killall openvpn
            exit 1
    fi
done

# On monte l'unité cryptée
echo "echo MotDePasseEncfs  | encfs -S /chemin/dossier/crypté /chemin/Dossier/Clair" | ssh user@IP -p0000 #(numéro port SSH)
echo "Montage EFS"

# On lance la synchronisation
unison syncData
echo "Synchronisation terminée"

# On démonte le dossier crypté
echo "fusermount -u /chemin/Dossier/Clair" | ssh user@IP -p0000
echo "Démontage EFS"

# On ferme le tunnel VPN
killall openvpn
echo -n "Entrée pour terminer "
read a
exit


Pour s'assurer que le tunnel est bien ouvert, on ne peut pas se contenter de vérifier le processus, il peut être actif sans que la connexion ne soit établie. On va utiliser ifconfig en vérifiant qu'il y a bien une connexion tun. Au bout de 10 secondes, si la connexion ne s'établit pas on sort.

Dernier point, la fonction doit être lancé en sudo. Là encore, ne voulant pas avoir à entrer un mot de passe, j'ai ajouté la fonction aux paramètres sudo. Pour ca, on lance visudo, puis sur la ligne du groupe des sudoers, on ajoute la fonction NOPASSWD (si l'on veut plusieurs entrées, il faut les séparer par une virgule sans espace).

%sudo   ALL=(ALL:ALL) ALL, NOPASSWD: chemin vers le script


A partir de là,  différents choix sont ouvert :
A noter que l'on peut accéder aux données distantes sous Android avec Encdroid.

Après quelques semaines d'utilisation, je n'ai pas constaté de problème particulier. Comme toujours avec Unison, il est recommandé de lancer de temps à autre une synchronisation avec l'option ignorearchives = true.

Au final, on constate qu'il n'est pas forcément si simple de mettre en place un système utilisable partout, mais avec un peu d'effort, on peut obtenir un résultat fiable et adapté.

fleche-up.png

Date de dernière mise à jourJan 08, 2015