web-dev-qa-db-fra.com

Comment monter une partition chiffrée eCryptFS à la connexion?

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.

1
user5448026

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

This le script fonctionne,

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.

1
Xen2050