Làm cách nào để tôi kích hoạt Ubuntu (sử dụng mã hóa toàn bộ đĩa) để gọi LUKSsupend trước khi ngủ / tạm dừng RAM?


104

Câu hỏi này có liên quan đến một câu hỏi khác của @Stefan, nhưng nó không phải là một bản sao của nó. Các câu hỏi hơi khác nhau: tác giả chỉ muốn biết liệu điều này đã được thực hiện chưa, trong khi tôi đang yêu cầu trợ giúp cụ thể về cách thực hiện việc này (theo một cách cụ thể). Ngoài ra, câu hỏi khác không có câu trả lời hữu ích cho người thực hiện, ngoại trừ câu hỏi gần đây chỉ liên quan đến nỗ lực của tôi về vấn đề này.

Đã giải thích vấn đề "trùng lặp" ...

Tôi đang sử dụng Ubuntu 14.04 bằng cách sử dụng mã hóa toàn bộ ổ đĩa (LVM trên LUKS) và tôi muốn kết hợp luksSuspendvới quy trình tạm dừng (và sử dụng sau này luksResume) để tôi có thể tạm dừng RAM mà không để lại tài liệu chính trên bộ nhớ và mở khóa root.

Tôi đã cố gắng chuyển một tập lệnh cho Arch Linux , cho đến nay không thành công: Tôi thực sự không biết tôi đang làm gì ...

Bất cứ ai có thể giúp tôi cổng này (hoặc tạo ra một cái gì đó như thế này từ đầu)? Hoặc, ít nhất, bất cứ ai cũng có thể chỉ cho tôi tài liệu về cách móc các công cụ vào quy trình tạm ngưng và cách giữ các tệp nhị phân và tập lệnh cần thiết (như cryptsetup) ngay cả khi tất cả IO để root đã bị chặn (bởi luksSuspend)?

Liên quan đến cách giữ các tệp nhị phân và tập lệnh cần thiết có sẵn cho sơ yếu lý lịch, bài đăng trên blog khác này (cũng dành cho Arch) đã sao chép chúng vào /boot; Tuy nhiên, tôi muốn sử dụng một cái gì đó nhiều hơn trong các dòng mà Vianney đã sử dụng trong kịch bản mà tôi đã đề cập trước đây, bởi vì cách tiếp cận đó có vẻ thanh lịch hơn một chút trong khía cạnh này.

Tôi chưa đạt được nhiều, nhưng sự phát triển của tôi có thể được tìm thấy trên GitHub .


Bạn đã thử thêm lệnh khóa thủ công vào các hành động ngủ đông / tiếp tục chưa? ví dụ thêm udisksctl lock -b /dev/sdavào một tập lệnh trong /etc/pm/sleep.d/thư mục?
AliReza Mosajjal

Cảm ơn, tôi sẽ xem xét nó ... Từ những gì tôi có thể nói, điều này chung chung hơn LUKS chỉ cryptsetup luksSuspendtôi đang sử dụng, nhưng mặt khác yêu cầu phải ngắt kết nối hệ thống tập tin. Ngoài ra, nó có thể sẽ không hoạt động trong nhà tù (vì nó giao tiếp với daemon udisksd) và không thể được sử dụng để kể lại / tiếp tục hệ thống tập tin.
Jonas Malaco

Ngay cả khi loại bỏ tài liệu chính, có thể có thông tin bí mật khác trong bộ nhớ trong khi tạm dừng RAM. Vì vậy, điểm nào trong việc chỉ thoát khỏi khóa luks?
pefu

@pefu Chà, đầu tiên, lượng thông tin bí mật trên đĩa có thể lớn hơn nhiều so với lượng RAM còn lại. Ngoài ra, khả năng kẻ tấn công xác định và / hoặc thay đổi thông tin trên RAM khá hạn chế khi so sánh với việc truy cập vào hệ thống tệp được giải mã.
Jonas Malaco

@jonasmalacofilho: Vâng: Tôi coi khóa riêng của mình là tài liệu bí mật nhất trong máy tính xách tay của mình. Tất nhiên các khóa riêng này cũng được bảo vệ bằng cụm mật khẩu. Khi khởi động, tôi thường tải các khóa này và có một tác nhân đang chạy, tất nhiên có một bản sao được giải mã của các khóa này được lưu trữ ở đâu đó trong RAM. Vì vậy, nếu máy tính của tôi rơi vào tay một kẻ tấn công tinh vi có khả năng vượt qua bất kỳ bảo mật bảo vệ màn hình nào và cứu dữ liệu khỏi RAM, tôi sẽ bị vặn ngay cả khi tôi đã phá hủy khóa LUKS trong RAM trước khi tạm dừng. Đúng?
pefu

Câu trả lời:


1

Xin lỗi để nêu rõ ràng, nhưng bạn đã thử thêm một tập lệnh có chứa các lệnh cryptsetup luksSuspend / luksResume vào /usr/lib/pm-utils/sleep.d? Nếu vậy thì chuyện gì đã xảy ra?

Nó có vẻ hợp lý với tôi, để gọi dừng / bắt đầu các dịch vụ cryptdisks và cryptdisks_early trên hibernate / CV. Sẽ gọi cryptdisks_stop và cryptdisks_start trong một kịch bản pm-utils/sleep.dđể thực hiện thủ thuật? Tôi cho rằng điều này sẽ có kết quả tương tự như gọi cryptsetup luksSuspendtrực tiếp.


Cho đến nay cách tiếp cận của tôi là thay đổi chiều-đình chỉ. Tuy nhiên, dường như vẫn còn một số mô-đun hạt nhân được tải yêu cầu quyền truy cập vào fs gốc khi cố gắng tạm dừng (với echo mem > /sys/power/state). Xem kho lưu trữ được liên kết để biết thêm chi tiết.
Jonas Malaco

0

Giải pháp gần nhất mà tôi có thể tìm thấy là bằng chứng năm 2013 về kịch bản đình chỉ khái niệm.sh của 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

Một số công việc đã được thực hiện đối với việc chuyển nó sang Ubuntu 14.04 tại đây. Đây không phải là một giải pháp hoàn hảo vì vẫn còn một số vấn đề mở và dường như không có tác phẩm nào được phát hành kể từ ngày 11 tháng 6 năm 2014. Tuy nhiên, nó có vẻ là một điểm khởi đầu tốt cho sự phát triển trong tương lai.

Nguồn: https://github.com/jonasmalacofilho/ubfox-luks-suspend

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.