#1 Le 02/05/2011, à 00:42
- quent57
[Nautilus Script] Chiffrement des fichiers publiés sur Ubuntu One
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 fuse-utils et encfs.
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
Dernière modification par quent57 (Le 02/05/2011, à 01:35)
En maintenance ... http://www.tux.quent.fr/
Hors ligne
#2 Le 05/05/2011, à 19:08
- Zakhar
Re : [Nautilus Script] Chiffrement des fichiers publiés sur Ubuntu One
Beau travail !
Moi je suis dans un "use case" (cas d'utilisation) un peu différent, car je partageais ainsi des fichiers pour ma mère de façon "transparente" au démarrage de son PC. Et pour qu'elle n'ait pas à taper quoi que ce soit, tout était scripté y compris le montage du encfs avec son mot de passe (autre "faille", mais de nature différente)...
Et comme tout était scripté, en réalité les fichiers déposés que Ubuntu One étaient des copies des fichiers dans le répertoire chiffré, et donc la clé (.encfs6.xml) n'était pas déposée sur Ubuntu One.
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é ??
Oui effectivement, c'est une faille.
La présence de ce fichier révèle presque à coup sûr qu'il s'agit de fichier chiffrés par encfs, et l'hébergeur pourrait tenter de déchiffrer les fichiers en utilisant un algorithme "brute force" ou en exploitant toute faiblesse du mécanisme qui pourrait être découverte dans le futur puisqu'il dispose de la partie du fichier pour tester un déchiffrement. Notamment si tu mets un mot de passe "faible", le déchiffrement va être assez facile.
Je viens de faire un test rapide (donc à confirmer en testant mieux et plus précisément), il y a un moyen très simple de "contourner" cette faille.
=> Tu déplaces le .encfs6.xml dans un endroit à l'extérieur de la visibilité des répertoires répliqués par Ubuntu One
=> Tu crées un lien symbolique portant le nom .encfs6.xml vers le fichier ainsi copié.
J'ai fait ce test dans /tmp, et ça fonctionne parfaitement.
Je te laisse le faire avec U1, car depuis que ma mère a sa Freebox 6, j'utilise plutôt dl.free.fr qui permet de mettre les fichiers à télécharger directement sur la Freebox et donc évite à avoir à laisser le PC allumé de longues heures. Par conséquent je n'utilise plus U1 pour mes échanges "familiaux".
De la sorte, et si ça fonctionne avec U1, il n'y aura plus qu'un lien symbolique sur U1 et non pas le fichier réel.
L'inconvénient est alors qu'il te faut un autre moyen pour transporter ce fichier sur l'autre PC où tu utilises U1, et il faut que le lien symbolique pointe au même endroit, donc que le répertoire où tu as stocké ce fichier existe aussi sur les répliques.
Dernière modification par Zakhar (Le 05/05/2011, à 19:10)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#3 Le 12/05/2011, à 13:37
- nordinatueur
Re : [Nautilus Script] Chiffrement des fichiers publiés sur Ubuntu One
Coucou !
Je viens de voir un peu ton script, et si je peux me permettre de te soumettre des améliorations ...
Au lieu de ça :
mdp=$(demanderMotDePasse)
if [ ! $? -eq 0 ] ;
then
return 1
fi
Tu peux mettre :
if ! mdp=$(demanderMotDePasse)
then
return 1
fi
Ou même :
mdp=$(demanderMotDePasse) || return 1
Au début du script, j'ai ajouté la ligne (en fait il suffit de l'ajouter avant l'utilisation des variables nautilus-script.)
LISTE_FICHIERS=${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS:-${@}}
Et je remplace $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS par $LISTE_FICHIERS, dans les deux occurrences en fin de script.
Ainsi, on peut le lancer aussi en ligne de commande ET l'utiliser avec Thunar... :-D
Aussi la fonction demanderMotDePasse, remplit une variable « ret », puis tu la déverses dans « mdp »... Autant utiliser « ret » ou bien l'appeler « mdp »...
Enfin pour la substitution de commandes, il vaut mieux utiliser $( commande ), que `commande` ...
Sinon je trouve que c'est une très bonne initiative !
Merci :-D
Dernière modification par nordinatueur (Le 12/05/2011, à 13:38)
Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !
Hors ligne
#4 Le 12/05/2011, à 21:02
- quent57
Re : [Nautilus Script] Chiffrement des fichiers publiés sur Ubuntu One
Coucou !
Je viens de voir un peu ton script, et si je peux me permettre de te soumettre des améliorations ...
Au lieu de ça :mdp=$(demanderMotDePasse) if [ ! $? -eq 0 ] ; then return 1 fi
Tu peux mettre :
if ! mdp=$(demanderMotDePasse) then return 1 fi
Ou même :
mdp=$(demanderMotDePasse) || return 1
Au début du script, j'ai ajouté la ligne (en fait il suffit de l'ajouter avant l'utilisation des variables nautilus-script.)
LISTE_FICHIERS=${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS:-${@}}
Et je remplace $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS par $LISTE_FICHIERS, dans les deux occurrences en fin de script.
Ainsi, on peut le lancer aussi en ligne de commande ET l'utiliser avec Thunar... :-DAussi la fonction demanderMotDePasse, remplit une variable « ret », puis tu la déverses dans « mdp »... Autant utiliser « ret » ou bien l'appeler « mdp »...
Enfin pour la substitution de commandes, il vaut mieux utiliser $( commande ), que `commande` ...
Sinon je trouve que c'est une très bonne initiative !
Merci :-D
Merci pour les infos !
j'ai toujours un peu de mal avec certaines subtilités du bach ! mais l'écriture
mdp=$(demanderMotDePasse) || return 1
me parrais beaucoup plus claire ! (et surtout plus concise), je vais essayer de l'utiliser plus !
Concernant
LISTE_FICHIERS=${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS:-${@}}
je ne comprend pas comment cela marche, peut tu m'expliquer ? (je ne connais pas la syntaxe :-${@}.
Cela ne vaudrais pas le coup d'y ajouter a la doc page "nautilus script" ?
Et pour les 2 dernier c'est de l'inattention (j'ai changé le doc et me retrouve avec un truc ret inutile !), mais je corrigerai.
Je n'ai pas trop le temps c'est temps ci (vive les exams), mais je tenterai d'améliorer un peu ceci !
PS, note :
- signaler si encfs n'est pas installé.
- utiliser les notification ubuntu
- retrouver la lib basée sur zenity (qui permet de faire des fenêtre un peu mieux) et l'utiliser
En maintenance ... http://www.tux.quent.fr/
Hors ligne
#5 Le 12/05/2011, à 23:52
- nordinatueur
Re : [Nautilus Script] Chiffrement des fichiers publiés sur Ubuntu One
C'est une syntaxe un peu particulière, que j'ai mis du temps à apprendre en épluchant le man bash.
${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS:-${@}}
contient $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS. Si elle est vide ou inexistante, elle contiendra la chaine après « :- »
Si tu veux essaye le man bash, et fais une recherche de « parameter:-word » (initialise la recherche avec / )
C'est certainement mieux expliqué.
Pour les dépendances, cette fonction prend en argument le programme dont tu veux tester l'existence :
isInstalled ()
{
which ${1} || { echo "${1} n'est pas installé"; exit; } ;
return 0;
}
« which » retourne le chemin complet de l'exécutable et retourne un code true s'il existe, false sinon.
Pour les notifications, j'utilise « notify-send » qui vient du paquet « libnotify-bin » qui n'est pas installé par défaut.
La commande est alors :
notify-send -i $icone "Titre en gras" "Explications ..."
Et j'essaye aussi de trouver un meilleur moyen de prendre des informations que zenity. Zenity est très bien, mais pas pratique.
Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !
Hors ligne
#6 Le 13/05/2011, à 17:01
- quent57
Re : [Nautilus Script] Chiffrement des fichiers publiés sur Ubuntu One
Merci pour les infos !
Pour le programme auquel je pensai, en remplacement de zenity, j'ai retrouvé ! c'est yad.
Yad sur Google Code
Un dépot pour yad : Y ppa manager sur Launchpad -> ppa:webupd8team/y-ppa-manager
En maintenance ... http://www.tux.quent.fr/
Hors ligne