新しいインストールにログインするときに、暗号化された古いホームパーティションをマウントしたいと思います。住宅はUbuntuのデフォルトの暗号化(eCryptFS)を使用しています。古いインストールと新しいインストールの両方で同じパスワードを使用しています。暗号化を安全に保ちながらこれをどのように行うことができますか?
古いインストールはまだ動作していて、暗号化キーを持っています。
XFCEでこれを試してみましたが、Unity/Gnome/KDE/etcがrun-on-login起動ファイルですべて同じである場合、YMMVであるとは思いません。
〜/ .config/autostart内の.desktopファイルはログイン時に実行され、暗号化されたフォルダーをマウントするbashスクリプトを実行するように指示します。あなたの家はすでに暗号化されているので、あなたはできます他のマウントパスフレーズをbashスクリプトに保存します。完全なセキュリティではなく、ディスク上で暗号化します(暗号化しなかった場合)毎回入力したい。たとえば、~/.config/autostart/test.desktop
です。このような非常に基本的なものは機能するはずです:
[Desktop Entry]
Type=Application
Exec=/home/user/.config/autostart/runme.sh
または、開始する前に数秒待って(たとえば、パスフレーズを要求する前にデスクトップが初期化する時間を与えます)、rootとして実行するには、次のようにしてください。
[Desktop Entry]
Type=Application
Exec=Sudo bash -c "sleep 5; /home/user/.config/autostart/runme.sh"
または、より詳細が必要な場合は、既存のものがある場合はそれをコピーして編集するか、Systemの下にGUIを作成する方法が必要です→設定→起動アプリケーション、次に追加。または、このような行も機能するはずです(とにかくXFCEの場合は、おそらく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
ターゲットファイルを実行するだけで、Exec=~/.config/autostart/test.sh
では機能しないため、それに応じて「user」を置き換えます。おそらく、bashスクリプトを指すのではなく、1つの長い行を使用することができます。
マウント部分を調べています。仮想PCでテストしています。すでに暗号化された家でeCryptFSを使用しているため、いくつかの複雑な問題があります。私は少し前にテストしましたが、暗号化された家はありませんandencrypted-setup-private
を使用してencrypted-mount-private
/ecryptfs-add-passphrase
を呼び出すだけで、自宅にある別の暗号化された「プライベート」フォルダ(mount.ecryptfs
&mount -t ecryptfs
を使用)が機能するはずです...
機能するスクリプトについては、以下のスクリプトにスキップしてください。これがうまくいくことですが、私はあまり運がありませんでした。これらのスクリプトはどちらもパスフレーズを入力するように要求するため、安全ではありませんが、必要に応じて編集したり、ターミナルではなくxenity
を使用して入力したりできます。ここでは、マウントはルートとして実行する必要があるため、「Sudo」キーリングにキーを挿入する必要があります。 rootとしてスクリプト全体を実行するは機能するはずです...?おそらくここで間違った木を吠えていました。
#!/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
暗号化された家の中から実行可能なスクリプトを実行するのに問題がありましたが。 bash
/sh
の引数としてそれを呼び出す必要がありました。
Sudo bash -c ./ecryptfs-mount-single.sh [--rw] [encrypted folder] [mountpoint]
ここにあります:
#!/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
ログアウト前/ログアウト時にアンマウントし、カーネルのキーリングからキーを削除する(keyctl
クリアまたはパージ、Sudo keyctl clear @u
はすべてクリアする)ことはおそらく良いアイデアです。暗号化された家の中に2つ目のフォルダーをマウントしてログアウトしたところ、2つ目のフォルダー(/ proc/mountsではない)がアンマウントされたようですが、mount
にはまだ表示されています。