Giải mã vùng chứa LUKS khi khởi động hệ thống

Chúc mọi người ngày và đêm tốt lành! Bài đăng này sẽ hữu ích cho những ai sử dụng mã hóa dữ liệu LUKS và muốn giải mã đĩa trên Linux (Debian, Ubuntu) trên giai đoạn giải mã phân vùng gốc. Và tôi không thể tìm thấy thông tin như vậy trên Internet.

Gần đây, với số lượng đĩa trên kệ ngày càng tăng, tôi đã gặp phải vấn đề giải mã đĩa bằng phương pháp nổi tiếng hơn thông qua /etc/crypttab. Cá nhân tôi nhấn mạnh một số vấn đề khi sử dụng phương pháp này, cụ thể là tệp được đọc chỉ sau khi tải (gắn) phân vùng gốc, điều này ảnh hưởng tiêu cực đến quá trình nhập ZFS, đặc biệt nếu chúng được thu thập từ các phân vùng trên thiết bị *_crypt hoặc các cuộc tấn công mdadm cũng được thu thập từ các phân vùng. Tất cả chúng ta đều biết rằng bạn có thể sử dụng parted trên các thùng chứa LUKS, phải không? Ngoài ra còn có vấn đề bắt đầu sớm các dịch vụ khác khi chưa có mảng và sử dụng Tôi đã cần thứ gì đó (Tôi đang làm việc với Proxmox VE 5.x và ZFS được phân cụm trên iSCSI).

Một chút về ZFSoverISCSIiSCSI hoạt động với tôi thông qua LIO và trên thực tế, khi mục tiêu iscsi khởi động và không thấy các thiết bị ZVOL, nó chỉ cần xóa chúng khỏi cấu hình, điều này ngăn hệ thống khách khởi động. Do đó, việc khôi phục tệp json sao lưu hoặc thêm thủ công các thiết bị có mã định danh của từng VM, điều này thật khủng khiếp khi có hàng tá máy như vậy và mỗi cấu hình có nhiều hơn 1 đĩa.

Và câu hỏi thứ hai mà tôi sẽ xem xét là làm thế nào để giải mã (đây là điểm mấu chốt của bài viết). Và chúng ta sẽ nói về điều này bên dưới, hãy bắt đầu phần cắt!

Thông thường, trên Internet, họ sử dụng tệp khóa (được tự động thêm vào vị trí bằng lệnh - cryptsetup luksAddKey) hoặc trong một số trường hợp ngoại lệ hiếm hoi (có rất ít thông tin trên Internet tiếng Nga) - tập lệnh decrypt_ Derivative, nằm ở /lib/cryptsetup/script/ (tất nhiên, có nhiều cách khác, nhưng tôi đã sử dụng hai cách này, tạo nên nền tảng của bài viết). Tôi cũng đã cố gắng kích hoạt tự động hoàn toàn sau khi khởi động lại mà không cần bất kỳ lệnh bổ sung nào trong bảng điều khiển, để mọi thứ đối với tôi sẽ “cất cánh” ngay lập tức. Vì vậy, tại sao phải chờ đợi? —

Hãy bắt đầu nào!

Chúng tôi giả sử một hệ thống, chẳng hạn như Debian, được cài đặt trên phân vùng mật mã sda3_crypt và hàng tá đĩa sẵn sàng mã hóa và tạo bất cứ thứ gì bạn mong muốn. Chúng tôi có một cụm từ khóa (cụm mật khẩu) để mở khóa sda3_crypt và chính từ phần này, chúng tôi sẽ xóa “băm” mật khẩu trên hệ thống đang chạy (đã giải mã) và thêm nó vào các đĩa khác. Mọi thứ đều cơ bản, trong bảng điều khiển chúng tôi thực thi:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

trong đó X là đĩa, phân vùng, v.v.

Sau khi mã hóa các ổ đĩa bằng hàm băm từ cụm từ khóa của chúng tôi, bạn cần tìm ra UUID hoặc ID - tùy thuộc vào ai đã quen với việc gì. Chúng tôi lấy dữ liệu từ /dev/disk/by-uuid và by-id tương ứng.

Giai đoạn tiếp theo là chuẩn bị các tệp và tập lệnh nhỏ cho các chức năng chúng ta cần làm việc, hãy tiến hành:

cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/

далее

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Nội dung của ../decrypt

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

далее

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

Nội dung ../partcopy

#!/bin/sh

cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"

một số nữa

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Nội dung ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

và cuối cùng, trước update-initramfs, bạn cần chỉnh sửa tệp /etc/initramfs-tools/scripts/local-top/cryptroot, bắt đầu từ dòng ~360, một đoạn mã bên dưới

Nguyên


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

và đưa nó về dạng này

Đã chỉnh sửa


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                

                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*

                message "cryptsetup ($crypttarget): set up successfully"
                break

Lưu ý rằng UUID hoặc ID có thể được sử dụng ở đây. Điều chính là các trình điều khiển cần thiết cho thiết bị HDD/SSD được thêm vào /etc/initramfs-tools/modules. Bạn có thể tìm ra trình điều khiển nào được sử dụng bằng lệnh thông tin udevadm -a -n /dev/sdX | egrep 'đang tìm kiếm|DRIVER'.

Bây giờ chúng ta đã hoàn tất và tất cả các tập tin đã sẵn sàng, chúng ta chạy cập nhật-initramfs -u -k tất cả -v, trong việc ghi nhật ký không được lỗi trong việc thực thi các tập lệnh của chúng tôi. Chúng ta khởi động lại, nhập cụm từ khóa và đợi một chút, tùy thuộc vào số lượng đĩa. Tiếp theo, hệ thống sẽ khởi động và ở giai đoạn khởi động cuối cùng, cụ thể là sau khi “gắn” phân vùng gốc, lệnh partprobe sẽ được thực thi - nó sẽ tìm và chọn tất cả các phân vùng đã tạo trên thiết bị LUKS và bất kỳ mảng nào, có thể là ZFS hoặc mdadm, sẽ được lắp ráp mà không gặp vấn đề gì! Và tất cả điều này trước khi xếp hàng các dịch vụ chính cần những đĩa/mảng này.

update1: Thế nào nhận thấy AEP, phương pháp này chỉ hoạt động với LUKS1.

Nguồn: www.habr.com

Thêm một lời nhận xét