이것스크립트가 작동하고

이것스크립트가 작동하고

새 설치에 로그인할 때 이전에 암호화된 홈 파티션을 마운트하고 싶습니다. 가정에서는 Ubuntu 기본 암호화(eCryptFS)를 사용합니다. 이전 설치와 새 설치 모두 동일한 비밀번호를 사용합니다. 암호화를 안전하게 유지하면서 이를 어떻게 수행할 수 있습니까?

추신: 이전 설치가 아직 작동 중이고 암호화 키가 있습니다.

답변1

XFCE에서 이것을 시도했지만 Unity/Gnome/KDE/etc가 로그인 시 실행 시작 파일에 대해 모두 동일하면 긍정적이지 않으므로 YMMV입니다.

~/.config/autostart의 .desktop 파일은 로그인 시 실행되어 암호화된 폴더를 마운트하는 bash 스크립트를 실행하도록 지시합니다. 귀하의 집은 이미 암호화되어 있으므로~할 수 있었다매번 입력하고 싶지 않은 경우 완벽한 보안은 아니지만 여전히 디스크에 암호화된 다른 마운트 암호 문구를 bash 스크립트에 저장하십시오. 예를 들어 ~/.config/autostart/test.desktop. 이런 아주 기본적인 것~해야 한다일하다:

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

또는 시작하기 전에 몇 초 정도 기다렸다가(예: 암호 문구를 묻는 메시지를 표시하기 전에 데스크탑을 초기화할 시간을 제공) 루트로 실행하려면 다음을 시도하십시오.

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

또는 더 자세한 내용이 필요한 경우 기존 항목을 복사 및 편집하거나(있는 경우) 아래에 하나를 만드는 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그에 따라 "사용자"를 바꾸십시오. bash 스크립트를 가리키는 대신 긴 줄 하나를 사용할 수도 있습니다.


지금은 마운트 부분을 살펴보며 가상PC로 테스트 중입니다. 이미 암호화된 집에서 eCryptFS를 사용하고 있기 때문에 몇 가지 복잡한 문제가 있습니다. 얼마 전에 테스트했는데 암호화된 집을 가질 수 없습니다.그리고집에 있는 또 다른 암호화된 "개인" 폴더( encrypted-setup-private& 포함 encrypted-mount-private), /를 사용하여 ecryptfs-add-passphrase호출 하면 작동합니다...mount.ecryptfsmount -t ecryptfs


작동하는 스크립트를 보려면 아래 스크립트로 건너뛰세요. 여기에 효과가 있을 수 있지만 운이 별로 없었습니다. 이 두 스크립트는 모두 암호 문구를 입력하도록 요청하므로 안전하지 않습니다. 하지만 원하는 경우 편집하거나 xenity터미널 대신 암호를 입력하는 데 사용할 수 있습니다. 여기서 mount는 루트로 실행해야 하므로 "sudo" 키링에 키를 삽입해야 합니다. 전체 스크립트를 루트로 실행~해야 한다일하다...? 아마도 여기서 잘못된 나무를 짖고 있었을 것입니다.

#!/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모두 지우기)이 아마도 좋은 생각일 것입니다. 암호화된 홈 내부에 두 번째 폴더를 마운트하고 로그아웃했는데 분명히 두 번째 폴더(/proc/mounts가 아님)가 마운트 해제되었지만 여전히 mount.

관련 정보