SSH เพื่อถอดรหัส LVM ที่เข้ารหัสในระหว่างการบูตเซิร์ฟเวอร์แบบไม่ใช้หัว


59

เมื่อฉันติดตั้ง Ubuntu 10.04 และตอนนี้ 10.10 ฉันได้รับตัวเลือกในการเปิดใช้งาน "การเข้ารหัส LVM" สำหรับฮาร์ดไดรฟ์ของฉัน หลังจากเลือกตัวเลือกนั้นฉันจะขอรหัสผ่านของฉันในระหว่างการบู๊ตเพื่อถอดรหัส LVM

ตอนนี้ฉันกำลังคิดเกี่ยวกับการตั้งค่าเซิร์ฟเวอร์ headless ที่รัน Linux (ไม่จำเป็นต้องเป็น Ubuntu) แต่ฉันกังวลว่าเนื่องจากเซิร์ฟเวอร์นั้นไม่มีหัวฉันจะไม่สามารถถอดรหัสได้ในระหว่างการเริ่มต้น ฉันจะสามารถ SSH ในระหว่างการบู๊ตเพื่อป้อนรหัสผ่านสำหรับ LVM ที่เข้ารหัสหรือไม่ ถ้าเป็นเช่นนั้นฉันจะตั้งค่าได้อย่างไร หรือมีวิธีแก้ไขปัญหาอื่น อีกครั้งคำถามนี้ไม่เฉพาะกับ Ubuntu ขอบคุณ


4
ดูเพิ่มเติมที่:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

ผมคิดว่าคำตอบ @Nate 's ควรจะได้รับการยอมรับที่หนึ่ง: มัน (เป็นหลักตั้งแต่การแก้ไขจะต้องสะท้อนให้เห็นถึงการเปลี่ยนแปลงในบล็อกการเชื่อมโยง) ใช้ประชาชนคีย์ตลอดแทนส่วนตัวคน
โจนาธานวาย

คำตอบ:


25

สำหรับอูบุนตูเวอร์ชันใหม่กว่าเช่น 14.04 ฉันพบการรวมกันของ @dragly และคำตอบของบล็อกนี้มีประโยชน์มาก ในการถอดความ:

  1. (บนเซิร์ฟเวอร์) ติดตั้ง Dropbear

    sudo apt-get install dropbear
    
  2. (บนเซิร์ฟเวอร์) คัดลอกและกำหนดสิทธิ์สำหรับการเข้าสู่ระบบรูตสาธารณะ / คีย์ส่วนตัว

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

อย่าลืมเปลี่ยนผู้ใช้เป็นชื่อผู้ใช้ของคุณบนเซิร์ฟเวอร์

  1. (บนไคลเอนต์) ดึงรหัสส่วนตัวจากเซิร์ฟเวอร์

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (บนไคลเอ็นต์) เพิ่มรายการใน ssh config

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (บนเซิร์ฟเวอร์) สร้างไฟล์นี้ที่/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (บนเซิร์ฟเวอร์) ทำให้ไฟล์นั้นทำงานได้

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. อัปเดต initramfs

    sudo update-initramfs -u
    
  6. ปิดใช้งานบริการ dropbear เมื่อบู๊ตดังนั้น openssh จะถูกใช้หลังจากพาร์ติชั่นถูกถอดรหัส

    sudo update-rc.d dropbear disable
    

คุณทำเสร็จแล้ว ลองดู ตรวจสอบโพสต์บล็อกที่ลิงก์ไปด้านบนเพื่อดูคำแนะนำเกี่ยวกับวิธีกำหนดค่าเซิร์ฟเวอร์ด้วยที่อยู่ IP แบบคงที่หากเป็นสิ่งที่คุณต้องทำ


บล็อกที่เชื่อมโยงนั้นได้เพิ่มการอ้างอิงเพื่อต่อท้ายพับลิกคีย์ของไคลเอ็นต์ไปยังเซิร์ฟเวอร์/etc/initramfs-tools/root/.ssh/authorized_keysแม้ว่ามันจะยังคงผ่านการคัดลอกคีย์ส่วนตัวของ Dropbear ซึ่งหนึ่งในนั้นไม่สนใจอย่างสมบูรณ์ การปฏิบัติตามคำแนะนำที่เหลือนั้นใช้งานได้สำหรับฉันซึ่งหมายความว่านี่ควรเป็นคำตอบที่ยอมรับได้ (เมื่อมันสะท้อนถึงการเปลี่ยนแปลงนั้น) เพราะมันใช้กุญแจสาธารณะเท่านั้น
Jonathan Y.

23

คำแนะนำในการตั้งค่าด้วย BusyBox และ Dropbear จะแสดงในโพสต์บล็อกนี้ เร็ว -shsh ไม่ทำงานสำหรับฉันและเห็นได้ชัดว่าไม่จำเป็นอีกต่อไป

ฉันได้สรุปสิ่งที่คุณต้องทำในสิ่งต่อไปนี้ สำหรับรายละเอียดเพิ่มเติมดูที่โพสต์ด้านบน:

  1. ติดตั้ง BusyBox และ Dropbear บนเซิร์ฟเวอร์ของคุณ

    sudo apt-get install dropbear busybox
    
  2. อัปเดต initramfs ของคุณบนเซิร์ฟเวอร์

    sudo update-initramfs -u
    
  3. คัดลอกคีย์ส่วนตัวที่สร้างขึ้นโดย dropbear ไปยังเครื่องไคลเอนต์ของคุณ คุณอาจต้องคัดลอกสิ่งนี้ไปยัง dir ใหม่และเปลี่ยนความเป็นเจ้าของเพื่อทำสิ่งนี้ บนเซิร์ฟเวอร์ของคุณทำต่อไปนี้:

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    อย่าลืมแทนที่ผู้ใช้ด้วยชื่อผู้ใช้ของคุณ ดูเหมือนว่าการล็อกอินรหัสผ่านจะไม่ทำงาน

  4. ตอนนี้คุณสามารถถ่ายโอนคีย์ส่วนตัวด้วย scp โดยโทรไปที่ลูกค้าของคุณ:

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. ตั้งค่าไฟล์ ~ / .ssh / config ของลูกค้าเพื่อให้เข้าสู่ระบบได้ง่าย เปิดขึ้นด้วยโปรแกรมแก้ไขข้อความและเพิ่มรายการต่อไปนี้:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

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

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

    ssh myremoteserver # or any name you chose
    
  7. เมื่อเข้าสู่ระบบในการออกคำสั่งดังต่อไปนี้บนเซิร์ฟเวอร์ ดูโพสต์บล็อกสำหรับรายละเอียด:

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    จะใช้เวลาสักครู่ (30 วินาที) ก่อนที่คุณจะพิมพ์ข้อความรหัสผ่านของคุณ พิมพ์ในเมื่อได้รับแจ้ง

  8. ปิดการเชื่อมต่อโดยพิมพ์

    exit
    
  9. ตอนนี้เซิร์ฟเวอร์ของคุณควรปลดล็อกฮาร์ดไดรฟ์ที่เข้ารหัสแล้วและบูตตามปกติ

(ขอบคุณมากสำหรับผู้เขียนต้นฉบับของโพสต์บล็อก!)


2
ฉันไม่เข้าใจเหตุผลของการย้ายไปมาด้วยปุ่มส่วนตัว มันควรจะเพียงพอที่จะคัดลอกกุญแจสาธารณะของคุณบนเครื่องไคลเอนต์ไปยังเซิร์ฟเวอร์เป็นคีย์ที่ได้รับอนุญาตสำหรับเซิร์ฟเวอร์รูทใช่ไหม?
gertvdijk

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

1
มีความคิดใดที่ฉันควรทำเพื่อให้การทำงานกับ Arch Linux นี้เป็นไปได้หรือไม่
Gerharddc

1
@Gerhman ตรวจสอบแพ็คเกจdropbear_initrd_encryptใน AUR เพื่อรับการสนับสนุนใน Archlinux
Caleb

1
@ หน้า Gerhman archwiki: การปลดล็อกระยะไกลของรูทหรือพาร์ติชั่นอื่นยังไม่ได้ทำ แต่มันดูน่าสนใจ จะต้องมีการตรวจสอบออก :)
hanetzer

18

ฉันคิดว่าต้น sshให้สิ่งที่คุณกำลังค้นหา:

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

มีแพ็คเกจ. deb อยู่แล้วดังนั้นคุณอาจใช้ Ubuntu ได้


ดูเหมือนว่านี่คือสิ่งที่ฉันกำลังมองหาขอบคุณ!
hpy

3
คุณมีลิงค์ไปยังบทช่วยสอนที่ดีหรือไม่? ฉันกำลังติดอยู่กับต้น - ssh ในกล่องบีบ debian ของฉัน

1
ใช่กวดวิชาจะดีมาก
hpy


16

ดูที่ cryptsetup readme สำหรับสิ่งนี้ใน/usr/share/doc/cryptsetup/README.remote.gz(แพ็คเกจ Ubuntu cryptsetup) ในมีคำแนะนำเต็มรูปแบบเพื่อให้บรรลุนี้ มันคล้ายกับคำตอบของ draglyแต่ฉันคิดว่านี่เป็นสิ่งที่สวยงามกว่าเล็กน้อย (คีย์ที่จัดรูปแบบ Dropbear ผ่านวลีรหัสผ่านผ่าน FIFO แทนที่จะเป็นเชลล์สคริปต์ที่เปราะบาง ฯลฯ )

ปลดล็อก rootfs ผ่านการล็อกอิน ssh ใน initramfs

คุณสามารถปลดล็อกรูทของคุณในการบูทเครื่องจากระยะไกลโดยใช้ ssh เพื่อล็อกอินเข้าสู่ระบบบูทในขณะที่มันกำลังทำงานเมื่อติดตั้ง initramfs

ติดตั้ง

เพื่อให้การปลดล็อคจากระยะไกลทำงานได้แพคเกจต่อไปนี้จะต้องติดตั้งก่อนสร้าง initramfs: dropbear busybox

ไฟล์/etc/initramfs-tools/initramfs.confเก็บตัวเลือกการกำหนดค่าที่ใช้เมื่อสร้าง initramfs มันควรจะมีBUSYBOX=y (ซึ่งถูกตั้งค่าเป็นค่าเริ่มต้นเมื่อมีการติดตั้งแพคเกจ busybox) เพื่อให้มีการติดตั้ง busybox ลงใน initramfs และไม่ควรมี DROPBEAR=nซึ่งจะปิดใช้งานการติดตั้ง dropbear ไปยัง initramfs หากตั้งค่าเป็นDROPBEAR=ydropbear จะถูกติดตั้งในทุกกรณี หาก DROPBEARไม่ได้ตั้งค่าเลยจะมีการติดตั้ง dropbear เฉพาะในกรณีที่มีการตั้งค่า cryptroot

คีย์โฮสต์ที่ใช้สำหรับ initramfs มีdropbear_dss_host_keyและ ทั้งที่ตั้งอยู่ในdropbear_rsa_host_key /etc/initramfs-tools/etc/dropbear/หากไม่มีอยู่เมื่อทำการรวบรวม initramfs จะมีการสร้างขึ้นโดยอัตโนมัติ ต่อไปนี้เป็นคำสั่งในการสร้างด้วยตนเอง:

dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

เนื่องจาก initramfs จะไม่ได้รับการเข้ารหัสการรับรองความถูกต้อง publickey จะถือว่า คีย์ (s) /etc/initramfs-tools/root/.ssh/authorized_keysใช้สำหรับการที่จะนำมาจาก หากไฟล์นี้ไม่มีอยู่เมื่อทำการรวบรวม initramfs ไฟล์นั้นจะถูกสร้างขึ้นและ /etc/initramfs-tools/root/.ssh/id_rsa.pubจะถูกเพิ่มเข้าไป หากไฟล์หลังไม่มีอยู่ไฟล์นั้นจะถูกสร้างขึ้นโดยอัตโนมัติคุณจะพบคีย์ส่วนตัวที่ตรงกันซึ่งคุณจะต้องลงชื่อเข้าใช้ initramfs ในภายหลัง/etc/initramfs-tools/root/.ssh/id_rsa (หรือid_rsa.dropbearในกรณีที่คุณต้องการในรูปแบบ dropbear) ต่อไปนี้เป็นคำสั่งให้ทำตามขั้นตอนที่เกี่ยวข้องด้วยตนเอง:

ในการสร้างคีย์ (ในรูปแบบดรอปบีด):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

ในการแปลงคีย์จากรูปแบบดรอปบีเป็นรูปแบบ openssh:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

วิธีแยกคีย์สาธารณะ:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

หากต้องการเพิ่มพับลิกคีย์ไปยังไฟล์ authorized_keys:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

ในกรณีที่คุณต้องการอินเตอร์เฟซที่บางส่วนจะได้รับการกำหนดค่าใช้ DHCP, การตั้งค่า DEVICE=ใน/etc/initramfs-tools/initramfs.confควรจะเพียงพอ initramfs ควรให้เกียรติip=พารามิเตอร์ของเคอร์เนลด้วย ในกรณีที่คุณใช้ด้วงคุณอาจต้องการตั้งค่าไว้/boot/grub/menu.lstไม่ว่าจะใน ' # kopt=' line หรือต่อท้าย ' kernel' line ที่เฉพาะเจาะจง ip=พารามิเตอร์เคอร์เนลการบันทึกไว้ในDocumentation/nfsroot.txtในต้นไม้มาเคอร์เนล

ประเด็น

อย่าลืมเรียกใช้update-initramfsเมื่อคุณเปลี่ยนการตั้งค่าเพื่อให้มีประสิทธิภาพ!

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

ขั้นตอนการปลดล็อค

หากต้องการปลดล็อกจากระยะไกลคุณสามารถทำสิ่งนี้:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

ตัวอย่างนี้สมมติว่าคุณมีknown_hostsไฟล์พิเศษ" ~/.ssh/known_hosts.initramfs" ซึ่งเก็บรหัสโฮสต์ของระบบ cryptroot ว่าคุณมีไฟล์ " ~/id_rsa.initramfs" ซึ่งเก็บคีย์ที่ได้รับอนุญาตสำหรับระบบ cryptroot ว่าชื่อของระบบ cryptroot นั้นคือ " initramfshost.example.com" และนั่นคือ ข้อความรหัสผ่าน cryptroot คือ " secret"

- < debian@x.ray.net>, พุธ, 30 Sep 2009

ขอบคุณjap ที่ชี้เรื่องนี้ให้ฉันดูในช่องอื่น


1
ดูเหมือนว่าเป็นความคิดที่ดีกว่า (อธิบายไว้ในเอกสารอย่างเป็นทางการและทุกอย่าง) กว่าแฮ็ค PS-grepping หมายเหตุด้านข้างเกี่ยวกับขั้นตอนการปลดล็อคที่ให้ไว้อาจมีใครต้องการระมัดระวังเกี่ยวกับการพิมพ์วลีรหัสผ่านโดยตรงบนบรรทัดคำสั่งเพราะมันมักจะจบลงในไฟล์ประวัติเชลล์บางแห่ง วิธีการแก้ปัญหาที่เป็นไปได้คือการสร้างสคริปต์กระดาษห่อเล็ก ๆ read -s -pกระตุ้นสำหรับการใช้รหัสผ่าน
joelpet

1
โปรดทราบว่ามีปัญหาเกี่ยวกับวิธีการดังกล่าวใน Ubuntu รุ่นล่าสุดเช่นbugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord

6

หากคุณต้องการที่จะบูตแบบอัตโนมัติและจากระยะไกลคุณควรดูMandos (ซึ่งฉันและคนอื่น ๆ เขียนไว้):

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

กล่าวโดยย่อเซิร์ฟเวอร์การบูตจะได้รับรหัสผ่านบนเครือข่ายอย่างปลอดภัย ดู README สำหรับรายละเอียด


ขอบคุณสำหรับการมีส่วนร่วมของคุณ แต่โปรดทราบว่า 100% ของการโพสต์ของคุณเป็นผลิตภัณฑ์ที่กล่าวถึงเกือบเหมือนกันคือพฤติกรรมเส้นขอบและคุณมีความเสี่ยงที่จะถูกพิจารณาว่าเป็นสแปม (ฉันทำเครื่องหมายโพสต์ของคุณ หรือคุณไม่มีประวัติของการโพสต์ที่ไม่ใช่ Mandos ในเว็บไซต์อื่น ๆ )
Gilles

@Gilles: เสร็จแล้ว
เท็ดดี้

2

เซิร์ฟเวอร์ไร้หัว? หากมีพอร์ตอนุกรมให้ใช้

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

ความคิดที่ดีเสมอที่จะมีวิธี "ไม่ใช่เครือข่าย" ในการเข้าใช้เซิร์ฟเวอร์แบบไม่มีหัว


จุดที่ดี! แม้ว่าวิธีที่ " ไม่ใช่เครือข่าย " ในการเข้าใช้เซิร์ฟเวอร์แบบไม่มีหัวนั้นส่วนใหญ่จะเกี่ยวข้องกับความใกล้ชิดทางกายภาพระหว่างไคลเอนต์ / เซิร์ฟเวอร์เท่านั้น นอกเสียจากว่าฉันจะมองเห็นความเป็นไปได้ / คุณสมบัติอื่นของการเชื่อมต่อแบบอนุกรม
ILMostro_7

2

บน arch linux มีแพ็คเกจ AUR dropbear_initrd_encryptที่ทำสิ่งที่คุณต้องการออกจากกล่อง ใช้งานได้ดีสำหรับอินเตอร์เฟสแบบมีสาย ฉันต้องแฮ็คมันขึ้นเล็กน้อยสำหรับไร้สาย


2

น่าเสียดายที่ไม่มีคำตอบข้างต้นทำงานให้ฉัน ยิ่งไปกว่านั้นการคัดลอกคีย์ส่วนตัวจากเซิร์ฟเวอร์นั้นดูขัดแย้งกัน

อย่างไรก็ตามคำแนะนำต่อไปนี้ใช้ได้ผล :

บู๊ตเซิร์ฟเวอร์ของคุณโดยเชื่อมต่อและปลดล็อคพาร์ติชันที่เข้ารหัสผ่านไคลเอนต์ของคุณ

ติดตั้งแพ็คเกจที่จำเป็น (บน SERVER)

apt-get install dropbear initramfs-tools busybox

ต่อท้ายกุญแจสาธารณะที่คุณต้องการลงในไฟล์ authorized_keys ของ SERVER

เพียงคัดลอกและวางกุญแจสาธารณะของคุณลง/etc/dropbear-initramfs/authorized_keysใน SERVER

สร้างสคริปต์ปลดล็อค

สร้างสคริปต์ต่อไปนี้ใน /etc/initramfs-tools/hooks/crypt_unlock.sh

#!/bin/sh

PREREQ="dropbear"

prereqs() {
  echo "$PREREQ"
}

case "$1" in
  prereqs)
    prereqs
    exit 0
  ;;
esac

. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

ทำให้ปฏิบัติการได้:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

สร้าง IP แบบคงที่ (หรือข้ามขั้นตอนนี้เพื่อใช้ DHCP)

แก้ไข/etc/initramfs-tools/initramfs.confเพื่อเพิ่ม (หรือเปลี่ยน) บรรทัด:

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

อัปเดต initialramfs

update-initramfs -u

ปิดใช้งานบริการ dropbear เมื่อบู๊ตดังนั้น openssh จะถูกใช้หลังจากพาร์ติชั่นถูกถอดรหัส

sudo update-rc.d dropbear disable

การทดสอบ

  • รีบูตเซิร์ฟเวอร์ของคุณ
  • เชื่อมต่อกับเซิร์ฟเวอร์ของคุณผ่าน ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

ใน debian 9 (เสถียร) โซลูชันนี้ล้าสมัย ในระหว่างการติดตั้งฉันได้รับคำเตือนdropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!และฉันไม่สามารถหากุญแจที่ต้องการได้ วิธีนี้เป็นวิธีที่ง่ายมากและได้รับการอธิบายให้ฉันทราบในช่อง #debian ที่ยอดเยี่ยม (ขอบคุณอีกครั้ง):

ก่อนให้แน่ใจว่าbusybox, dropbearและdropbear-initramfsมีการติดตั้ง

sudo apt install busybox dropbear*

แล้วเพิ่มคีย์สาธารณะของคุณ (ใช้เวลาส่วนใหญ่~/.ssh/id_rsa.pub) /etc/dropbear-initramfs/authorized_keysในแฟ้ม

อัพเดตจากนั้นinitramfsพิจารณาการเปลี่ยนแปลง:: update-initramfs -u

นั่นคือทั้งหมด!

หมายเหตุหากคุณต้องการหลีกเลี่ยงการปะทะกันระหว่างคีย์ระหว่างdropbearและopenssh(พวกเขาใช้ IP เดียวกัน แต่ใช้รหัสอื่น) คุณอาจต้องการใส่ไคลเอนต์ของคุณใน~/.ssh/configลักษณะดังนี้:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

จากนั้นคุณเพียงเชื่อมต่อโดยใช้:

ssh myserver_luks_unlock

และเมื่อคุณได้รับพรอมต์ให้พิมพ์ตามที่แนะนำโดยพรอมต์ busybox:

cryptroot-unlock

และพิมพ์รหัสผ่านของคุณ

สนุก!



0

ฉันใช้เทคนิคที่อธิบายโดยผู้อื่นในหน้านี้ (SSH ใน initramfs พร้อมIPพารามิเตอร์เคอร์เนลเพื่อกำหนดค่าเครือข่าย) เป็นเวลาไม่กี่ปีที่ผ่านมาตอนนี้เพื่อปลดล็อกเซิร์ฟเวอร์ Ubuntu Linux ที่ไม่มีหัว (12.02, 14.04, 16.04 และ 18.04) จากระยะไกล

ฉันยังพัฒนาโปรแกรม Python ( unlock-remote-system ) ซึ่งเป็นการปลดล็อคจริงสำหรับฉันเพราะกระบวนการทำสิ่งนี้ด้วยตนเองรู้สึกเปราะบางและฉันเริ่มกลัวการรีบูตเซิร์ฟเวอร์ของฉันดังนั้นด้วยจิตวิญญาณ จาก "ถ้ามันเจ็บมันมีค่าโดยอัตโนมัติ" ฉันเข้ารหัสความรู้ของฉันใน Python 😇 (และสิ่งนี้ทำให้ง่ายต่อการรีบูตปกติเพื่อใช้การปรับปรุงความปลอดภัย)

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

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