Ubuntu'yu (tam disk şifrelemesi kullanarak) RAM'e uyumadan / askıya almadan önce LUKSsupend'i aramasını nasıl sağlayabilirim?


104

Bu soru @Stefan'ın bir başkasıyla ilişkili, ancak bunun bir kopyası değil. Sorular biraz farklıdır: yazar bunun uygulanıp uygulanmadığını bilmek isterken, özellikle bunun nasıl yapılacağına dair yardım istiyorum (belli bir şekilde). Ek olarak, diğer soru uygulayıcılar için işe yarar bir cevap alamadı.

"Yinelenen" konuyu açıkladıktan sonra ...

Tam disk şifrelemesi (LUKS'in üstündeki LVM) kullanarak Ubuntu 14.04'teyim luksSuspendve askıya alma prosedürüne dahil etmek istiyorum (ve daha sonra kullanmak luksResume), böylece RAM'de ana materyali bellekte ve kök kilidi açılmadan askıya alabilirim.

Arch Linux için bir senaryo yayınlamaya çalıştım , şu ana kadar başarılı olamadım: Gerçekten ne yaptığım hakkında hiçbir fikrim yok ...

Birisi bunu anlatmama yardımcı olabilir (veya sıfırdan böyle bir şey yaratabilir)? Veya en azından birileri beni askıya alma prosedürlerine nasıl bağlayacağınız ve gerekli ikili dosyaları ve komut dosyalarını (cryptsetup gibi) tüm IO'nun root tarafından bloke edildikten sonra bile nasıl hazır tutacağımla ilgili belgeleri gösterebilir luksSuspendmi?

Gerekli ikili dosyaları ve komut dosyalarını devam ettirmek için nasıl hazır tutacağımızla ilgili olarak, bu diğer blog yazısı (Arch için de) bunları kopyaladı /boot; Ancak Vianney'in daha önce bahsettiğim senaryoda kullandığı satırlarda daha fazla bir şey kullanmak istiyorum, çünkü bu yaklaşım bu açıdan biraz daha zarif görünüyor.

Çok fazla ulaşmadım, ancak gelişimim GitHub'da bulunabilir .


eylemleri hazırda bekletme / sürdürme için manuel kilit komutu eklemeyi denediniz mi? Örneğin udisksctl lock -b /dev/sda, /etc/pm/sleep.d/dizindeki bir betiğe ekleme ?
AliReza Mosajjal

Teşekkürler, araştıracağım ... Zaten söyleyebileceğim şeyden, bu sadece kullandığım LUKS'tan daha genel cryptsetup luksSuspend, ancak diğer taraftan dosya sisteminin sökülmesini gerektiriyor. Ayrıca, büyük olasılıkla bir hapishanede çalışmayacak (udisksd daemon ile iletişim kurduğu için) ve dosya sistemini yeniden kurmak / sürdürmek için kullanılamaz.
Jonas Malaco

Anahtar malzemeyi çıkarsanız bile, RAM’in askıya alınması sırasında bellekte muhtemelen başka gizli bilgiler vardır. Öyleyse sadece luks anahtarından kurtulmanın anlamı ne?
pefu

@pefu Öncelikle, diskteki gizli bilgi miktarı RAM'de bırakılandan çok daha büyük olabilir. Ek olarak, saldırganın RAM üzerindeki bilgileri belirleme ve / veya değiştirme özelliği deşifre edilen dosya sistemine erişim ile karşılaştırıldığında oldukça sınırlıdır.
Jonas Malaco,

@ jonasmalacofilho: Pekala: Özel anahtarlarımın dizüstü bilgisayarımdaki en gizli materyal olduğunu düşünüyorum. Tabii ki bu özel anahtarlar aynı zamanda bir şifre ile korunmaktadır. Açılışta genellikle bu anahtarları yüklüyorum ve bu anahtarların şifresinin şifreli bir kopyasını RAM’de saklayan bir aracı çalıştırıyorum. Bilgisayarım ekran koruyucusu güvenliğini atlayabilen ve verileri RAM'den kurtarmayı başarabilen karmaşık bir saldırganın ellerine düşerse, askıya alınmadan önce RAM'deki LUKS anahtarını tahrip etsem bile mahvolurdum. Sağ?
pefu

Yanıtlar:


1

Açıkça ifade ettiğim için üzgünüm, fakat cryptsetup luksSuspend / luksResume komutlarını içeren bir komut dosyası eklemeyi denediniz /usr/lib/pm-utils/sleep.dmi? Eğer öyleyse ne oldu?

Durmak / cryptdisks'i başlatmak ve hazırda bekleme / devam ettirmek için cryptdisks_early hizmetlerini çağırmak bana mantıklı gelecektir. pm-utils/sleep.dHile yapmak bir komut dosyası içinde cryptdisks_stop ve cryptdisks_start aramak mı? Bunun cryptsetup luksSuspenddoğrudan çağrı yapmakla aynı sonucu vereceğini tahmin ediyorum .


Şimdiye kadar benim yaklaşımım ertelemeyi değiştirmek oldu. Bununla birlikte, (ile echo mem > /sys/power/state) askıya alınmaya çalışırken fs köküne erişim gerektiren bazı çekirdek modülleri yüklü görünmektedir . Daha fazla ayrıntı için bağlantılı havuza bakın.
Jonas Malaco 18:15

0

Bulabildiğim en yakın çözüm, Mikko Rauhala tarafından yazılan, 2013'teki konsept suspend.sh senaryosunun kanıtı.

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

Bunun burada Ubuntu 14.04'e aktarılması için bazı çalışmalar yapıldı . Bu, kesinlikle hiçbir açık sorun bulunmadığından ve 11 Haziran 2014'ten bu yana hiçbir çalışma yapılmadığı için mükemmel bir çözüm değil. Ancak gelecekteki gelişme için iyi bir başlangıç ​​noktası gibi görünüyor.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.