Je souhaite monter mon ancienne partition domestique chiffrée lorsque je me connecte à ma nouvelle installation. Les foyers utilisent le cryptage par défaut Ubuntu (eCryptFS). Mon ancienne et ma nouvelle installation utilisent le même mot de passe. Comment cela peut-il être fait tout en sécurisant le cryptage?
Ps l'ancienne installation est toujours opérationnelle et j'ai la clé de cryptage.
J'ai essayé cela sur XFCE, mais je ne suis pas sûr si Unity/Gnome/KDE/etc sont tous les mêmes pour les fichiers de démarrage run-on-login, donc YMMV.
Un fichier .desktop dans ~/.config/autostart sera exécuté lors de la connexion, lui indiquant d'exécuter un script bash qui monte votre dossier chiffré devrait fonctionner. Puisque votre maison est déjà cryptée, vous pourriez stocker l'autre phrase secrète de montage dans le script bash, pas une sécurité parfaite mais toujours cryptée sur le disque, si vous ne l'avez pas fait '' Je ne veux pas y entrer à chaque fois. Par exemple ~/.config/autostart/test.desktop
. Un très basique comme celui-ci devrait fonctionner:
[Desktop Entry]
Type=Application
Exec=/home/user/.config/autostart/runme.sh
Ou pour attendre quelques secondes avant de démarrer (par exemple, donnez au bureau le temps de s'initialiser avant de demander une phrase secrète) et exécutez en tant que root, essayez ceci:
[Desktop Entry]
Type=Application
Exec=Sudo bash -c "sleep 5; /home/user/.config/autostart/runme.sh"
Ou s'il a besoin de plus de détails, copiez et éditez un existant (s'il y en a), ou il devrait y avoir un moyen GUI pour en faire un sous Système → Préférences → Applications de démarrage , puis cliquez sur Ajoutez . Ou plusieurs lignes comme celle-ci devraient également fonctionner (pour XFCE de toute façon, coupez probablement la ligne OnlyShowIn):
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=test.sh
Comment=test.sh
Exec=/home/user/.config/autostart/test.sh
OnlyShowIn=XFCE;
StartupNotify=false
Terminal=true
Hidden=false
Il exécute simplement le fichier cible et ne fonctionne pas avec Exec=~/.config/autostart/test.sh
donc remplacez "utilisateur" en conséquence. Vous pourriez probablement utiliser une longue ligne au lieu de la pointer vers un script bash.
Je regarde maintenant la partie montage, testant avec un PC virtuel. Il y a quelques complications puisque vous utilisez déjà eCryptFS avec une maison chiffrée, et j'ai testé il y a quelque temps et vous ne pouvez pas avoir une maison chiffrée et un autre dossier "Privé" chiffré dans votre maison (avec encrypted-setup-private
& encrypted-mount-private
), mais en utilisant simplement ecryptfs-add-passphrase
& appelant mount.ecryptfs
/mount -t ecryptfs
devrait marcher...
Passez au script ci-dessous pour celui qui fonctionne. Voici ce qui pourrait fonctionner, mais je n'ai pas eu beaucoup de chance. Ces deux scripts vous demandent de saisir votre phrase secrète, ils ne sont donc pas non sécurisés, bien que vous puissiez la modifier si vous le souhaitez, ou utiliser xenity
pour la saisir à la place d'un terminal. Ici, le montage doit être exécuté en tant que root, il faut donc insérer des clés dans le trousseau de clés "Sudo". L'exécution de tout le script en tant que root devrait fonctionner ...? Aboyait probablement le mauvais arbre ici.
#!/bin/bash
# mostly copied from ecryptfs-mount-private
# otherhome should be the path to the folder just outside the actual encrypted home,
# For example, /home/.ecryptfs/[user] and must be readable
otherhome=/otherpartition/home/.ecryptfs/user
decrypted=/media/decrypted
WRAPPED_PASSPHRASE_FILE="$otherhome/.ecryptfs/wrapped-passphrase"
MOUNT_PASSPHRASE_SIG_FILE="$otherhome/.ecryptfs/Private.sig"
PW_ATTEMPTS=3
MESSAGE=`gettext "Enter your login passphrase:"`
if [ ! -d "$decrypted" ]; then
mkdir -p "$decrypted" || { echo "$decrypted does not exist, can not create"; exit 1; }
fi
# interactively Prompt for the user's password
if [ -f "$WRAPPED_PASSPHRASE_FILE" -a -f "$MOUNT_PASSPHRASE_SIG_FILE" ]; then
tries=0
stty_orig=`stty -g`
while [ $tries -lt $PW_ATTEMPTS ]; do
echo -n "$MESSAGE"
stty -echo
LOGINPASS=`head -n1`
stty $stty_orig
echo
if [ $(wc -l < "$MOUNT_PASSPHRASE_SIG_FILE") = "1" ]; then
# No filename encryption; only insert fek
if printf "%s\0" "$LOGINPASS" | ecryptfs-unwrap-passphrase "$WRAPPED_PASSPHRASE_FILE" - | ecryptfs-add-passphrase -; then
sig=`head -n1 $otherhome/.ecryptfs/Private.sig`
break
else
echo `gettext "ERROR:"` `gettext "Your passphrase is incorrect"`
tries=$(($tries + 1))
continue
fi
else
if printf "%s\0" "$LOGINPASS" | ecryptfs-insert-wrapped-passphrase-into-keyring "$WRAPPED_PASSPHRASE_FILE" - ; then
sig=`head -n1 $otherhome/.ecryptfs/Private.sig`
fnek_sig=`tail -n1 $otherhome/.ecryptfs/Private.sig`
break
else
echo `gettext "ERROR:"` `gettext "Your passphrase is incorrect"`
tries=$(($tries + 1))
continue
fi
fi
done
if [ $tries -ge $PW_ATTEMPTS ]; then
echo `gettext "ERROR:"` `gettext "Too many incorrect password attempts, exiting"`
exit 1
fi
if [ -v fnek_sig ]; then
# filename encryption enabled, $fnek_sig has been set
mount -i -t ecryptfs -o ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_sig=$sig,ecryptfs_fnek_sig=$fnek_sig $otherhome/.Private $decrypted
else
# no filename encryption
mount -i -t ecryptfs -o ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_sig=$sig $otherhome/.Private $decrypted
fi
else
echo `gettext "ERROR:"` `gettext "Encrypted private directory is not setup properly"`
exit 1
fi
if grep -qs "$otherhome/.Private $decrypted ecryptfs " /proc/mounts 2>/dev/null; then
echo
echo `gettext "INFO:"` `gettext "Your private directory has been mounted."`
echo
fi
exit 0
même si j'ai eu du mal à exécuter un script exécutable à l'intérieur d'une maison cryptée. J'ai dû l'appeler comme argument pour bash
/sh
, avec
Sudo bash -c ./ecryptfs-mount-single.sh [--rw] [encrypted folder] [mountpoint]
C'est ici:
#!/bin/sh -e
#
# ecryptfs-mount-single
# Modified by Xen2050 from:
#
# ecryptfs-recover-private
# Copyright (C) 2010 Canonical Ltd.
#
# Authors: Dustin Kirkland <[email protected]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
error() {
echo "ERROR: $@" 1>&2
echo "Usage: ecryptfs-mount-single [--rw] [encrypted private dir] [mountpoint]"
echo "\tWill attempt to mount [encrypted private dir (.Private)] to [mountpoint]"
echo "\twith standard options: ecryptfs_cipher=aes,ecryptfs_key_bytes=16"
echo "\n\t--rw\tmount with read-write access (optional)"
echo "\t[mountpoint] will attempt to be created if it does not exist"
exit 1
}
info() {
echo "INFO: $@"
}
# We need root access to do the mount
[ "$(id -u)" = "0" ] || error "This program must be run as root."
# Handle parameters
opts="ro"
if [ "$1" = "--rw" ]; then
opts="rw"
shift
fi
if [ -d "$1" ]; then
# Allow for target directories on the command line
d="$1"
# Only supplying one directory
else
error "No private directory found; it must be supplied."
fi
if [ ! -d "$2" ]; then
mkdir -p "$2" || error "mountpoint $2 does not exist, can not create"
fi
# mount directory on the command line
tmpdir=$2
# Determine if filename encryption is on
ls "$d/ECRYPTFS_FNEK_ENCRYPTED"* >/dev/null 2>&1 && fnek="--fnek" || fnek=
if [ -f "$d/../.ecryptfs/wrapped-passphrase" ]; then
info "Found your wrapped-passphrase"
echo -n "Do you know your LOGIN passphrase? [Y/n] "
lpw=$(head -n1)
case "$lpw" in
y|Y|"")
# Use the wrapped-passphrase, if available
info "Enter your LOGIN passphrase..."
ecryptfs-insert-wrapped-passphrase-into-keyring "$d/../.ecryptfs/wrapped-passphrase"
sigs=$(sed -e "s/[^0-9a-f]//g" "$d/../.ecryptfs/Private.sig")
use_mount_passphrase=0
;;
*)
use_mount_passphrase=1
;;
esac
else
# Fall back to mount passphrase
info "Could not find your wrapped passphrase file."
use_mount_passphrase=1
fi
if [ "$use_mount_passphrase" = "1" ]; then
info "To recover this directory, you MUST have your original MOUNT passphrase."
info "When you first setup your encrypted private directory, you were told to record"
info "your MOUNT passphrase."
info "It should be 32 characters long, consisting of [0-9] and [a-f]."
echo
echo -n "Enter your MOUNT passphrase: "
stty_orig=$(stty -g)
stty -echo
passphrase=$(head -n1)
stty $stty_orig
echo
sigs=$(printf "%s\0" "$passphrase" | ecryptfs-add-passphrase $fnek | grep "^Inserted" | sed -e "s/^.*\[//" -e "s/\].*$//" -e "s/[^0-9a-f]//g")
fi
case $(echo "$sigs" | wc -l) in
1)
mount_sig=$(echo "$sigs" | head -n1)
fnek_sig=
mount_opts="$opts,ecryptfs_sig=$mount_sig,ecryptfs_cipher=aes,ecryptfs_key_bytes=16"
;;
2)
mount_sig=$(echo "$sigs" | head -n1)
fnek_sig=$(echo "$sigs" | tail -n1)
mount_opts="$opts,ecryptfs_sig=$mount_sig,ecryptfs_fnek_sig=$fnek_sig,ecryptfs_cipher=aes,ecryptfs_key_bytes=16"
;;
*)
continue
;;
esac
(keyctl list @u | grep -qs "$mount_sig") || error "The key required to access this private data is not available."
(keyctl list @u | grep -qs "$fnek_sig") || error "The key required to access this private data is not available."
if mount -i -t ecryptfs -o "$mount_opts" "$d" "$tmpdir"; then
info "Success! Private data mounted at [$tmpdir]."
else
error "Failed to mount private data at [$tmpdir]."
fi
Démontage avant/lors de la déconnexion, et peut-être supprimer les clés du trousseau de clés du noyau (avec keyctl
clear ou purge, Sudo keyctl clear @u
efface tout) sont probablement de bonnes idées. J'avais un deuxième dossier monté dans une maison cryptée et je me suis déconnecté, il a apparemment démonté le deuxième dossier (pas dans/proc/mounts) mais est toujours apparu dans mount
.