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 unterSystem→Einstellungen→Startup-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.sh
ersetzen 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 ecryptfs
sollte 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 xenity
sie 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,
bash
Allerdings 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 keyctl
Clear oder Purge, sudo keyctl clear @u
lö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
.