web-dev-qa-db-ja.com

ログイン時にeCryptFS暗号化パーティションをマウントするにはどうすればよいですか?

新しいインストールにログインするときに、暗号化された古いホームパーティションをマウントしたいと思います。住宅はUbuntuのデフォルトの暗号化(eCryptFS)を使用しています。古いインストールと新しいインストールの両方で同じパスワードを使用しています。暗号化を安全に保ちながらこれをどのように行うことができますか?

古いインストールはまだ動作していて、暗号化キーを持っています。

1
user5448026

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.ecryptfsmount -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にはまだ表示されています。

1
Xen2050