Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ! smile
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.

quent57 a écrit :

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

nordinatueur a écrit :

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

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