Vous balader avec votre petite clé USB contenant vos données personnelles ou sensibles (vos projets, votre journal intime, vos photos personnelles, vos mots de passe, etc.)  n’est pas ce qu’il y a de plus  prudent. À cause de sa taille, une clé USB peut facilement être perdue ou volée.

Chiffrer (crypter) et déchiffrer (décrypter) votre clé USB sous Linux

Pour minimiser le risque que vos données personnelles tombent entre de mauvaises mains, il est fortement recommandé de rendre vos fichiers invisibles à tous ceux qui n’ont pas votre mot de passe !

Grâce au script de cet article, nommé  mount-encfs-dir.sh, et à encfs, vous pourrez facilement sécuriser et sauvegarder les données de votre clé USB avec une interface graphique Zenity facile d’accès.

NOTE : La méthode de cet article est surtout dédiée à ceux qui souhaitent avoir un script transporté avec eux, dans leur clé USB, pour déchiffrer leurs fichiers chiffrés avec encfs, en plus de les sauvegarder. Vous avez intérêt à avoir déjà touché à la ligne de commande. Si vous êtes débutant et que vous ne souhaitez qu’utiliser encfs facilement, l’outil Cryptkeeper disponible dans les dépôts est largement suffisant pour vous (et beaucoup plus facile que les étapes de cet article).

Avertissement : les manipulations qui suivent nécessitent des manipulations à effectuer  avec des droits super-utilisateur (root) dont le mauvais usage peut engendrer des effets néfastes pour votre système.

Étape 1. Trouver le répertoire de votre clé USB.

En général, quand vous insérez une clé USB sous Linux, elle est montée dans le répertoire /media/.

Allez à /media/, avec votre gestionnaire de fichiers, et insérez ensuite votre clé USB. Le répertoire qui apparaîtra dans /media/ est celui que nous cherchons, le « répertoire de votre clé USB ».

Pour vous donner un exemple, dans mon cas, quand j’insère ma clé USB, le répertoire MEMUP apparait dans /media/. Le « répertoire de ma clé USB » est donc /media/MEMUP/.

(Vous pouvez également voir tout ce qui est monté avec la commande mount, sans arguments, si vous préférez le terminal)

Étape 2. Les préparatifs : créer votre coffre fort encfs !

Dans cette étape, vous allez exécuter quelques commandes dans le terminal, afin de créer votre « coffre fort », c’est-à-dire le répertoire chiffré contenant vos fichiers impossibles (en théorie) à lire par ceux qui n’ont pas votre mot de passe encfs.

(Si vous êtes curieux, si vous souhaitez en savoir plus sur encfs, je vous recommande de faire quelques recherches sur Internet. Si vous utilisez Ubuntu, le Wiki d’Ubuntu a consacré un article à encfs)

Pour commencer, lancez un terminal et devenez administrateur (root). Dans certaines distributions, comme Ubuntu, la commande « sudo -s » vous rendra administrateur. Dans d’autres distributions, c’est la commande « su » qui aura le même effet. Si vous ne savez pas laquelle choisir, testez les deux, pour choisir celle qui accepte votre mot de passe 😉 .

Une fois que vous serez devenu administrateur (pour le vérifier, la commande « id -u » doit afficher zéro), allez vers le répertoire de votre clé USB avec la commande « cd » :

cd /media/NOM_DE_VOTRE_CLE

(dans mon cas, j’ai remplacé NOM_DE_VOTRE_CLE par MEMUP, comme dit dans l’Étape 1)

Créez deux répertoires dans votre clé USB :

mkdir -p .coffre fichiers

Puis créez un répertoire chiffré avec encfs :

encfs "$(pwd)/.coffre" "$(pwd)/fichiers"

Encfs vous affichera ceci :

Creating new encrypted volume.
Please choose from one of the following options:
 enter "x" for expert configuration mode,
 enter "p" for pre-configured paranoia mode,
 anything else, or an empty line will select standard mode.
?>

Tapez la touche entrée pour que encfs prenne les options par défaut (pas la peine d’être parano et choisir  « p », cela vous imposera plus de contraintes que d’avantages. Mais si vous le souhaitez, pourquoi pas 😉 )

Ensuite, Encfs vous demandera d’entrer votre mot de passe (vous l’utiliserez à chaque fois que vous souhaiterez que vos données chiffrées soient visibles) :

Now you will need to enter a password for your filesystem.
You will need to remember this password, as there is absolutely
no recovery mechanism.  However, the password can be changed
later using encfsctl.

New Encfs Password:
Verify Encfs Password:

Ne vous inquiétez pas si rien ne s’affiche quand vous entrez votre mot de passe. C’est voulu (de cette façon, si une personne est assise à côté de vous ou espionne votre écran avec des jumelles 😛 , elle ne devinera pas le mot de passe que vous êtes en train de taper. Et c’est moi en plus qui dit qu’il ne faut pas être parano 😀 ).

Je vous recommande de choisir un mot de passe avec au moins 10 caractères, contenant un mélange de chiffres, de lettres en majuscule et minuscule, pour rendre la tâche très difficile à ceux qui souhaitent lire vos données grâce à la méthode force brute par exemple.

Si tout se passe bien, le répertoire « fichiers » sera monté (vous pouvez vérifier avec la commande mount comme dit plus haut).

Lancez cette commande pour le démonter :

fusermount -u fichiers

Enfin, avant de passer à l’étape suivante, si vous souhaitez que votre utilisateur normal puisse utiliser encfs, ajoutez le au groupe d’encfs (c’est assez important. De cette façon, vous n’aurez pas, dans le futur, à utiliser le compte root / l’administrateur à chaque fois que vous voudrez lire les données de votre clé USB).

Les groupes diffèrent d’une distribution Linux à une autre, mais dans le cas d’Ubuntu par exemple, c’est les groupes plugdev (pour autoriser la lecture des clés usb) et fuse (pour avoir le droit d’utiliser encfs, et d’autres programmes fuse, comme sshfs).

Les commandes suivantes ajouteront votre utilisateur aux groupes qu’il faut pour utiliser encfs avec un simple utilisateur, sous Ubuntu ou Debian (pour les autres distributions, faites une vérification dans votre documentation sur encfs !) :

gpasswd -a VOTRE_UTILISATEUR fuse
gpasswd -a VOTRE_UTILISATEUR plugdev

Étape 3. Installer le script mount-encfs-dir.sh dans votre clé usb !

Téléchargez le script mount-encfs-dir.sh dans le répertoire de votre clé usb avec wget :

wget https://www.asher256.com/mes-fichiers/programmes/mount-encfs-dir.sh

Ensuite, installez Zenity, un outil important pour que mount-encfs-dir.sh ait une interface graphique. Sous Ubuntu, cela se fait avec la commande :

sudo apt-get install zenity

Étape 5. Votre premier test !

Lancez le script mount-encfs-dir.sh avec la commande :

sh mount-encfs-dir.sh

Vous pouvez aussi sous GNOME, avec Nautilus, double cliquer dessus pour le lancer.

Une fois lancé, une petite interface s’affichera vous demandant votre mot de passe, puis ensuite vous demandant de faire une sauvegarde (similaire aux logiciels de sauvegarde et archive d’Internet). Par défaut, si vous acceptez de faire une sauvegarde, tous vos fichiers seront sauvegardés en clair dans /home/<votreuser>/.save_usb_stick/ (par précaution, pour au moins avoir des fichiers non chiffrés chez vous).

Étape 6. Découvrir, personnaliser et lire le script mount-encfs-dir.sh

Ce script est utile pour que vous n’ayez pas à lancer la commande encfs manuellement, il s’occupe pour vous de monter et démonter votre coffre fort avec une interface simple Zenity. En plus, il vous encouragera à sauvegarder vos données à chaque fois que vous monterez et démonterez votre coffre fort, ce qui est très important pour la sécurité de vos données importantes !

Pour votre information, sachez qu’il est possible de personnaliser le script grâce aux variables globales disponibles au début du code source de mount-encfs-dir.sh.

Il est possible de lire code source directement depuis cet article pour savoir de quelles variables je parle (et pour le lire, si vous aimez la programmation 😉 !) :

#!/bin/bash
#
# mount-encfs-dir.sh
#
# Programme pour monter graphiquement, grâce à Zenity, votre
# répertoire chiffré encfs. Utile pour protéger les
# fichiers de votre clé USB.
#
# (Il faut installer zenity pour que ce programme
# fonctionne graphiquement)
#
# License : GPL
#
# Auteur : Asher256
# Email  : contact at asher256 dot com
# Site   : https://www.asher256.com/
#

#============== VARIABLES A MODIFIER =================
# (Variables utiles pour personnaliser le script)

# Répertoire dans lequel le répertoire chiffré sera monté
mount_dir="fichiers"

# Répertoire contenant les fichiers chiffrés
encrypted_dir=".coffre"

# Répertoire de sauvegarde
save_dir="$HOME/.save_usb_stick"

# save_source_dir contient ce qui doit être sauvegardé
# dans save_dir (variable plus haut).
#
# Si vous mettez dans save_source_dir "$mount_dir", la
# sauvegarde dans $save_dir ne sera PAS chiffrée
# (recommandé, au cas où les données ne sont plus
# accessibles pour une raison ou une autre). En
# revanche, si vous mettrez "$encrypted_dir" dans
# save_source_dir, la sauvegarde sera chiffrée.
save_source_dir="$mount_dir"

#=====================================================

#
# Fonction pour Lancer la sauvegarde.
#
do_save() {
	# Supprimer l'ancienne savegarde
	rm -fr "$save_dir"
	mkdir -p "$save_dir"

	if [ "$DISPLAY" = "" ]; then
		# Sauvegarde texte
		while true; do
			echo -n "Voulez-vous sauvegarder vos données '$save_source_dir' dans '$save_dir' ? [y/n] "
			read response

			if [ "$response" = "y" ]; then
				echo "Sauvegarde en cours..."
				cp -Rf "$0" "$save_source_dir" "$save_dir"
				break
			else
				break
			fi
		done
	else
		# Sauvegarde graphique
		if zenity --question --text "Voulez-vous sauvegarder vos données '$save_source_dir' dans '$save_dir' ?"; then
			cp -Rvf "$0" "$save_source_dir" "$save_dir" | zenity --progress --pulsate --title="Sauvegarde" --text="Sauvegarde en cours..."
		fi
	fi
}

#
# Fonction pour lancer le montage du répertoire chiffré.
#
# $1 contient le mot de passe encfs (facultatif).
#
do_mount() {
	if [ "$1" != "" ]; then
		# Si le mot de passe est défini, l'utiliser !
		echo "$1" | encfs --stdinpass -v "`pwd`/$encrypted_dir/" "`pwd`/$mount_dir/"
	else
		# Si le mot de passe n'est pas défini, monter sans mot de passe (il sera
		# demandé par encfs).
		encfs "`pwd`/$encrypted_dir/" "`pwd`/$mount_dir/"
	fi
}

#
# Afficher un message (graphique ou texte, selon $DISPLAY)
#
message() {
	if [ "$DISPLAY" = "" ]; then
		echo "$@"
	else
		zenity --info --title "Message du montage" --text "$*"
	fi
}

#
# Retourne vrai si le montage a déjà été effectué.
#
already_mounted() {
	if mount | grep "$(pwd)/$mount_dir" | grep encfs >/dev/null 2>&1; then
		return 0
	fi

	return 1
}

#
# Fonction principale (main) pour le texte
#
main_text() {
	if already_mounted; then
		echo "La partition chiffrée est déjà montée dans '$mount_dir'."
		echo
		echo "Appuyez sur la touche entrée pour la démonter..."
		read
		do_save
		fusermount -u "$mount_dir"
	else
		do_save

		# s'il n'est pas monté, faire le montage !
		if do_mount; then
			echo "Montage dans '$mount_dir' fait avec succès ! ;-)"
		else
			echo "Erreur lors du montage de '$encrypted_dir' dans '$mount_dir' !"
		fi
	fi
}

#
# Fonction principale (main) mais graphique avec Zenity
#
main_gui() {
	if ! which zenity >/dev/null; then
		echo "Le programme Zenity n'a pas été trouvé ! Tout se fera en mode texte..."
		echo
		main_text
		exit 0
	fi

	if ! already_mounted; then
		title="Mot de passe de déchiffrement"
		label="Entrez votre mot de passe pour déchiffrer '$encrypted_dir' dans '$mount_dir' :"
		while true; do
			password=$(zenity --entry --hide-text --title "$title" --text "$label")
			if [ "$?" -eq "0" ]; then
				if [ "$password" = "" ]; then
					message "Vous devez entrer un mot de passe."
					continue
				fi

				# lancer le montage...
				if do_mount $password; then
					message "La partition a été montée avec succès !"
					do_save
					break
				else
					message "Erreur lors du montage de la partition..."
				fi
			else
				# l'utilisateur clique sur Annuler...
				break
			fi
		done
	else
		do_save

		if zenity --question --text "Voulez-vous démonter la partition chiffrée '$mount_dir' ?"; then
			result=$(fusermount -u "$mount_dir" 2>&1)
			if [ "$?" -ne "0" ]; then
				echo -e "Erreur lors du démontage de '$mount_dir'.\n\n$result" | zenity --text-info
			else
				message "Le démontage de '$mount_dir' a effectué avec succès !"
			fi
		fi
	fi
}

#
# Premiers tests
#
first_tests() {
	# le script se déplace au répertoire dans lequel il est
	cd `dirname $0` || exit 1

	# tests si nous sommes dans les bons répertoires
	if ! [ -d "$mount_dir" ]; then
		message "Le répertoire $(pwd)/$mount_dir n'a pas été trouvé !"
		exit 1
	fi

	if ! [ -d "$encrypted_dir" ]; then
		message "Le répertoire $(pwd)/$encrypted_dir n'a pas été trouvé !"
		exit 1
	fi
}

# Lancer l'opération de montage
first_tests
if [ "$DISPLAY" = "" ]; then
	main_text
else
	main_gui
fi

exit 0