DasSkript funktioniert,

DasSkript funktioniert,

Ich möchte meine alte verschlüsselte Home-Partition mounten, wenn ich mich bei meiner neuen Installation anmelde. Die Homes verwenden die Ubuntu-Standardverschlüsselung (eCryptFS). Sowohl meine alte als auch meine neue Installation verwenden dasselbe Passwort. Wie kann dies erreicht werden, während die Verschlüsselung sicher bleibt?

PS: Die alte Installation ist noch funktionsfähig und ich habe den Verschlüsselungsschlüssel.

Antwort1

Habe dies auf XFCE versucht, bin mir aber nicht sicher, ob die Startdateien, die bei der Anmeldung ausgeführt werden, bei Unity/Gnome/KDE/usw. alle gleich sind, also kann Ihre Situation unterschiedlich sein.

Eine .desktop-Datei in ~/.config/autostart wird beim Login ausgeführt und weist sie an, ein Bash-Skript auszuführen, das Ihren verschlüsselten Ordner mountet. Da Ihr Home-Ordner bereits verschlüsselt ist,könnteSpeichern Sie die andere Mount-Passphrase im Bash-Skript. Das ist zwar keine perfekte Sicherheit, aber dennoch verschlüsselt auf der Festplatte, falls Sie sie nicht jedes Mal eingeben möchten. Zum Beispiel ~/.config/autostart/test.desktop. Eine sehr einfache wie diesesollenarbeiten:

[Desktop Entry]
Type=Application
Exec=/home/user/.config/autostart/runme.sh

Oder warten Sie vor dem Start ein paar Sekunden (um dem Desktop beispielsweise Zeit zum Initialisieren zu geben, bevor er zur Eingabe einer Passphrase aufgefordert wird) und führen Sie das Programm als Root aus. Versuchen Sie Folgendes:

[Desktop Entry]
Type=Application
Exec=sudo bash -c "sleep 5; /home/user/.config/autostart/runme.sh"

Oder wenn es mehr Details braucht, kopieren und bearbeiten Sie ein vorhandenes (falls es welche gibt), oder es sollte eine GUI-Möglichkeit geben, eins zu erstellen unterSystemEinstellungenStartup-Anwendungen, dann klickHinzufügen. Oder mehrere Zeilen wie diese sollten auch funktionieren (jedenfalls für XFCE, wahrscheinlich sollte die Zeile OnlyShowIn weggelassen werden):

[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

Es führt nur die Zieldatei aus und funktioniert nicht mit, Exec=~/.config/autostart/test.shersetzen Sie also „Benutzer“ entsprechend. Sie könnten wahrscheinlich eine lange Zeile verwenden, anstatt sie auf ein Bash-Skript zu verweisen.


Ich schaue mir jetzt den Mount-Teil an und teste mit einem virtuellen PC. Es gibt einige Komplikationen, da Sie bereits eCryptFS mit einem verschlüsselten Home verwenden, und ich habe vor einiger Zeit getestet, dass Sie kein verschlüsseltes Home haben könnenUndein weiterer verschlüsselter „Privater“ Ordner in Ihrem Home-Ordner (mit encrypted-setup-private& encrypted-mount-private), aber die Verwendung von ecryptfs-add-passphrase& und der Aufruf von mount.ecryptfs/ mount -t ecryptfssollte funktionieren …


Fahren Sie mit dem folgenden Skript fort, um eines zu finden, das funktioniert. Hier ist, was funktionieren könnte, aber ich hatte nicht viel Glück damit. Beide Skripte verlangen von Ihnen, Ihre Passphrase einzugeben, sodass sie nicht unsicher sind. Sie können sie jedoch bearbeiten, wenn Sie möchten, oder xenitysie anstelle eines Terminals eingeben. Hier muss mount als Root ausgeführt werden, daher müssen Schlüssel in den „sudo“-Schlüsselbund eingefügt werden. Ausführen des gesamten Skripts als RootsollenArbeit...? Wahrscheinlich war ich hier auf dem Holzweg.

#!/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

DasSkript funktioniert,

bashAllerdings hatte ich Probleme, ein ausführbares Skript aus einem verschlüsselten Home heraus auszuführen. Ich musste es als Argument für / aufrufen sh, mit

sudo bash -c ./ecryptfs-mount-single.sh [--rw] [encrypted folder] [mountpoint]

Hier ist es:

#!/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

Das Aushängen vor/beim Abmelden und vielleicht das Entfernen der Schlüssel aus dem Kernel-Schlüsselbund (mit keyctlClear oder Purge, sudo keyctl clear @ulöscht alles) sind wahrscheinlich gute Ideen. Ich hatte einen zweiten Ordner in einem verschlüsselten Home eingehängt und habe mich abgemeldet. Dabei wurde der zweite Ordner anscheinend ausgehängt (nicht in /proc/mounts), aber er wurde immer noch in angezeigt mount.

verwandte Informationen