(フルディスク暗号化を使用して)Ubuntuを有効にして、RAMにスリープ/サスペンドする前にLUKSsupendを呼び出すにはどうすればよいですか?


104

この質問は、@ Stefanによる別の質問に関連していますが、重複するものではありません。質問はわずかに異なります。著者は、これが実装されているかどうかを知りたいだけでしたが、これを行う方法について(特定の方法で)特に助けを求めています。さらに、他の質問には、実装者にとって有用な答えがありませんでしたが、最近の質問は、これに対する私の試みにリンクしているだけです。

「重複」の問題を説明しています...

私はフルディスク暗号化(LUKSの上にLVM)を使用しているUbuntu 14.04 luksSuspendにいます。一時停止手順に組み込んで(そして後で使用してluksResume)、キーマテリアルをメモリとルートのロックを解除せずにRAMに一時停止できるようにします。

これまでのところ、Arch Linux向けスクリプトを移植しようとしましたが、成功していません。正直、自分が何をしているのかわかりません。

誰も私がこれを移植するのを手伝うことができますか(またはこのようなものをゼロから作成できますか?)または、少なくとも、誰かがサスペンド手順にフックする方法と、rootへのすべてのIOがブロックされた後でも必要なバイナリとスクリプト(cryptsetupなど)を利用可能にする方法についてのドキュメントを教えてもらえますluksSuspendか?

必要なバイナリとスクリプトを再開に使用できるようにする方法については、この他のブログ投稿(Archも同様)でそれらをコピーしました/boot。ただし、Vianneyが前に述べたスクリプトで使用した行では、この方法の方が少しエレガントに見えるため、さらに何かを使用したいと思います。

私はあまり到達していませんが、私の開発はGitHubで見つけることができます。


休止状態/再開アクションに手動ロックコマンドを追加しようとしましたか?たとえばudisksctl lock -b /dev/sda/etc/pm/sleep.d/ディレクトリ内のスクリプトに追加しますか?
アリレザMosajjal

おかげで、私はそれを調べます...私がすでに伝えていることから、これはcryptsetup luksSuspend私が使用してきたLUKSよりも一般的ですが、一方でファイルシステムをアンマウントする必要があります。また、おそらく(udisksdデーモンと通信するため)刑務所では機能せず、ファイルシステムの再マウント/再開には使用できません。
ジョナスマラコ

キーマテリアルを削除しても、RAMへのサスペンド中にメモリに他の機密情報が存在する可能性があります。それでは、luksキーのみを削除する意味は何ですか?
-pefu

@pefuまあ、最初に、ディスク上の機密情報の量は、RAMに残っている量よりもはるかに大きくなる可能性があります。さらに、解読されたファイルシステムにアクセスする場合と比較すると、RAMの情報を識別および/または変更する攻撃者の能力はかなり制限されます。
ジョナスマラコ

@jonasmalacofilho:まあ:私の秘密鍵はラップトップで最も機密性の高い素材だと考えています。もちろん、これらの秘密鍵もパスフレーズによって保護されています。起動時に私は通常これらのキーをロードし、これらのキーの復号化されたコピーがRAMのどこかに保存されているエージェントを実行しています。そのため、スクリーンセーバーのセキュリティをバイパスしてRAMからデータを回収できる巧妙な攻撃者のコンピューターにコンピューターが落ちた場合、一時停止する前にRAMのLUKSキーを破壊していたとしても、ねじ込まれます。右?
ペフ

回答:


1

明らかなことを言ってすみませんが、cryptsetup luksSuspend / luksResumeコマンドを含むスクリプトをに追加しようとしました/usr/lib/pm-utils/sleep.dか?もしそうなら、何が起こったのですか?

hibernate / resumeのcryptdisksサービスとcryptdisks_earlyサービスもstop / startを呼び出すのは論理的に思えます。スクリプト内でcryptdisks_stopとcryptdisks_startを呼び出すとpm-utils/sleep.d、トリックが行われますか?これは、cryptsetup luksSuspend直接呼び出すのと同じ結果になると思います。


これまでのところ、私のアプローチはpm-suspendを変更することでした。ただし、(でecho mem > /sys/power/state)サスペンドしようとすると、ルートfsへのアクセスを必要とするカーネルモジュールがロードされているようです。詳細については、リンクされたリポジトリを参照してください。
ジョナスマラコ

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

ここで Ubuntu 14.04への移植に向けていくつかの作業が行われました。まだいくつかの未解決の問題があるため、これは決して完璧なソリューションではありません。また、2014年6月11日以降、リリースされた作品はないようです。

ソース:https : //github.com/jonasmalacofilho/ubuntu-luks-suspend

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.