SSH để giải mã LVM được mã hóa trong quá trình khởi động máy chủ không đầu?


59

Khi tôi cài đặt Ubuntu 10.04 và bây giờ, 10.10, tôi đã được cung cấp tùy chọn bật "LVM được mã hóa" cho ổ cứng của mình. Sau khi chọn tùy chọn đó, tôi được nhắc nhập mật khẩu trong khi khởi động để giải mã LVM.

Bây giờ, tôi đang suy nghĩ về việc thiết lập một máy chủ không đầu chạy Linux (không nhất thiết phải là Ubuntu), nhưng tôi lo lắng rằng vì máy chủ không có đầu nên tôi sẽ không thể giải mã nó trong khi khởi động. Tôi có thể SSH vào trong khi khởi động để nhập mật khẩu cho LVM được mã hóa không? Nếu vậy làm thế nào để tôi thiết lập nó? Hay là có một giải pháp khác? Một lần nữa câu hỏi này KHÔNG dành riêng cho Ubuntu. Cảm ơn.


4
Xem thêm:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

Tôi nghĩ rằng câu trả lời của @Nate phải là câu trả lời được chấp nhận: nó (về cơ bản, vì cần phải chỉnh sửa để phản ánh các thay đổi trong blog được liên kết) sử dụng các khóa công khai trong suốt thay vì riêng tư .
Jonathan Y.

Câu trả lời:


25

Ví dụ, đối với các phiên bản mới hơn của Ubuntu, 14.04, tôi thấy sự kết hợp của @dragly và câu trả lời của blog này rất hữu ích. Để diễn dải:

  1. (Trên máy chủ) Cài đặt Dropbear

    sudo apt-get install dropbear
    
  2. (Trên máy chủ) Sao chép và gán quyền cho đăng nhập khóa công khai / khóa riêng

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

nhớ thay đổi người dùng thành tên người dùng của bạn trên máy chủ

  1. (Trên máy khách) Lấy khóa riêng từ máy chủ

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (Trên máy khách) Thêm một mục vào cấu hình ssh

    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. (Trên máy chủ) Tạo tệp này tại/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (Trên máy chủ) Làm cho tập tin đó có thể thực thi được

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Cập nhật các initramfs

    sudo update-initramfs -u
    
  6. Vô hiệu hóa dịch vụ dropbear khi khởi động để openssh được sử dụng sau khi phân vùng được giải mã

    sudo update-rc.d dropbear disable
    

Bạn đã hoàn tất. Hãy thử nó. Kiểm tra bài đăng trên blog được liên kết ở trên để biết hướng dẫn về cách định cấu hình máy chủ với địa chỉ IP tĩnh nếu đó là điều bạn cần làm.


Blog được liên kết đã thêm một tham chiếu để nối thêm khóa chung của máy khách vào máy chủ /etc/initramfs-tools/root/.ssh/authorized_keys, ngay cả khi nó vẫn tiếp tục sao chép khóa riêng của Dropbear, mà khóa này hoàn toàn có thể bỏ qua. Thực hiện theo các hướng dẫn còn lại cho tôi, điều đó có nghĩa đây sẽ là câu trả lời được chấp nhận (một khi nó phản ánh sự thay đổi đó), bởi vì nó chỉ sử dụng các khóa công khai.
Jonathan Y.

23

Hướng dẫn thực hiện thiết lập như vậy với BusyBox và Dropbear được hiển thị trong bài đăng trên blog này . Ssh sớm không làm việc cho tôi và dường như không cần thiết nữa.

Tôi đã tóm tắt những gì bạn cần làm sau đây. Để biết thêm chi tiết, hãy xem bài viết trên:

  1. Cài đặt BusyBox và Dropbear trên máy chủ của bạn

    sudo apt-get install dropbear busybox
    
  2. Cập nhật initramfs của bạn trên máy chủ

    sudo update-initramfs -u
    
  3. Sao chép khóa riêng được tạo bởi dropbear vào máy khách của bạn. Bạn có thể phải sao chép nó vào một thư mục mới và thay đổi quyền sở hữu để làm điều này. Trên máy chủ của bạn làm như sau:

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

    Hãy nhớ thay thế người dùng bằng tên người dùng của bạn. Đăng nhập mật khẩu dường như không hoạt động.

  4. Bây giờ bạn có thể chuyển khóa riêng bằng scp bằng cách gọi như sau trên máy khách của bạn :

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Thiết lập tệp ~ / .ssh / config của khách hàng của bạn để dễ dàng đăng nhập. Mở nó lên bằng một trình soạn thảo văn bản và thêm vào như sau:

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

    Thay đổi Host thành bất cứ thứ gì bạn thích và HostName thành tên của máy chủ của bạn. Hãy để người dùng được root. Nó dường như là người dùng duy nhất được chấp nhận trong Dropbear. Lưu và đóng tập tin.

  6. Khởi động lại máy chủ của bạn và chờ lời nhắc mật khẩu. Cho Dropbear vài giây để phát hiện và thiết lập kết nối internet của nó. Kết nối với máy chủ của bạn bằng lệnh sau trên máy khách của bạn :

    ssh myremoteserver # or any name you chose
    
  7. Khi đăng nhập, ban hành lệnh sau trên máy chủ của bạn . Xem bài đăng trên blog để biết chi tiết:

    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;
    

    Sẽ mất một chút thời gian (30 giây) trước khi bạn nhập cụm mật khẩu của mình. Nhập nó khi được nhắc.

  8. Đóng kết nối bằng cách gõ

    exit
    
  9. Máy chủ của bạn bây giờ đã mở khóa ổ cứng được mã hóa và khởi động như bình thường.

(Rất cảm ơn tác giả gốc của bài viết trên blog!)


2
Tôi hoàn toàn không hiểu lý do di chuyển bằng khóa riêng. Nó là đủ để sao chép khóa công khai của bạn trên máy khách vào máy chủ làm khóa ủy quyền cho máy chủ gốc, phải không?
gertvdijk

Tôi chắc chắn có thể tạo cặp khóa trên máy khách và chỉ di chuyển khóa chung từ đó sang máy chủ, nhưng nếu tôi nhớ lại chính xác, tôi nghĩ rằng có một số vấn đề khi tìm định dạng mà BusyBox sẽ chấp nhận. Vì vậy, sử dụng lại các khóa đã có trên máy chủ là lựa chọn duy nhất tôi có được.
kéo dài

1
Bất cứ ý tưởng nào tôi nên làm để làm điều này hoạt động trên Arch Linux?
Gerharddc

1
@Gerhman Kiểm tra gói dropbear_initrd_encrypt trong AUR để được hỗ trợ sớm ssh trên Archlinux.
Caleb

1
Trang archwiki @Gerhman: Mở khóa từ xa gốc hoặc phân vùng khác Chưa thực hiện được, nhưng có vẻ thú vị. Sẽ phải kiểm tra xem :)
hanetzer 7/03/2015

18

Tôi nghĩ rằng ssh sớm cung cấp những gì bạn đang tìm kiếm:

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...

Đã có sẵn gói .deb, vì vậy bạn có thể ổn với Ubuntu.


Có vẻ như đây là chính xác những gì tôi đang tìm kiếm, cảm ơn!
hpy

3
Bạn có một liên kết đến một hướng dẫn tốt hoặc làm thế nào? Tôi bị mắc kẹt với ssh sớm trên hộp bóp debian của tôi.

1
Có một hướng dẫn sẽ là tuyệt vời.
hpy


16

Có một cái nhìn về cryptsetup readme cho điều này trong /usr/share/doc/cryptsetup/README.remote.gz(gói Ubuntu cryptsetup). Trong đó có một hướng dẫn đầy đủ để thực hiện điều này. Nó tương tự như câu trả lời của dragly , nhưng tôi nghĩ rằng điều này thanh lịch hơn một chút. (Các phím được định dạng Dropbear, chuyển cụm mật khẩu thông qua một FIFO chứ không phải là một tập lệnh shell mong manh, v.v.)

mở khóa rootfs thông qua đăng nhập ssh trong initramfs

Bạn có thể mở khóa rootfs của mình khi khởi động từ xa, sử dụng ssh để đăng nhập vào hệ thống khởi động trong khi nó đang chạy với initramfs được gắn.

Thiết lập

Để mở khóa từ xa để hoạt động, các gói sau phải được cài đặt trước khi xây dựng initramfs: dropbear busybox

Tệp /etc/initramfs-tools/initramfs.confgiữ các tùy chọn cấu hình được sử dụng khi xây dựng initramfs. Nó nên chứa BUSYBOX=y (cái này được đặt làm mặc định khi gói busybox được cài đặt) để cài đặt busybox vào initramfs, và không nên chứa DROPBEAR=n, điều này sẽ vô hiệu hóa việc cài đặt dropbear cho initramfs. Nếu được đặt thành DROPBEAR=y, dropbear sẽ được cài đặt trong mọi trường hợp; nếu hoàn toàn DROPBEARkhông được thiết lập, thì dropbear sẽ chỉ được cài đặt trong trường hợp thiết lập tiền điện tử hiện có.

Các khóa máy chủ được sử dụng cho initramfs là dropbear_dss_host_keydropbear_rsa_host_key, cả hai đều nằm trong /etc/initramfs-tools/etc/dropbear/. Nếu chúng không tồn tại khi initramfs được biên dịch, chúng sẽ được tạo tự động. Sau đây là các lệnh để tạo chúng bằng tay:

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

Vì initramfs sẽ không được mã hóa, nên xác thực khóa công khai. (Các) khóa được sử dụng cho việc đó sẽ được lấy từ /etc/initramfs-tools/root/.ssh/authorized_keys. Nếu tệp này không tồn tại khi initramfs được biên dịch, nó sẽ được tạo và /etc/initramfs-tools/root/.ssh/id_rsa.pubsẽ được thêm vào nó. Nếu tệp sau không tồn tại, nó sẽ được tạo tự động - bạn sẽ tìm thấy khóa riêng phù hợp mà sau này bạn sẽ cần phải đăng nhập vào initramfs bên dưới /etc/initramfs-tools/root/.ssh/id_rsa (hoặc id_rsa.dropbeartrong trường hợp bạn cần nó ở định dạng dropbear). Sau đây là các lệnh để thực hiện các bước tương ứng theo cách thủ công:

Để tạo khóa (ở định dạng dropbear):

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

Để chuyển đổi khóa từ định dạng dropbear sang định dạng openssh:

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

Để giải nén khóa công khai:

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

Để thêm khóa công khai vào tệp ủy quyền:

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

Trong trường hợp bạn muốn một số giao diện được cấu hình bằng dhcp, cài đặt DEVICE=trong /etc/initramfs-tools/initramfs.conflà đủ. Các initramfs cũng nên tôn vinh ip=tham số kernel. Trong trường hợp bạn sử dụng grub, có lẽ bạn có thể muốn đặt nó vào /boot/grub/menu.lst, trong dòng ' # kopt=' hoặc được thêm vào kernel(các) dòng cụ thể . Các ip=tham số hạt nhân được ghi nhận ở Documentation/nfsroot.txttrong cây mã nguồn kernel.

Các vấn đề

Đừng quên chạy update-initramfskhi bạn thay đổi cấu hình để làm cho nó hiệu quả!

Thu thập đủ entropy cho daemon ssh đôi khi dường như là một vấn đề. Khởi động của daemon ssh có thể bị trì hoãn cho đến khi đủ entropy được lấy. Điều này không chặn cho quá trình khởi động, vì vậy khi bạn ở trong bảng điều khiển, bạn sẽ không phải đợi sshd hoàn thành quá trình khởi động.

Quy trình mở khóa

Để mở khóa từ xa, bạn có thể làm một cái gì đó như thế này:

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

Ví dụ này giả định rằng bạn có một known_hoststệp bổ sung " ~/.ssh/known_hosts.initramfs" chứa khóa máy chủ của hệ thống mật mã, rằng bạn có một tệp " ~/id_rsa.initramfs" chứa khóa ủy quyền cho hệ thống tiền điện tử, rằng tên của hệ thống tiền điện tử là " initramfshost.example.com" và đó là mật khẩu mật mã là " secret"

- < debian@x.ray.net>, thứ tư, ngày 30 tháng 9 năm 2009

Cảm ơn jap đã chỉ ra điều này cho tôi trên một kênh khác.


1
Đây có vẻ như là một ý tưởng tốt hơn nhiều (được mô tả trong các tài liệu chính thức và mọi thứ) hơn là hack-psre grepping. Tuy nhiên, như một lưu ý phụ về quy trình mở khóa được cung cấp, người ta có thể muốn thận trọng khi nhập cụm mật khẩu trực tiếp trên dòng lệnh vì rất có thể nó sẽ nằm trong tệp lịch sử shell ở đâu đó. Một giải pháp khả thi là tạo một tập lệnh bao bọc nhỏ nhắc nhở cho cụm mật khẩu sử dụng read -s -p.
joelpet

1
lưu ý rằng có vấn đề với cách tiếp cận đó trong các phiên bản Ubuntu gần đây, ví dụ như bug.launchpad.net/ubfox/+source/cryptsetup/+orms/595648
Frederick Nord

6

Nếu bạn muốn có thể khởi động không cần giám sát cũng như từ xa, bạn cũng nên xem Mandos (mà tôi và những người khác đã viết):

Mandos là một hệ thống cho phép các máy chủ có hệ thống tệp gốc được mã hóa khởi động lại không cần giám sát và / hoặc từ xa. Xem tệp trang hướng dẫn giới thiệu để biết thêm thông tin, bao gồm danh sách Câu hỏi thường gặp.

Nói tóm lại, máy chủ khởi động lấy mật khẩu qua mạng, một cách an toàn. Xem README để biết chi tiết.


Cảm ơn bạn đã đóng góp, nhưng lưu ý rằng 100% bài đăng của bạn gần như giống hệt sản phẩm của bạn là hành vi ranh giới và bạn có nguy cơ bị coi là spam (Tôi đã gắn cờ bài đăng của mình nếu Mandos không phải là phần mềm miễn phí hoặc bạn không có lịch sử các bài đăng không phải của Mandos trên các trang web khác).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Xong ngay.
Teddy

2

Máy chủ không đầu? Nếu nó có một cổng nối tiếp, sử dụng nó.

GRUB có thể được cấu hình để hoạt động trên cổng nối tiếp. Hạt nhân của bạn cũng có thể được cấu hình sử dụng cổng nối tiếp để xuất các thông điệp khởi động ban đầu, nhập mật khẩu để mở khóa ổ đĩa của bạn và đăng nhập. (Nếu máy chủ của bạn hỗ trợ BIOS nối tiếp, hãy bật nó lên. một màn hình cho máy ở tất cả).

Luôn luôn là một ý tưởng tốt để có một cách "không nối mạng" trong một máy chủ không đầu.


Điểm tuyệt vời! Mặc dù, các cách " không kết nối mạng " trong máy chủ không đầu chủ yếu là ( chỉ ) có liên quan nếu khoảng cách vật lý giữa máy khách / máy chủ gần nhau; trừ khi tôi xem xét một số khả năng / tính năng khác của kết nối Nối tiếp.
ILMostro_7

2

Trên arch linux, có một gói AUR dropbear_initrd_encrypt thực hiện những gì bạn muốn ra khỏi hộp. Hoạt động khá tốt cho các giao diện có dây. Tôi đã phải hack nó lên một chút cho không dây.


2

Thật không may, không có câu trả lời nào ở trên làm việc cho tôi. Hơn nữa, sao chép một khóa riêng từ máy chủ có vẻ nghịch lý.

Dù sao đi nữa, các hướng dẫn sau đây đã được thực hiện:

Khởi động máy chủ của bạn bằng cách kết nối và mở khóa phân vùng được mã hóa thông qua CLIENT của bạn

Cài đặt các gói bắt buộc (trên SERVER)

apt-get install dropbear initramfs-tools busybox

Nối các khóa công khai mong muốn của bạn vào tệp ủy quyền của SERVER

Chỉ cần sao chép và dán (các) khóa công khai của bạn vào /etc/dropbear-initramfs/authorized_keysSERVER

Tạo tập lệnh mở khóa

Tạo tập lệnh sau trong /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

Làm cho nó thực thi:

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

Tạo một IP tĩnh (hoặc bỏ qua bước này để sử dụng DHCP)

Chỉnh sửa /etc/initramfs-tools/initramfs.confđể thêm (hoặc thay đổi) dòng:

#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

Cập nhật initramfs

update-initramfs -u

Vô hiệu hóa dịch vụ dropbear khi khởi động để openssh được sử dụng sau khi phân vùng được giải mã

sudo update-rc.d dropbear disable

Kiểm tra

  • Khởi động lại máy chủ của bạn
  • Kết nối với máy chủ của bạn thông qua ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

Trên debian 9 (ổn định), giải pháp này đã lỗi thời. Trong quá trình cài đặt, tôi nhận được cảnh báo dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!và tôi không thể tìm thấy các phím cần thiết. Phương pháp này thực sự đơn giản và đã được giải thích cho tôi trên kênh #debian tuyệt vời (cảm ơn bạn một lần nữa):

Trước tiên hãy chắc chắn rằng busybox, dropbearvà đã dropbear-initramfsđược cài đặt

sudo apt install busybox dropbear*

sau đó thêm khóa công khai của bạn (hầu hết thời gian ~/.ssh/id_rsa.pub) vào tệp /etc/dropbear-initramfs/authorized_keys.

Cập nhật sau đó initramfsđể tính đến các thay đổi :: update-initramfs -u

Đó là tất cả!

Lưu ý, nếu bạn muốn tránh có xung đột giữa các khóa giữa dropbearopenssh(chúng có chung một ip, nhưng sử dụng một khóa khác), bạn có thể muốn đặt vào máy khách của mình ~/.ssh/configmột cái gì đó như thế:

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

Sau đó, bạn chỉ cần kết nối bằng cách sử dụng:

ssh myserver_luks_unlock

và một khi bạn nhận được lời nhắc, hãy nhập theo gợi ý của dấu nhắc busybox:

cryptroot-unlock

và nhập mật khẩu của bạn.

Thưởng thức!



0

Tôi đã sử dụng kỹ thuật được giải thích bởi những người khác trên trang này (SSH trong initramfs với IPtham số kernel để định cấu hình mạng) trong một vài năm nay để mở khóa từ xa các máy chủ Ubuntu Linux không đầu (12.02, 14.04, 16.04 và 18.04).

Tôi thậm chí đã đi xa hơn để phát triển một chương trình Python ( hệ thống mở khóa từ xa ) thực sự mở khóa cho tôi, bởi vì quá trình thực hiện việc này bằng tay cảm thấy hơi mong manh và tôi bắt đầu sợ khởi động lại máy chủ của mình, vì vậy theo tinh thần về "nếu nó làm tổn thương thì nó đáng để tự động hóa" Tôi đã mã hóa kiến ​​thức của mình trong Python (và điều này thực sự đã giúp việc khởi động lại thường xuyên để áp dụng các cập nhật bảo mật dễ dàng hơn nhiều).

Kể từ đó, tôi quyết định chia sẻ các ghi chú cá nhân của mình về mã hóa đĩa gốc từ xa với mọi người. Trang được liên kết chứa khá nhiều chi tiết về quy trình (cũng có một số gợi ý không được đề cập ở đây) và tôi dự định sẽ cập nhật nó.

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.