การใช้วลีรหัสผ่านเดียวเพื่อปลดล็อกดิสก์ที่เข้ารหัสหลายอันตอนบูต


23

เครื่องของฉันมี SSD ซึ่งฉันติดตั้งระบบและ HDD ซึ่งฉันใช้เป็นที่เก็บข้อมูลสำหรับไฟล์ขนาดใหญ่และ / หรือไฟล์ที่ใช้งานไม่บ่อย ทั้งสองถูกเข้ารหัส แต่ฉันเลือกที่จะใช้วลีรหัสผ่านเดียวกันสำหรับพวกเขา SSD ติดตั้งที่/และ HDD ที่/usr/hdd(ผู้ใช้แต่ละรายแต่ละคนมีไดเรกทอรีอยู่และสามารถเชื่อมโยงตามที่พวกเขาต้องการจากโฮมไดเร็กตอรี่)

เมื่อระบบถูกบูทระบบจะถามวลีรหัสผ่านสำหรับ SSD ทันทีและอีกสองสามวินาทีต่อมาสำหรับ HDD (ติดตั้งอัตโนมัติ) ระบุว่าข้อความรหัสผ่านทั้งสองเหมือนกันมีวิธีกำหนดค่าระบบให้ถามเพียงครั้งเดียวหรือไม่


คุณอาจจะเขียนexpectสคริปต์หรือสิ่งที่คล้ายกันซึ่งได้รับการเรียกให้ติดตั้งดิสก์แทนที่จะให้ระบบทำ ระบบจะเรียกใช้สคริปต์ซึ่งจะขอรหัสผ่านแทนเก็บไว้และมอบให้กับการดำเนินการเมาท์แต่ละครั้ง
h3rrmiller

ถ้าฉันเข้าใจความคิดของคุณถูกต้องมันจะไม่สามารถนำไปใช้กับ SSD ได้เพราะเป็นที่ที่ระบบบู๊ต แต่มันก็ไร้ประโยชน์เพราะฉันยังคงต้องพิมพ์วลีรหัสผ่านสำหรับ HDD แยกกัน หรือไม่?
doublep

คุณสามารถใช้เพื่อปลดล็อคไดรฟ์ที่สอง/etc/crypttab
jasonwryan

1
@ jasonwryan หากสามารถขยายเป็นคำตอบได้แล้ว ... คำตอบควรโพสต์เป็นคำตอบไม่ใช่ความคิดเห็น
Derobert

1
@derobert บางครั้งคนไม่มีเวลาหรือความชอบในการเขียนคำตอบที่ดี
jasonwryan

คำตอบ:


24

การแจกแจงแบบ Debian:

Debian และ Ubuntu จัดส่งสคริปต์การแคชรหัสผ่านdecrypt_keyctlพร้อมแพคเกจcryptsetup

สคริปต์decrypt_keyctlให้รหัสผ่านเดียวกันกับเป้าหมาย LUKS ที่เข้ารหัสหลายรายการช่วยให้คุณไม่ต้องพิมพ์ซ้ำหลายครั้ง มันสามารถเปิดใช้งานในcrypttabพร้อมkeyscript=decrypt_keyctlตัวเลือก รหัสผ่านเดียวกันจะใช้สำหรับเป้าหมายที่มีตัวบ่งชี้ที่เหมือนกันในสนาม keyfile รหัสผ่านการบูตสำหรับตัวระบุแต่ละตัวจะถูกถามหนึ่งครั้ง

ตัวอย่างcrypttab :

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl
part2_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl

หลังจากคุณอัปเดตcryptabแล้วคุณจะต้องอัปเดต initramfs เพื่อใช้การเปลี่ยนแปลง update-initramfs -uใช้

readme แบบเต็มสำหรับ decrypt_keyctl ตั้งอยู่ /usr/share/doc/cryptsetup/README.keyctl

น่าเสียดายที่ตอนนี้ไม่สามารถใช้งานได้กับระบบ Debian ที่ใช้ systemd init เนื่องจากข้อผิดพลาด (ระบบ init อื่นควรไม่ได้รับผลกระทบ) หน้า man crypttab ของ Debian แนะนำให้ใช้วิธีแก้ปัญหาในการใช้initramfsตัวเลือกเพื่อบังคับให้ประมวลผลในช่วงเริ่มต้นของการบูต initramfs


การแจกแจงที่ไม่มีสคริปต์decrypt_keyctl :

หากการกระจายของคุณไม่ได้ให้decrypt_keyctrlอุปกรณ์สามารถปลดล็อกได้โดยใช้ keyfile ในระบบไฟล์รากที่เข้ารหัส สิ่งนี้เมื่อระบบไฟล์รากสามารถปลดล็อคและติดตั้งก่อนอุปกรณ์ที่เข้ารหัสอื่น ๆ

LUKS รองรับช่องเสียบหลายช่อง วิธีนี้ช่วยให้คุณสามารถปลดล็อคอุปกรณ์โดยใช้รหัสผ่านหากไฟล์คีย์ไม่พร้อมใช้งาน / สูญหาย

  1. สร้างคีย์ด้วยข้อมูลแบบสุ่มและตั้งค่าการอนุญาตให้เจ้าของอ่านได้เท่านั้นเพื่อหลีกเลี่ยงการรั่วไหล โปรดทราบว่าไฟล์คีย์จำเป็นต้องอยู่ในพาร์ติชันรากซึ่งจะถูกปลดล็อคก่อน

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. เพิ่มรหัสลงในอุปกรณ์ LUKS ของคุณ

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. กำหนดค่าcrypttabเพื่อใช้ไฟล์คีย์ บรรทัดแรกควรจะเป็นอุปกรณ์รากเนื่องจากอุปกรณ์ที่จะปลดล็อคในลำดับเดียวกันตามที่ระบุไว้ในcrypttab ใช้พา ธ สัมบูรณ์สำหรับไฟล์คีย์

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    

จากบรรทัดแรกของ readme มันดูมีแนวโน้มมากขอบคุณ ฉันจะตรวจสอบในวันพรุ่งนี้ (ไม่ต้องการรีบูตตอนนี้)
doublep

น่าเสียดายที่มันไม่ทำงาน (เหมือนไม่มีการเปลี่ยนแปลง) ดูของฉันcrypttab (ฉันไม่ได้สัมผัสUUID=ที่สร้างขึ้นโดยการติดตั้งระบบที่ผมคิดว่ามันไม่ควรเรื่อง) และรายการที่เกิดขึ้นใน /var/log/syslogข้อผิดพลาดนั้นสามารถเข้าใจได้ แต่ฉันไม่รู้ว่าควรทำอย่างไรกับพวกเขา ไฟล์/lib/cryptsetup/scripts/decrypt_keyctlมีอยู่ดังนั้นฉันไม่รู้ว่าทำไมมันถึงบ่นเกี่ยวกับตัวเลือกที่ไม่รู้จัก ฉันยังมีความคิดว่าจะระบุเป็น keyfile ไม่มีผมเห็นไม่มีคำอธิบายใดก็ได้ ...
doublep

คุณยืนยันว่า decrypt_keyctl รวมอยู่ใน initramfs หรือไม่ ตรวจสอบโดยใช้ตัวเลือกอย่างละเอียดเมื่อปรับปรุงภาพ: ก็ควรเอาท์พุทupdate-initramfs -u -k $(uname -r) -v Adding binary /lib/cryptsetup/scripts/decrypt_keyctl
sebasth

1
ในการดูว่า initramfs มีอะไร:lsinitramfs /boot/initrd.img-$(uname -r)
sebasth

3
ขอโทษด้วยตอนนี้ที่ฉันให้ความสนใจกับสิ่งที่update-initramfsพูดมากขึ้นฉันก็สังเกตเห็นสิ่งนี้: E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. หลังจาก googling นิดหน่อยฉันพบว่าฉันอาจต้องการkeyutilsแพ็คเกจ (ไม่ได้ติดตั้งจริงๆ) ตอนนี้update-initramfsประสบความสำเร็จและไม่เอ่ยถึงlsinitramfs decrypt_keytlsจะอัปเดตหลังจากการบู๊ตครั้งถัดไป
คู่

3

นี่เป็นวิธีแก้ปัญหาของฉันใน debian รับข้อผิดพลาดที่อ้างถึงข้างต้นโดย @sebasth

การตั้งค่าของฉันแตกต่างกันเล็กน้อย ฉันมีพาร์ติชั่นรูทที่เข้ารหัสและดิสก์ RAID หลายตัว สำหรับฉันฉันต้องเพิ่มตัวเลือก initramfs ใน crypttab:

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs
part2_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs

สิ่งนี้บอกว่า update-initramfs นั้นฉันต้องการให้รายการ crypttab เหล่านี้ติดตั้งใน initramfs ฉันตรวจสอบ crypttab ของฉันโดยเรียกใช้

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

โปรดทราบว่าดิสก์การโจมตีของฉันเป็น dm-crypt ธรรมดา นี่หมายความว่าฉันไม่สามารถใช้วิธี luks keyfile ที่แก้ไขข้อผิดพลาด systemd keyscript สำหรับ dm-crypt ธรรมดาฉันจะต้องเก็บข้อความรหัสผ่านไว้ในข้อความธรรมดา

ต้องเข้ารหัสดิสก์ที่เข้ารหัสก่อนที่update-initramfsจะรัน มิฉะนั้นจะทำให้เกิดข้อผิดพลาด ฉันต้องมองหาบรรทัดต่อไปนี้เมื่อสร้าง initramfs ของฉัน:

update-initramfs -k -u -v | grep 'keyctl'

ซึ่งแสดงสองไฟล์ต่อไปนี้:

/bin/keyctl
cryptkeyctl

กำลังเพิ่มเข้ากับ initramfs

ในที่สุดฉันต้องปิดการใช้งาน systemd จัดการ crypttab ของฉันเพื่อจัดการกับข้อผิดพลาดที่อ้างถึงข้างต้น: systemd ไม่สนับสนุนตัวเลือก keyscript ใน crypttab สำหรับเรื่องนี้ฉันเพิ่มตัวเลือกเคอร์เนล

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

/ etc / default / update-grubด้วงและวิ่ง ตอนนี้ systemd ละเว้น crypttab และพาร์ทิชันที่เข้ารหัสทั้งหมดจะถูกโหลดใน initramfs

เนื่องจากฉันมีพาร์ติชันรากที่เข้ารหัสลับ cryptroot จึงไม่ปรากฏในแคชคีย์ของฉัน หมายความว่าฉันต้องป้อนรหัสผ่านสองครั้ง หนึ่งสำหรับพาร์ติชันรากและอีกครั้งสำหรับอาร์เรย์การโจมตี


1

อีกทางเลือกหนึ่งคือการใช้ /lib/cryptsetup/scripts/decrypt_derivedสคริปต์ซึ่งเป็นส่วนหนึ่งของ cryptsetup ใน Debian / Ubuntu

แทนการแคชคีย์คุณใช้ไดรฟ์ข้อมูลคีย์ของดิสก์หนึ่งเป็นรหัสผ่านเพิ่มเติมสำหรับดิสก์ที่สอง สิ่งนี้ต้องการเพิ่มรหัสผ่านที่สองลงในดิสก์ที่เข้ารหัสที่สอง (และที่สามเป็นต้น) แต่ LUKS รองรับสิ่งนั้น ดังนั้นวิธีนี้จึงสามารถใช้งานได้หากดิสก์ที่เข้ารหัสหลายอันของคุณไม่ได้ใช้รหัสผ่านเดียวกัน

ตัวอย่างการเพิ่มคีย์จาก sda6crypt ไปยัง sda5:

เพิ่มปุ่มปรับระดับเสียงของ sda6crypt เป็นรหัสผ่านเพิ่มเติมสำหรับ sda5:

mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo

กำหนดค่า sda5crypt เพื่อปลดล็อกโดยอัตโนมัติ /etc/crypttab

ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID=<uuid> sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab

สิ่งนี้ใช้ไพพ์ที่มีชื่อ ( fifo) เพื่อส่งผ่านคีย์เพื่อหลีกเลี่ยงการเก็บคีย์โวลุ่มในไฟล์ชั่วคราวบนดิสก์

keyscriptตัวเลือกที่ทำงานได้เฉพาะในกรณีที่crypttabมีการประมวลผลโดย Debian เครื่องมือ cryptsetup เดิม reimplementation systemd ไม่สนับสนุนมัน หากระบบของคุณใช้ systemd (ซึ่งเป็นระบบส่วนใหญ่) คุณจะต้องinitramfsตัวเลือกในการบังคับให้การประมวลผลเกิดขึ้นใน initrd โดยเครื่องมือ cryptsetup ก่อนที่ systemd จะเริ่มทำงาน

อ้างอิงจาก/unix//a/32551/50793


ต้องบอกว่านี่เป็นคำตอบที่สวยงามใช้งานได้ทันทีโดยไม่มีอาการสะอึกบนเดเบียน 10 บัสเตอร์!
Janus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.