RAM으로 절전 / 일시 중지하기 전에 Ubuntu (전체 디스크 암호화 사용)가 LUKSsupend를 호출하도록하려면 어떻게합니까?


104

이 질문은 @Stefan의 다른 질문과 관련이 있지만 중복되지는 않습니다. 질문은 약간 다릅니다 : 저자는 단순히 이것이 구현되었는지 알고 싶었지만이를 수행하는 방법에 대해 구체적으로 도움을 요청했습니다. 또한 다른 질문은 구현 자에게 유용한 답변을 얻지 못했습니다. 최근에 시도한 것과 관련이있는 최근 질문을 제외하고.

"중복"문제를 설명한 후 ...

나는 전체 디스크 암호화 (LUKS 상단의 LVM)를 사용하여 Ubuntu 14.04를 사용 luksSuspend하고 있으며 일시 중단 절차 (및 나중에 사용 luksResume) 에 통합 하여 키 자료를 메모리에 남기지 않고 루트를 잠금 해제하지 않고 RAM에 일시 중단 할 수 있습니다.

나는 지금까지 성공하지 않고 Arch Linux 용 스크립트 를 포팅하려고 시도했다 . 솔직히 내가하고있는 일을 모른다.

누구든지 이것을 이식하도록 도울 수 있습니까 (또는 처음부터 이와 같은 것을 만들 수 있습니까)? 또는 적어도 누군가가 일시 중단 절차에 물건을 연결하는 방법과 루트에 대한 모든 IO가 (에 의해 luksSuspend) 차단 된 후에도 필요한 바이너리 및 스크립트 (예 : cryptsetup)를 유지하는 방법에 대한 문서를 알려 주실 수 있습니까?

이력서에 필요한 바이너리 및 스크립트를 유지하는 방법과 관련하여이 다른 블로그 게시물 (Arch의 경우도 해당)을 복사했습니다 /boot. 그러나 Vianney가 이전에 언급 한 스크립트에서 사용한 줄에 더 많은 것을 사용하고 싶습니다.이 접근법에서는이 접근법이 조금 더 우아해 보이기 때문입니다.

나는 많은 것에 도달하지 못했지만 GitHub 에서 개발을 찾을 수 있습니다 .


최대 절전 / 재개 작업에 수동 잠금 명령을 추가해 보셨습니까? 예를 들어 디렉토리 udisksctl lock -b /dev/sda의 스크립트에 추가 /etc/pm/sleep.d/하시겠습니까?
AliReza Mosajjal

고마워, 내가 알아볼 게 ... 내가 이미 알 수 있듯이, 이것은 cryptsetup luksSuspend내가 사용했던 LUKS보다 일반적 이지만 파일 시스템을 마운트 해제해야합니다. 또한 udisksd 데몬과 통신하기 때문에 감옥에서 작동하지 않으며 파일 시스템을 다시 마운트 / 재시작하는 데 사용할 수 없습니다.
Jonas Malaco

키 자료를 제거하더라도 RAM 일시 중단 중에 메모리에 다른 기밀 정보가있을 수 있습니다. luks 키만 제거하는 데있어 요점은 무엇입니까?
pefu

@pefu 첫째, 디스크에있는 기밀 정보의 양은 RAM에 남아있는 것보다 훨씬 클 수 있습니다. 또한 RAM에서 정보를 식별 및 / 또는 변경하는 공격자 기능은 암호 해독 된 파일 시스템에 액세스 할 때와 비교하여 다소 제한적입니다.
Jonas Malaco

@jonasmalacofilho : 음 : 개인 키를 랩톱에서 가장 기밀로 생각합니다. 물론 이러한 개인 키는 암호로 보호됩니다. 시작할 때 일반적으로 이러한 키를로드하고 에이전트의 RAM에 어딘가에 저장된이 키의 암호 해독 된 사본을 실행하는 에이전트가 있습니다. 따라서 내 컴퓨터가 화면 보호기 보안을 우회하고 RAM에서 데이터를 구할 수있는 정교한 공격자의 손에 들어간 경우 일시 중단되기 전에 RAM의 LUKS 키를 파괴하더라도 망가질 것입니다. 권리?
pefu

답변:


1

명백한 것은 유감이지만, cryptsetup luksSuspend / luksResume 명령이 포함 된 스크립트를 /usr/lib/pm-utils/sleep.d? 그렇다면 어떻게 되었습니까?

최대 절전 모드 / 재시작에서 cryptdisks 및 cryptdisks_early 서비스를 중지 / 시작하는 것이 논리적 인 것처럼 보입니다. 스크립트 내에서 cryptdisks_stop 및 cryptdisks_start를 호출 pm-utils/sleep.d하면 트릭을 수행합니까? 나는 이것이 cryptsetup luksSuspend직접 호출하는 것과 같은 결과를 가질 것이라고 생각합니다 .


지금까지 내 접근 방식은 오후-일시 중단을 변경하는 것이 었습니다. 그러나 (with echo mem > /sys/power/state) 를 일시 중지하려고 할 때 루트 fs에 액세스해야하는 일부 커널 모듈이 여전히로드되어있는 것으로 보입니다 . 자세한 내용은 링크 된 저장소 를 참조하십시오.
Jonas

0

내가 찾은 가장 가까운 솔루션은 Mikko Rauhala의 2013 년 개념 증명 suspend.sh 스크립트입니다.

#!/bin/sh

# A proof of concept script for forgetting LUKS passwords on suspend
# and reasking them on resume.

# The basic idea is to copy all of the files necessary for luksResume
# onto a RAM disk so that we can be sure they'll be available without
# touching the disk at all. Then switch to a text VT to run the resume
# (easier to make sure it'll come up than to do the same with X).

# The suspend itself has to be done from the ramdisk too to make sure it
# won't hang. This is also a reason why this couldn't be reliably done as a
# self-contained /etc/pm/sleep.d script, so to make the concept clear
# (and because I'm lazy) I did just a minimal standalone proof of concept
# instead. Integrating the functionality into the usual pm tools would be
# encouraged. (Though suspend_pmu would apparently need perl on the ramdisk...)

# (C) 2013 Mikko Rauhala 2013, modifiable and distributable under
# CC0, GPLv2 or later, MIT X11 license or 2-clause BSD. Regardless
# of what you pick, there is NO WARRANTY of any kind.

RAMDEV=/dev/ram0
ROOT=/run/cryptosuspend

PATH=/sbin:/bin:/usr/sbin:/usr/bin

# Cleanup not strictly necessary every time but good for development.
# Doing it before rather than after a suspend for debugging purposes

for a in "$ROOT"/dev/pts "$ROOT"/proc "$ROOT"/sys "$ROOT" ; do
    umount "$a" > /dev/null 2>&1
done

if mount | grep -q "$ROOT" ; then
    echo "Cleanup unsuccessful, cryptosuspend root premounted." 1>&2
    exit 2
fi

if grep -q mem /sys/power/state; then
    METHOD=mem
elif grep -q standby /sys/power/state; then
    METHOD=standby
else
    echo "No mem or standby states available, aborting" 1>&2
    exit 1
fi

if ! mount | grep -q "$RAMDEV" ; then
    mkfs -t ext2 -q "$RAMDEV" 8192
    mkdir -p "$ROOT"
    mount "$RAMDEV" "$ROOT"
    mkdir "$ROOT"/sbin "$ROOT"/bin "$ROOT"/dev "$ROOT"/tmp "$ROOT"/proc "$ROOT"/sys
    cp "$(which cryptsetup)" "$ROOT"/sbin
    for a in $(ldd "$(which cryptsetup)" | grep "/" | cut -d / -f 2- | cut -d " " -f 1) ; do
        mkdir -p "$ROOT""$(dirname /$a)"
        cp "/$a" "$ROOT"/"$a"
    done
    cp "$(which busybox)" "$ROOT"/bin/
    ln -s busybox "$ROOT"/bin/sh
    ln -s busybox "$ROOT"/bin/sync
    cp -a /dev "$ROOT"
    mount -t proc proc "$ROOT"/proc
    mount -t sysfs sysfs "$ROOT"/sys
    mount -t devpts devpts "$ROOT"/dev/pts
fi

CRYPTDEVS="$(dmsetup --target crypt status | cut -d : -f 1)"

echo '#!/bin/sh' > "$ROOT"/bin/cryptosuspend
echo "sync" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo "  cryptsetup luksSuspend \$a" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
echo "echo -n \"$METHOD\" > /sys/power/state" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo '  while ! cryptsetup luksResume'" \$a ; do" >> "$ROOT"/bin/cryptosuspend
echo "    true" >> "$ROOT"/bin/cryptosuspend
echo "  done" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
chmod a+rx "$ROOT"/bin/cryptosuspend

sync
exec openvt -s chroot "$ROOT" /bin/cryptosuspend

이것을 우분투 14.04로 포팅하는 작업이 일부 이루어졌습니다 . 아직 공개 된 문제 가 여전히 있기 때문에 완벽한 솔루션은 아니며 2014 년 6 월 11 일 이후로 발표 된 작업이없는 것으로 보입니다. 그러나 향후 개발을위한 좋은 출발점이 될 것 같습니다.

출처 : https://github.com/jonasmalacofilho/ubuntu-luks-suspend

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.