it-swarm-vi.com

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

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.

62
hpy

Ví dụ, đối với các phiên bản mới hơn của Ubuntu, 14.04, tôi đã tìm thấy sự kết hợp của @dragly và blogposts ' câu trả lời 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 [email protected]:~/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.

26
nsg

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 , hãy 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 :

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Thiết lập tệp khách hàng của bạn để đăng nhập dễ dàng. 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à đợi Dấu 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 :

    ssh myremoteserver # or any name you chose
    
  7. Khi đăng nhập, hãy đưa ra 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!)

23
dragly

Tôi nghĩ đầu ssh 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...

Hiện đã có gói .deb, vì vậy bạn có thể ổn với Ubuntu.

18
wag

Có một cái nhìn vào 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 qua a FIFO thay vì tập lệnh Shell dễ vỡ, 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: dropbearbusybox

Tập tin /etc/initramfs-tools/initramfs.conf giữ 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 (điều 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 được chứa DROPBEAR=n, sẽ vô hiệu hóa 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 DROPBEAR hoàn toàn khô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.pub sẽ đượ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 trong /etc/initramfs-tools/root/.ssh/id_rsa (hoặc là id_rsa.dropbear trong 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, hãy đặt DEVICE= trong /etc/initramfs-tools/initramfs.conf nên là đủ. 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ó trong /boot/grub/menu.lst, hoặc trong '# kopt= 'dòng hoặc được thêm vào dòng' kernel 'cụ thể. Các ip= tham số kernel được ghi lại trong Documentation/nfsroot.txt trong cây nguồn kernel.

Các vấn đề

Đừng quên chạy update-initramfs khi 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" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

Ví dụ này giả định rằng bạn có thêm known_hosts tập tin "~/.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 "giữ khóa được ủ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à cụm mật khẩu của tiền điện tử là" secret "

- <[email protected]>, Thứ tư, ngày 30 tháng 9 năm 2009

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

16
gertvdijk

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 đã đượ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 trang hướng dẫn giới thiệ tệp để biết thêm thông tin, bao gồm danh sách FAQ.

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.

6
Teddy

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 báo 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 mạng" để vào một máy chủ không đầu.

2
LawrenceC

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, hướng dẫn sa đã giải quyết:

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_keys trên SERVER

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 "\[email protected]"
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)

Biên tập /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 [email protected] [-i ~/.ssh/id_rsa]
2
ceremcem

Trên Arch Linux, có một gói AUR dropbear_initrd_encrypt đó là 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
user3188445

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 về 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 rất đơ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 đảm bảo rằng busybox, dropbeardropbear-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) trong file /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 xung đột giữa các khóa giữa dropbearopenssh (họ chia sẻ cùng 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/config đại loại 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 busybox Prompt:

cryptroot-unlock

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

Thưởng thức!

2
tobiasBora

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 kernel IP để 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 ( nlock-remote-system ) thực sự mở khóa cho tôi, bởi vì quá trình thực hiện điều 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 "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ự làm cho nó dễ dàng hơn nhiều để thực hiện khởi động lại thường xuyên để áp dụng các bản cập nhật bảo mật).

Kể từ đó, tôi quyết định chia sẻ các ghi chú cá nhân của mình trên Mã hóa đĩa gốc từ xa với thế giớ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ó.

1
xolox

Tôi đã viết một vai trò Ansible làm điều này cho bạn. Chỉ cần nhận vai trò debops-contrib.dropbear_initramfs và chạy nó. Tham khảo tài liệu vai trò của nhóm để biết chi tiết.

0
ypid