การถอดรหัสคอนเทนเนอร์ LUKS ณ เวลาบูตระบบ

สวัสดีวันดีคืนค่ะทุกคน! โพสต์นี้จะเป็นประโยชน์สำหรับผู้ที่ใช้การเข้ารหัสข้อมูลของ LUKS และต้องการถอดรหัสดิสก์ภายใต้ Linux (Debian, Ubuntu) บน ขั้นตอนการถอดรหัสพาร์ติชันรูท. และฉันไม่พบข้อมูลดังกล่าวบนอินเทอร์เน็ต

เมื่อเร็ว ๆ นี้ ด้วยจำนวนดิสก์ในชั้นวางที่เพิ่มขึ้น ฉันพบปัญหาในการถอดรหัสดิสก์โดยใช้วิธีการที่รู้จักกันดีผ่าน /etc/crypttab โดยส่วนตัวแล้วฉันเน้นปัญหาเล็กน้อยในการใช้วิธีนี้ กล่าวคือไฟล์กำลังถูกอ่าน หลังจากโหลด (เมานต์) พาร์ติชันรูทเท่านั้นซึ่งส่งผลเสียต่อการนำเข้า ZFS โดยเฉพาะอย่างยิ่งหากสร้างจากพาร์ติชันบนอุปกรณ์ *_crypt หรือการจู่โจม mdadm ที่สร้างจากพาร์ติชันเช่นกัน เราทุกคนทราบดีว่าคุณสามารถใช้แยกชิ้นส่วนบนภาชนะของ LUKS ได้ใช่ไหม? และปัญหาของการเริ่มบริการอื่น ๆ ก่อนกำหนดเมื่อยังไม่มีอาร์เรย์ แต่ ใช้ ฉันต้องการบางอย่างแล้ว (ฉันทำงานกับ Proxmox VE 5.x และ ZFS บนคลัสเตอร์ผ่าน iSCSI)

เล็กน้อยเกี่ยวกับ ZFSoverISCSIiSCSI ทำงานให้ฉันผ่าน LIO และในความเป็นจริง เมื่อเป้าหมาย iscsi เริ่มทำงานและไม่เห็นอุปกรณ์ ZVOL ก็จะลบอุปกรณ์เหล่านั้นออกจากการกำหนดค่า ซึ่งป้องกันระบบแขกจากการบูท ดังนั้น ไม่ว่าจะกู้คืนข้อมูลสำรองไฟล์ json หรือเพิ่มอุปกรณ์ที่มีตัวระบุสำหรับแต่ละ VM ด้วยตนเอง ซึ่งเป็นเรื่องที่แย่มากเมื่อมีเครื่องดังกล่าวหลายสิบเครื่องและการกำหนดค่าแต่ละรายการมีดิสก์มากกว่า 1 แผ่น

และคำถามที่สองที่ฉันจะพิจารณาคือวิธีการถอดรหัส (นี่คือประเด็นสำคัญของบทความ) และเราจะพูดถึงเรื่องนี้ด้านล่าง ไปกันเลย!

บ่อยครั้งที่มีการใช้ไฟล์คีย์บนอินเทอร์เน็ต (เพิ่มตัวเองลงในสล็อตก่อนหน้านี้ด้วยคำสั่ง - cryptsetup luksAddKey) หรือในข้อยกเว้นที่หายาก (บนอินเทอร์เน็ตภาษารัสเซียมีข้อมูลน้อยมาก) - สคริปต์ decrypt_derived อยู่ใน /lib/cryptsetup/script/ (แน่นอนว่ามีวิธีอื่น แต่ฉันใช้สองวิธีนี้ซึ่งเป็นพื้นฐานของบทความ) ฉันยังพยายามรวมระบบอัตโนมัติเต็มรูปแบบหลังจากรีบูต โดยไม่ต้องมีคำสั่งเพิ่มเติมในคอนโซล เพื่อให้ทุกอย่าง "บินขึ้น" สำหรับฉันทันที เหตุใดจึงรอ —

เริ่มกันเลย!

สมมติว่าระบบ เช่น Debian ติดตั้งบนพาร์ติชันการเข้ารหัสลับ sda3_crypt และดิสก์โหลที่พร้อมเข้ารหัสและสร้างเนื้อหาในหัวใจของคุณ เรามีวลีรหัสผ่าน (ข้อความรหัสผ่าน) เพื่อปลดล็อก sda3_crypt และจากพาร์ติชันนี้เราจะลบ "แฮช" ออกจากรหัสผ่านในระบบที่กำลังทำงานอยู่ (ถอดรหัส) และเพิ่มลงในดิสก์ที่เหลือ ทุกอย่างเป็นพื้นฐานในคอนโซลเราดำเนินการ:

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

โดยที่ X คือดิสก์พาร์ติชันของเรา ฯลฯ

หลังจากเข้ารหัสดิสก์ด้วย "แฮช" จากวลีรหัสผ่านของเรา คุณต้องค้นหา UUID หรือ ID - ขึ้นอยู่กับว่าใครคุ้นเคยกับอะไรและอะไร เรารับข้อมูลจาก /dev/disk/by-uuid และ by-id ตามลำดับ

ขั้นตอนต่อไปคือการเตรียมไฟล์และมินิสคริปต์สำหรับฟังก์ชันที่เราต้องการ ดำเนินการต่อ:

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

เนื้อหาของ ../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

เนื้อหาของ ../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"

อีกเล็กน้อย

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

เนื้อหา ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

และสุดท้าย ก่อน update-initramfs คุณต้องแก้ไขไฟล์ /etc/initramfs-tools/scripts/local-top/cryptroot โดยเริ่มจากบรรทัด ~360 ข้อมูลโค้ดด้านล่าง

ดั้งเดิม


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

แล้วนำมาลงในแบบฟอร์มนี้

แก้ไข


                # 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

โปรดทราบว่าสามารถใช้ UUID หรือ ID ได้ที่นี่ สิ่งสำคัญคือมีการเพิ่มไดรเวอร์ที่จำเป็นสำหรับอุปกรณ์ HDD / SSD ใน /etc/initramfs-tools/modules คุณสามารถค้นหาไดรเวอร์ที่ใช้ได้ด้วยคำสั่ง ข้อมูล udevadm -a -n /dev/sdX | egrep 'กำลังมองหา | คนขับ'.

ตอนนี้เราทำเสร็จแล้วและไฟล์ทั้งหมดเข้าที่แล้ว ให้รัน อัปเดต initramfs -u -k ทั้งหมด -vในการบันทึก จะต้องไม่เป็น ข้อผิดพลาดในการดำเนินการของสคริปต์ของเรา เรารีบูต ป้อนข้อความรหัสผ่านและรอสักครู่ ขึ้นอยู่กับจำนวนดิสก์ ถัดไป ระบบจะเริ่มต้นและในขั้นตอนสุดท้ายของการเปิดตัว กล่าวคือหลังจาก "ติดตั้ง" พาร์ติชันรูทแล้ว คำสั่ง partprobe จะถูกดำเนินการ - ระบบจะค้นหาและรับพาร์ติชันที่สร้างขึ้นทั้งหมดบนอุปกรณ์ LUKS และอาร์เรย์ใดๆ ไม่ว่าจะเป็น ZFS หรือ mdadm จะรวมตัวกันโดยไม่มีปัญหา! และทั้งหมดนี้ ก่อนโหลด บริการหลักและบริการที่ต้องการดิสก์/อาร์เรย์เหล่านี้

update1: ยังไง สังเกตเห็น อีพีวิธีนี้ใช้ได้กับ LUKS1 เท่านั้น

ที่มา: will.com

เพิ่มความคิดเห็น