Bagaimana cara mengaktifkan Ubuntu (menggunakan enkripsi disk penuh) untuk memanggil LUKSsupend sebelum tidur / menangguhkan ke RAM?

104

Pertanyaan ini terkait dengan yang lain oleh @Stefan, tetapi itu bukan duplikat. Pertanyaannya sedikit berbeda: penulis hanya ingin tahu apakah ini telah diterapkan, sementara saya meminta bantuan secara khusus tentang bagaimana melakukan ini (dengan cara tertentu). Selain itu, pertanyaan lain tidak mendapat jawaban yang berguna bagi pelaksana, kecuali yang baru-baru ini yang hanya terkait dengan upaya saya dalam hal ini.

Setelah menjelaskan masalah "duplikat" ...

Saya menggunakan Ubuntu 14,04 menggunakan enkripsi disk penuh (LVM di atas LUKS) dan saya ingin memasukkan luksSuspendke dalam prosedur menangguhkan (dan kemudian menggunakan luksResume) sehingga saya dapat menangguhkan ke RAM tanpa meninggalkan bahan kunci pada memori dan root tidak terkunci.

Saya sudah mencoba untuk port script untuk Arch Linux , sejauh ini tidak berhasil: Jujur saya tidak tahu apa yang saya lakukan ...

Adakah yang bisa membantu saya port ini (atau membuat sesuatu seperti ini dari awal)? Atau, setidaknya, adakah yang bisa mengarahkan saya ke dokumentasi tentang bagaimana cara menghubungkan hal-hal ke dalam prosedur menangguhkan dan bagaimana membuat biner dan skrip yang diperlukan (seperti cryptsetup) tersedia bahkan setelah semua IO untuk root telah diblokir (oleh luksSuspend)?

Mengenai cara membuat biner dan skrip yang diperlukan tersedia untuk resume, posting blog lain ini (juga untuk Arch) menyalinnya ke /boot; Namun saya ingin menggunakan sesuatu yang lebih sesuai dengan yang digunakan Vianney dalam naskah yang saya sebutkan sebelumnya, karena pendekatan itu tampaknya sedikit lebih elegan dalam aspek ini.

Saya belum mencapai banyak, tetapi perkembangan saya dapat ditemukan di GitHub .

Jonas Malaco
sumber
Sudahkah Anda mencoba menambahkan perintah kunci manual untuk hibernasi / melanjutkan tindakan? misalnya menambahkan udisksctl lock -b /dev/sdake skrip di /etc/pm/sleep.d/direktori?
AliReza Mosajjal
Terima kasih, saya akan memeriksanya ... Dari apa yang sudah saya tahu, ini lebih umum daripada LUK yang hanya cryptsetup luksSuspendsaya gunakan, tetapi di sisi lain memerlukan unmount sistem file. Juga, ini mungkin tidak akan berfungsi di penjara (karena berkomunikasi dengan udisksd daemon) dan tidak dapat digunakan untuk mengirim ulang / melanjutkan sistem file.
Jonas Malaco
Bahkan jika melepas materi kunci mungkin ada informasi rahasia lainnya dalam memori selama penangguhan ke RAM. Jadi apa gunanya hanya menyingkirkan kunci luks?
pefu
@ pefu Yah, pertama, jumlah informasi rahasia pada disk bisa jauh lebih besar daripada yang tersisa di RAM. Selain itu, kemampuan penyerang untuk mengidentifikasi dan / atau mengubah info pada RAM agak terbatas bila dibandingkan dengan memiliki akses ke sistem file yang didekripsi.
Jonas Malaco
@jonasmalacofilho: Baiklah: Saya menganggap kunci pribadi saya sebagai materi paling rahasia di laptop saya. Tentu saja kunci pribadi ini juga dilindungi oleh kata sandi. Pada startup saya biasanya memuat kunci-kunci ini dan memiliki agen yang menjalankan yang tentu saja memiliki salinan kunci yang didekripsi disimpan di suatu tempat di RAM. Jadi, jika komputer saya jatuh ke tangan seorang penyerang canggih yang mampu mem-bypass keamanan screen saver dan menyelamatkan data dari RAM, saya akan kacau bahkan jika saya telah menghancurkan kunci LUKS dalam RAM sebelum ditangguhkan. Baik?
pefu

Jawaban:

1

Maaf untuk menyatakan yang jelas, tetapi apakah Anda sudah mencoba menambahkan skrip yang berisi perintah cryptsetup luksSuspend / luksResume ke /usr/lib/pm-utils/sleep.d? Jika demikian, apa yang terjadi?

Tampaknya logis bagi saya, untuk memanggil stop / start layanan cryptdisks dan cryptdisks_early di hibernate / resume juga. Akankah memanggil cryptdisks_stop dan cryptdisks_start di dalam skrip pm-utils/sleep.dmelakukan triknya? Saya menganggap ini akan memiliki hasil yang sama dengan menelepon cryptsetup luksSuspendlangsung.

sibaz
sumber
Sejauh ini pendekatan saya adalah mengubah pm-suspend. Namun, tampaknya masih ada beberapa modul kernel yang dimuat yang memerlukan akses ke root fs ketika mencoba untuk menangguhkan (dengan echo mem > /sys/power/state). Lihat repositori yang ditautkan untuk lebih jelasnya.
Jonas Malaco
0

Solusi terdekat yang bisa saya temukan adalah skrip pembuktian konsep suspend.sh 2013 ini oleh 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

Beberapa pekerjaan telah dilakukan untuk porting ini ke Ubuntu 14.04 di sini. Ini tidak berarti solusi yang sempurna karena masih ada beberapa masalah terbuka dan tampaknya tidak ada pekerjaan yang telah dirilis sejak 11 Juni 2014. Namun tampaknya ini merupakan titik awal yang baik untuk pengembangan di masa depan.

Sumber: https://github.com/jonasmalacofilho/ubuntu-luks-suspend

Penatua Geek
sumber