4

Jan

by Maniack Crudelis

Après le dossier de partage sshfs permettant de partager simplement des fichiers entre plusieurs machines.

Je me lance maintenant dans la synchronisation rsync entre plusieurs machines via une connexion ssh et un chiffrement des données.

Nous allons exploiter rsync pour la synchronisation des données, encfs pour le chiffrage des dossiers sur le serveur et ssh pour sécuriser tout nos échanges.

Pré-requis
- Avoir un serveur ssh opérationnel, c'est lui qui hébergera les dossiers cryptés.
- Avoir rsync installé sur le serveur et les clients.

Afin de chiffrer les données stockées sur le serveur, nous allons installer encfs:

apt-get install encfs

A installer sur le serveur qui réceptionnera les données bien évidemment
Encfs à besoin des dépendances suivante: libboost-filesystem1.42.0 libboost-serialization1.42.0 libboost-system1.42.0 librlog5.

** L'usage de encfs n'est pas indispensable, vous pouvez vous passer de encfs si vous ne désirez pas chiffrer les données stockées sur le serveur. **

Toujours sur le serveur, nous allons maintenant configurer encfs.
encfs utilise 2 dossiers pour travailler, un dossier dont le contenu est en permanence chiffré. Nous l'appellerons dir_encrypt. Et un second, vide, sur lequel encfs va monter le premier en déchiffrant son contenu, nous l'appellerons dir_clear.

** Il est important de comprendre que encfs ne va pas dupliquer les données dans le second dossier. Il va simplement donner un accès déchiffré aux données via le second dossier. **

Pour configurer encfs, on tape cette commande:

encfs /media/HD/Dossier_synchro/dir_encrypt /media/HD/Dossier_synchro/dir_clear

encfs va demander si il doit créer les dossiers lui même (si ils n'existent pas). Puis il demande le mode de configuration à choisir.

3 modes de configuration sont proposés:
- Le mode expert (x). Pour les barbares de la cryptographie. Encfs demande de choisir chaque option en détail. Pour ma part je passe mon tour.
- Le mode paranoïaque (p). C'est celui que j'ai choisi, on va pas faire les choses à moitié.
- Le mode normal (defaut).

La différence entre le mode normal et le mode paranoïaque se joue à quelques options qui diffèrent:

Mode paranoïaque:
Taille de clé : 256 bits
Taille de bloc : 512 octets, y compris 8 octets d'en-tête MAC
L'IV des données du fichier est chaînée à l'IV du nom de fichier.

Mode normal:
Taille de clé : 192 bits
Taille de bloc : 1024 octets
File holes passed through to ciphertext.

Choisissez ensuite votre mot de passe et c'est terminé pour la configuration de encfs.
A présent, nous pouvons avoir accès aux données chiffrées par la commande:

encfs /media/HD/Dossier_synchro/dir_encrypt /media/HD/Dossier_synchro/dir_clear

Les données seront ainsi lisibles dans le dossier dir_clear après renseignement du mot de passe.
Pour interdire à nouveau l'accès aux données.

fusermount -u /media/HD/Dossier_synchro/dir_clear

Pour automatiser le déchiffrement du dossier 'dir_encrypt', nous allons placer un script (nommé encfs_mount_umount.sh) dans le dossier 'Dossier_synchro':

#/bin/bash
if [ $1 = 'm' ]
then
        echo Déchiffrage du dossier de synchronisation.
        encfs "/media/HD/Dossier_synchro/dir_encrypt" "/media/HD/Dossier_synchro/dir_clear"
fi
if [ $1 = 'u' ]
then
        echo Fermeture du mount de encfs
        fusermount -u "/media/HD/Dossier_synchro/dir_clear"
fi

Nous pouvons à présent quitter le serveur et revenir à la machine cliente.
Le client va devoir initialisé la connexion ssh avec le serveur, demander l'accès au dossier chiffré, exécuter ses synchronisations rsync et enfin demander à encfs la fermeture du dossier chiffré.
Voyons tous ça en détail.

L'accès au dossier chiffré va se faire simplement de la façon suivante:

ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh m"

On exécute le script présent sur le serveur, en lui demandant l'accès au dossier chiffré par l'argument 'm'.

Dans certains cas, l'argument -t de ssh (qui permet d'obtenir un terminal distant dans lequel le mot de passe à taper ne sera pas visible) provoque une erreur de montage de encfs.
Erreur qui se traduit par: "Noeud final de transport n'est pas connecté".
Dans ce cas on peut remplacer l'argument -t par stty -echo qui retirera tout echo des saisies au clavier.

stty -echo
ssh maniack@crudelis.fr -p 2222 "/media/HD/Dossier_synchro/encfs_mount_umount.sh m"
stty echo

On effectue la synchronisation rsync:

rsync -avzhuE --progress --delete "/media/DOCUMENTS/Mes documents/Fichiers divers" -e 'ssh -p 2222' maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear"

Le dossier 'Fichier divers' va être ainsi synchronisé avec son double sur le serveur.
Je posterais plus tard un article sur rsync, avec d'avantage de détails sur cette commande.

Il ne nous reste plus qu'à refermer l'accès au dossier chiffré:

ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh u"

#!/bin/bash
echo Appel de encfs pour déchiffement.
ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh m"
echo Exécution de rsync pour synchronisation.
rsync -avzhuE –progress –delete "/media/DOCUMENTS/Mes documents/Fichiers divers" -e ‘ssh -p 2222′ maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear"
echo Appel de encfs pour démontage du volume déchiffré.
ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh u"

Toutefois, nous avons là un inconvénient majeur, avec 3 connexions ssh successives, il va falloir retaper 3 fois le mot de passe ssh.
Plus grave encore, si on n'est pas présent lors de la demande de mot de passe pour la dernière connexion. On risque un timeout de ssh. Dés lors, cela signifie que dir_clear restera visible puisqu'on aura jamais demandé la fermeture du dossier.

Pour palier à ce problème, nous allons utiliser ssh-agent. ssh-agent va utiliser votre clé privée ssh pour valider votre identité lors de toute les connexions qui suivront. De fait vous ne donnez votre mot de passe qu'une seule fois, à ssh-agent.
Pour utiliser ssh-agent, nous allons procéder ainsi:

# Lancement de ssh-agent pour automatiser la connection ssh le temps du script.
ssh-agent
# Ajout de la clé privée pour ssh-agent.
ssh-add $HOME/.ssh/id_dsa     #ssh-add demandera le mot de passe pour ouvrir la clé.
# Multiples connexions ssh au sein de votre script.
# Suppression de la clé pour ssh-agent. Car nous ne souhaitons pas que ssh-agent continue à autoriser des connexions sans mot de passe.
ssh-add -d $HOME/.ssh/id_dsa

Ainsi ssh-agent nous permet des connexions ssh sans nécessiter le mot de passe à plusieurs reprise, juste le temps de l'exécution du script.
Cela implique toutefois l'usage d'un couple clé publique/privée. Ce qui n'exclue pas l'usage des connexions par simple mot de passe pour ssh.

#!/bin/bash
echo Lancement de ssh-agent pour automatiser la connection ssh le temps du script.
ssh-agent >> /dev/null
echo Ajout de la clé pour ssh-agent.
ssh-add $HOME/.ssh/id_dsa
echo Appel de encfs pour déchiffement.
ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh m"
echo Exécution de rsync pour synchronisation.
rsync -avzhuE –progress –delete "/media/DOCUMENTS/Mes documents/Fichiers divers" -e ‘ssh -p 2222′ maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear"
echo Appel de encfs pour démontage du volume déchiffré.
ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh u"
echo Suppression de la clé pour ssh-agent.
ssh-add -d $HOME/.ssh/id_dsa

Si on souhaite simplement faire des sauvegardes sur un dossier chiffré, on peut s'arrêter là.
Mais le but ici est de synchroniser plusieurs machines.
Ceci implique qu'on ne veux pas simplement envoyer les données sur le serveur, on veux aussi pouvoir les rapatrier sur le client.
On va donc simplement inverser la commande rsync pour que les données soit synchroniser depuis le serveur vers le poste client.
Ce qui nous donne ça:

#
!/bin/bash

echo "Envoi des données sur le serveur (Synchronisation ascendante): e."
echo "Mise à jour des données sur le poste local (Synchronisation descendante): m."
echo -n "(e/m)?: "
read rep
echo Lancement de ssh-agent pour automatiser la connection ssh le temps du script.
ssh-agent >> /dev/null
echo Ajout de la clé pour ssh-agent.
ssh-add $HOME/.ssh/id_dsa
echo Appel de encfs pour déchiffement.
ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh m"
echo Exécution de rsync pour synchronisation.
if [ $rep = 'e' ] || [ $rep = 'E' ]
  then
    echo Synchronisation ascendante
    rsync -avzhuE –progress –delete "/media/DOCUMENTS/Mes documents/Fichiers divers 1" -e ‘ssh -p 2222′ maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear"
    rsync -avzhuE –progress –delete "/media/DOCUMENTS/Mes documents/Fichiers divers 2" -e ‘ssh -p 2222′ maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear"
  
else
    if [ $rep = 'm' ] || [ $rep = 'M' ]
      then
	echo Synchronisation descendante avec backup
	rsync -avzbhuE --progress --exclude='backup_rsync' --delete --backup-dir=backup_rsync -e 'ssh -p 2222' maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear/Fichiers divers 1" "/media/DOCUMENTS/Mes documents"
 	rsync -avzbhuE --progress --exclude='backup_rsync' --delete --backup-dir=backup_rsync -e 'ssh -p 2222' maniack@crudelis.fr:"/media/HD/Dossier_synchro/dir_clear/Fichiers divers 2" "/media/DOCUMENTS/Mes documents"
      else
	echo Aucune action associée...
    fi
fi
echo Appel de encfs pour démontage du volume déchiffré.
ssh maniack@crudelis.fr -p 2222 -t "/media/HD/Dossier_synchro/encfs_mount_umount.sh u"
echo Suppression de la clé pour ssh-agent.
ssh-add -d $HOME/.ssh/id_dsa

Il suffit maintenant de copier le script sur chacun des clients qui doivent profiter de la synchronisation et le tour est joué.

Comments

  1. themadmax on 06.12.2012

    Salut,
    Bon article mais je ne comprend pas comment tu transmet le mot de passe de chiffrement à encfs ? Il est pas en dur dans le
    fichier encfs_mount_umount.sh ?

  2. Maniack Crudelis on 06.12.2012

    Le mot de passe sera simplement demandé par encfs.
    Dans le cas présent, le script n'est pas autonome, il nécessite la saisie du mot de passe ssh puis encfs.

  3. tuxmika on 12.11.2014

    Bonjour,

    j'ai lu votre avec intérêt votre article, mais est ce normal si le mot de passe s'affiche en clair dans le terminal lorsqu'on utilise la commande encfs pour monter le dossier de synchronisation?

  4. Maniack Crudelis on 12.11.2014

    Bonjour

    Comme indiqué dans l'article, tu peux remplacer l'argument -t de ssh par stty -echo avant la commande et stty echo après.
    Ainsi toute entrée clavier est masquée le temps de la commande.

Leave a Reply