ฉันจะเปิดใช้งาน Ubuntu (ใช้การเข้ารหัสดิสก์เต็มรูปแบบ) เพื่อโทรหา LUKSsend ได้ก่อนนอน / หยุดพักแรมได้อย่างไร


104

คำถามนี้เกี่ยวข้องกับคำถามอื่นโดย @Stefan แต่ไม่ใช่คำถามที่ซ้ำกัน คำถามนั้นแตกต่างกันเล็กน้อย: ผู้แต่งต้องการทราบว่ามีการนำไปใช้หรือไม่ในขณะที่ฉันขอความช่วยเหลือเป็นพิเศษเกี่ยวกับวิธีการทำสิ่งนี้ (ในลักษณะเฉพาะ) นอกจากนี้คำถามอื่น ๆ ไม่มีคำตอบที่เป็นประโยชน์สำหรับผู้ดำเนินการยกเว้นคำถามล่าสุดที่เชื่อมโยงกับความพยายามของฉันในเรื่องนี้

ต้องอธิบายถึงปัญหา "ซ้ำ" ...

ฉันใช้ Ubuntu 14.04 โดยใช้การเข้ารหัสดิสก์เต็มรูปแบบ (LVM ด้านบนของ LUKS) และฉันต้องการรวมluksSuspendไว้ในโพรซีเดอร์ suspend (และใช้ในภายหลังluksResume) เพื่อให้ฉันสามารถระงับ RAM โดยไม่ต้องทิ้งเนื้อหาสำคัญไว้ในหน่วยความจำ

ฉันพยายามที่จะพอร์ตสคริปต์สำหรับ Arch Linuxจนไม่ประสบความสำเร็จ: ฉันไม่มีความคิดในสิ่งที่ฉันทำ ...

ใครช่วยฉันพอร์ตนี้ (หรือสร้างสิ่งนี้ตั้งแต่เริ่มต้น)? หรืออย่างน้อยทุกคนสามารถชี้ให้ฉันเอกสารเกี่ยวกับวิธีการขอสิ่งที่เป็นขั้นตอนการระงับและวิธีการให้ไบนารีและสคริปต์ที่จำเป็น (เช่น cryptsetup) ใช้ได้แม้หลังจากทั้งหมด IO เพื่อรูทถูกบล็อก (โดยluksSuspend)?

เกี่ยวกับวิธีทำให้ไบนารีและสคริปต์ที่จำเป็นพร้อมใช้งานสำหรับการดำเนินการต่อโพสต์บล็อกอื่น (รวมถึง Arch) ที่คัดลอกไปยัง/boot; อย่างไรก็ตามฉันต้องการที่จะใช้บางสิ่งบางอย่างมากขึ้นในสิ่งที่ Vianney ใช้ในสคริปต์ที่ฉันพูดถึงก่อนหน้านี้

ฉันยังไม่ถึงมาก แต่การพัฒนาของฉันสามารถพบได้บนGitHub


คุณได้ลองเพิ่มคำสั่งล็อคด้วยตนเองเพื่อไฮเบอร์เนต / ดำเนินการต่อหรือไม่? เช่นการเพิ่มudisksctl lock -b /dev/sdaสคริปต์ใน/etc/pm/sleep.d/ไดเรกทอรี?
AliReza Mosajjal

ขอบคุณฉันจะตรวจสอบมัน ... จากสิ่งที่ฉันสามารถบอกได้แล้วนี่เป็นเรื่องทั่วไปมากกว่า LUKS ที่cryptsetup luksSuspendฉันใช้อยู่เท่านั้น แต่ในทางกลับกันก็ต้องถอนระบบไฟล์ออก นอกจากนี้มันอาจจะไม่ทำงานในคุก (เพราะมันสื่อสารกับ udisksd daemon) และไม่สามารถใช้เพื่อติดตั้งใหม่ / เริ่มระบบไฟล์ต่อ
Jonas Malaco

แม้ว่าการลบเนื้อหาสำคัญอาจมีข้อมูลที่เป็นความลับอื่น ๆ ในหน่วยความจำระหว่างการระงับ RAM ดังนั้นจุดสำคัญในการกำจัดกุญแจ luks คืออะไร?
pefu

@pefu ก่อนอื่นปริมาณข้อมูลที่เป็นความลับบนดิสก์อาจมากกว่าที่เหลืออยู่ใน RAM นอกจากนี้ความสามารถของผู้โจมตีในการระบุและ / หรือเปลี่ยนแปลงข้อมูลบน RAM ค่อนข้าง จำกัด เมื่อเปรียบเทียบกับการเข้าถึงระบบไฟล์ที่ถอดรหัส
Jonas Malaco

@ jonasmalacofilho: ดี: ฉันถือว่ากุญแจส่วนตัวของฉันเป็นวัสดุที่เป็นความลับที่สุดในแล็ปท็อปของฉัน แน่นอนว่ากุญแจส่วนตัวเหล่านี้ได้รับการป้องกันด้วยข้อความรหัสผ่าน ในการเริ่มต้นฉันมักจะโหลดกุญแจเหล่านี้และมีเอเจนต์ที่ทำงานซึ่งแน่นอนว่ามีสำเนาที่ถอดรหัสของคีย์เหล่านี้ที่เก็บไว้ใน RAM ดังนั้นหากคอมพิวเตอร์ของฉันตกอยู่ในมือของผู้โจมตีที่มีความสามารถในการเลี่ยงการรักษาความปลอดภัยโปรแกรมรักษาหน้าจอและกู้ข้อมูลจาก RAM ฉันจะเมาแม้ว่าฉันจะทำลายกุญแจ LUKS ใน RAM ก่อนที่จะหยุด ขวา?
pefu

คำตอบ:


1

ขออภัยที่ระบุไว้ชัดเจน แต่คุณได้ลองเพิ่มสคริปต์ที่มีคำสั่ง cryptsetup luksSuspend / luksResume ลงไป/usr/lib/pm-utils/sleep.dหรือไม่ ถ้าเกิดอะไรขึ้น

ดูเหมือนว่าฉันจะเรียกตรรกะหยุด / เริ่ม cryptdisks และบริการ cryptdisks_early เมื่อจำศีล / ดำเนินการต่อ จะเรียกใช้ cryptdisks_stop และ cryptdisks_start ภายในสคริปต์pm-utils/sleep.dหรือไม่? ฉันคิดว่านี่จะมีผลเช่นเดียวกับการโทรcryptsetup luksSuspendโดยตรง


จนถึงแนวทางของฉันคือการเปลี่ยนน. ระงับชั่วคราว อย่างไรก็ตามยังมีโมดูลเคอร์เนลบางตัวที่ต้องการเข้าถึงรูท fs เมื่อพยายามที่จะระงับ (ด้วยecho mem > /sys/power/state) ดูพื้นที่เก็บข้อมูลที่เชื่อมโยงสำหรับรายละเอียดเพิ่มเติม
Jonas Malaco

0

คำตอบที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือบทพิสูจน์ของแนวคิด suspend.sh script 2013 โดย Mikko Rauhala

#!/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

มีการดำเนินการบางอย่างเพื่อนำพาสิ่งนี้ไปยัง Ubuntu 14.04 ที่นี่ นี่ไม่ใช่วิธีการแก้ปัญหาที่สมบูรณ์แบบเนื่องจากยังมีปัญหาเปิดค้างอยู่และดูเหมือนว่าจะไม่มีการเผยแพร่งานตั้งแต่วันที่ 11 มิถุนายน 2014 อย่างไรก็ตามดูเหมือนว่าจะเป็นจุดเริ่มต้นที่ดีสำหรับการพัฒนาในอนาคต

ที่มา: https://github.com/jonasmalacofilho/ubuntu-luks-suspend

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.