Bonjour !
J'ai commencer un script pour chiffrer les fichiers que je dépose sur Ubuntu One.
J'utilise bash,
Nautilus Script,
zenity et
encfs.
Les scénarios sont les suivants.
Création d'un répertoire sécurisé.
Je veux publier sur Ubuntu One des données sensibles/personnelles.
Je fais un clic droit sur mon répertoire tata -> Scripts -> SecureUbuntuOne.sh.
On me demande un mot de passe.
.tata_crypted est créé.
On peut partager .tata_crypted sur Ubuntu One sans soucie.
Prochain reboot, utilisation sur le même PC
Je clic droit sur mon répertoire qui doit contenir mes fichiers "lisibles" : tata (le même que pour la création).
Scripts -> SecureUbuntuOne.sh ... demande de mot de passe ...
Le contenu du répertoire chiffré est monté dans ce dossier.
Un autre appel à SecureUbuntuOne.sh referme l'accès, tata est alors bloqué en lecture/écriture pour ne pas se tromper.
Utilisation depuis un autre PC (à venir)
Je synchronise le répertoire chiffré tata via UbuntuOne.
J'affiche les fichiers cachés, clic droit sur 1 / plusieurs répertoires.
Scripts -> SecureUbuntuOne.sh ...
Le répertoire tata est crée (seulement .tata_crypted était apparu avec la synchro) (à venir).
Je peut utiliser facilement mon répertoire.
* Nautilus script permet d'appeler simplement le programme avec un clic droit sur 1/plusieurs répertoires.
* Zenity permet d'avoir une interface conviviale (mais avec beaucoup de fenêtres ...).
* Encfs s'occupe du chiffrement. L'avantage de ce logiciel est que chaque fichier est chiffré dans un fichier distinct, ainsi si on en modifie un, Ubuntu One ne ré-upload pas le tout, mais uniquement le fichier modifié, comme dans une utilisation classique de Ubuntu One. Un autre avantage : dès que l'on modifie un fichier dans tata, il est re-chiffré/supprimé en temps réel.
Voici le script :
#!/bin/bash
# Développeur : Quentin Bérard : dev@quent.fr
# Licence Creativ Common BY - SA http://creativecommons.org/licenses/by-sa/2.0/fr/ ou GPL v3
# version 1.0beta, avis au beta testeurs :)
#BUG
# - 1 - Nautilus ne se rafraichit pas comme il faut pendant la création/supression du repertoire chiffré
#TODO
# - bug 1, avertir le système de fichier que il y a eu un changement, comment ?
# - afficher des jolies icones sur les repertoires nautilus.
# - bug 1, alternative 2 : rapport de bug à encfs.
debug=false
#prend 1 argument : chemin "normal".
#retourne 0 si il est monté, 1 sinon.
isMount()
{
mount | grep "on $1 type"
return $?
}
# Retourne 0 si l'utilisateur a accepté et pas de problème
# 1 sinon
# écrit sur stdout le mot de passe tapé
demanderMotDePasse()
{
if ret=`zenity --entry --title="Chifrement des dossier Ubuntu One" --text="Veuillez entrer le mot de passe qui protège vos fichiers et dossiers (mot de passe encfs)." --hide-text`
then #ok
mdp=$ret
if [ "$mdp" = "" ]
then
zenity --info --title="test" --text="Il faut entrer un mot de passe non vide !";
return 1
fi
else #annuler
return 1
fi
echo $mdp
return 0
}
# arg1 : repertoire qui contient les données en claire
# démonte ce repertoire
unmountDir()
{
NORMAL_DIR=$1
CMD="fusermount -u "$NORMAL_DIR"" &&
RET=$(fusermount -u "$NORMAL_DIR") &&
REUSSI=$? &&
if $debug ; then
{
echo "Valeur de retour de la commande $CMD : \$?=$REUSSI, retour : $RET"
} fi
if [ $REUSSI -eq 1 ];
then
zenity --error --title="Erreur" --text="Le dossier n'a pas pus être démonté correctement.\n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR\n\nVoici le retour de la commande de démontage : $RET"
return 1
else
zenity --info --title="OK" --text="Le démontage c'est passé correctement. $RET"
return 0
fi
}
#monte l'arg 2 (rep chiffré) dans l'arg 1 (rep normal).
mountDir()
{
NORMAL_DIR=$1
CRYPTED_DIR=$2
# on sait que le repertoire de données chifrées existe, on vérifie qu'il contient encfs*.xml
cd "$CRYPTED_DIR"
ls .encfs*.xml
if [ ! $? -eq 0 ] ;
then # le fichier de chiffrement n'est pas présent
zenity --error --title="Debug" --text="Le repertoire $CRYPTED_DIR est présent, pourtant il ne contient pas le fichier .encfs*.xml. Supprimez le repertoire $CRYPTED_DIR"
return 1
fi
# on vérifie que le repertoire de montage est vide
cd "$NORMAL_DIR"
ls *
if [ $? -eq 0 ] ;
then # le repertoire a du contenu
zenity --error --title="Debug" --text="Le repertoire $NORMAL_DIR \ncontient des fichiers ou des dossiers, il ne devrait pas, déplacez-les ou supprimez-les. \n\nContenu : \n$(ls "$NORMAL_DIR")"
return 1
fi
#demande mot de passe
mdp=$(demanderMotDePasse)
if [ ! $? -eq 0 ] ;
then
return 1
fi
#############
# Commande encfs de montage du repertoire chiffré dans l'autre
#############
RET=$(echo $mdp | encfs "$CRYPTED_DIR" "$NORMAL_DIR" --standard --stdinpass )
if [ ! $? -eq 0 ] ;
then
zenity --error --title="Debug" --text="Erreur de création de l'accés au repertoire chiffré. \n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR\n\nValeur de retour de la commande \necho $mdp | encfs "$CRYPTED_DIR" "$NORMAL_DIR" --standard --stdinpass \n : $RET"
return 1
fi
#confirmation
zenity --info --title="test" --text="Vous pouvez maintenant acceder aux données chiffrés.\n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR\n\n $RET"
return 0
}
# Création du repertoire chiffré.
# arg 1 : rep normal
# arg 2 : rep chiffré
createCryptedDir()
{
NORMAL_DIR=$1
CRYPTED_DIR=$2
# etes vous sûr ?
if ret=`zenity --question --title="test" --text="Etes-vous sur de vouloir créer un nouveau repertoire chiffré ?\nUn mot de passe vous sera demandé 2 fois par sécurité.\n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR"`
then #ok
echo
else #annuler
return 1
fi
#on vérifie si le repertoire de destination contient déja des fichiers, si oui, on les met de coté.
contenu=false
cd "$NORMAL_DIR"
ls *
if [ $? -eq 0 ] ;
then # le repertoire à du contenu.
contenu=true
if ret=`zenity --question --title="test" --text="Le repertoire à chiffré contient des fichiers/dossiers, êtes vous d'accord pour les ajouter au repertoire chiffré ?\n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR"`
then #ok
echo
else #annuler
return 1
fi
# on déplace dans un dossier au nom non déja existant !.
REP_TEMP="$(dirname "$NORMAL_DIR")/$(basename "$NORMAL_DIR")__temp_ScriptQuentinBerard"
mkdir "$REP_TEMP"
if [ ! $? -eq 0 ] ;
then
zenity --error --title="Debug" --text="Erreur de création du repertoire temporaire. Stocker le contenu de $NORMAL_DIR ailleur."
return 1
fi
cd "$NORMAL_DIR"
mv * "$REP_TEMP"
fi
cd
#demande mot de passe (2 fois)
mdp=$(demanderMotDePasse)
if [ ! $? -eq 0 ] ;
then
return 1
fi
mdp2=$(demanderMotDePasse)
if [ ! $? -eq 0 ] ;
then
return 1
fi
if [ $mdp != $mdp2 ];
then
zenity --error --title="Debug" --text="Les 2 mots de passes sont diférents, recommencez."
return 1
fi
# création du repertoire chiffré
mkdir "$CRYPTED_DIR"
#############
# Commande encfs de création puis montage du répertoire chiffré dans l'autre
#############
RET=$(echo $mdp | encfs "$CRYPTED_DIR" "$NORMAL_DIR" --standard --stdinpass )
if [ ! $? -eq 0 ] ;
then
zenity --error --title="Debug" --text="Erreur de création du repertoire chiffré. \n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR\n\nValeur de retour de la commande \necho $mdp | encfs \"$CRYPTED_DIR\" \"$NORMAL_DIR\" --standard --stdinpass \n: $RET"
rmdir "$CRYPTED_DIR"
return 1
fi
#confirmation
zenity --info --title="test" --text="La création du repertoire chiffré à réussi.\n\nRepertoire contenant les données claires : $NORMAL_DIR\nRepertoire contenant les données chiffrées : $CRYPTED_DIR \n\nencfs à dit : \n$RET"
# restauration du contenu éventuel
if $contenu ;
then
cd "$REP_TEMP"
mv * "$NORMAL_DIR"
cd
rmdir "$REP_TEMP"
fi
return 0
}
#param 1 : dossier à traiter (non chiffré).
traiterDossier()
{
NORMAL_DIR=$1
CRYPTED_DIR="`dirname "$NORMAL_DIR"`/.`basename "$NORMAL_DIR"`_crypted";
if $debug ; then
{
echo "normal dir : $NORMAL_DIR"
echo "crypted dir : $CRYPTED_DIR"
} fi
isMount "$NORMAL_DIR"
if [ $? -eq 0 ] ;
then # dossier monté
echo "on démonte"
unmountDir "$NORMAL_DIR"
if [ $? -eq 0 ] ;
then
chmod a-r "$NORMAL_DIR"
fi
else # dossier pas monté
chmod u+r "$NORMAL_DIR"
ls "$CRYPTED_DIR"
if [ $? -eq 0 ] ;
then # le dossier existe
echo "on monte"
mountDir "$NORMAL_DIR" "$CRYPTED_DIR"
else # le dossier n'existe pas
echo "on cré puis monte"
createCryptedDir "$NORMAL_DIR" "$CRYPTED_DIR"
fi
fi
}
##################
# Début script
##################
if $debug ; then
{
echo "Arguments recu de nautilus : $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS";
} fi
#itération sur les dossier selectionné : on apelle traiterDossier sur chaques dossiers
OLDIFS=$IFS
IFS='
'
for arg in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
IFS=$OLDIFS # pour ne pas poluer le reste du programme
traiterDossier "$arg"
IFS='
'
done
if $debug ; then
{
echo "fin"
} fi
Prérequis avant de lancer le script : Installer [url=apt://fuse-utils]fuse-utils[/url] et [url=apt://encfs]encfs[/url].
Il faut donc enregistrer ce fichier dans SecureUbuntuOne.sh, et placer ce fichier dans ~/.gnome2/nautilus-scripts
Penser aussi à le rendre exécutable.
Une version plus à jours peut se trouver ici :
quent.fr/temp/SecureUbuntuOne.sh
Astuce : synchroniser ~/.gnome2/nautilus-scripts en claire avec Ubuntu One , si vous n'avez aucun script confidentiel ! 🙂
Ainsi vous l'aurez sur tout vos pc, et dans la même version de surcroît !
Le script fonctionne bien pour les 2 premiers scénarios, mais pour l'instant pour le troisième, il faut créer "tata" à la main.
Je demande de l'
aide sur ces points (mon TODO !) si des gens sont motivés ? :
- Pour l'instant le fichier .encfs6.xml est déposé sur le serveur Ubuntu One, est-ce une faille de sécurité ??
- Comment changer les emblèmes (icones) des répertoires dans nautilus ?
- Comment ajouter automatiquement un dossier dans les dossiers synchronisés Ubuntu One ? (il faudra sûrement jeter un coup d'oeil au code du client).
- Il y aurait-il un moyen de lancer mon script quand on commence la synchro d'un nouveau répertoire avec Ubuntu one ? Ce ne doit pas être simple, je pense que je rêve un peu. Ce sera sûrement la seul partie à faire à la main au final.
- Comment notifier au système qu'un changement de l'arborescence / du système de fichier a eu lieu ? (Je veux que le système envoit un événement inotify à tous les programme en écoute, dont nautilus). En effet nautilus ne se met pas à jours tout seul après un montage d'un répertoire avec encfs.
- Un bug trouvé : Les noms de fichiers trop long ne passent pas dans encfs, et c'est mal géré pour le retour utilisateur.
- Une compression est-elle possible ? pour quel gain ?
Je pense que le tout marche et qu'il n'y a pas de BUG critique. Je place en beta le temps de m'en servir un peu et d'avoir quelques retours. (Il n'y a qu'une aprem et une nuit de dev' là, j'ai pus faire des erreurs).
Les désavantages d'une telle méthode
* Si l'on oublie le mot de passe, pas de récupération possible.
* Les fichiers ne sont plus consultables sur le site Ubuntu One
Merci à ce fil pour m'avoir donné l'idée :
http://forum.ubuntu-fr.org/viewtopic.php?id=391271
Merci également à zenity-generator.
Merci d'avance pour vos retours
Cordialement
Quent57