Sử dụng một cụm mật khẩu duy nhất để mở khóa nhiều đĩa được mã hóa khi khởi động


23

Máy của tôi có ổ SSD, nơi tôi đã cài đặt hệ thống và ổ cứng, mà tôi sử dụng làm bộ lưu trữ cho các tệp lớn và / hoặc không thường xuyên sử dụng. Cả hai đều được mã hóa, nhưng tôi đã chọn sử dụng cùng một cụm mật khẩu cho chúng. SSD được gắn tại /và ổ cứng tại /usr/hdd(mỗi người dùng cá nhân có một thư mục trên đó và có thể liên kết tượng trưng theo ý muốn từ thư mục chính).

Khi hệ thống được khởi động, nó sẽ ngay lập tức yêu cầu cụm mật khẩu cho SSD và chỉ một vài giây sau đó cho cụm từ dành cho ổ cứng (nó được gắn tự động). Cho rằng cả hai cụm mật khẩu đều giống nhau, có cách nào để cấu hình hệ thống để hỏi chỉ một lần không?


Bạn có thể có thể viết một expecttập lệnh hoặc tương tự được gọi để gắn các đĩa thay vì hệ thống thực hiện nó. Thay vào đó, hệ thống sẽ gọi tập lệnh sẽ yêu cầu mật khẩu, lưu trữ và cung cấp nó cho từng hoạt động gắn kết.
h3rrmiller

Nếu tôi hiểu chính xác ý tưởng của bạn, nó không thể được áp dụng cho SSD, vì đó là nơi hệ thống khởi động. Nhưng sau đó nó trở nên vô nghĩa, vì tôi vẫn cần phải nhập cụm mật khẩu cho ổ cứng riêng. Hay không?
đôi

Bạn có thể sử dụng /etc/crypttab để mở khóa ổ đĩa thứ hai .
jasonwryan

1
@jasonwryan nếu điều đó có thể được mở rộng thành câu trả lời thì ... câu trả lời nên được đăng dưới dạng câu trả lời, không phải bình luận.
derobert

1
@derobert đôi khi mọi người không có thời gian, hoặc thiên hướng, để viết lên một câu trả lời hay.
jasonwryan

Câu trả lời:


22

Các bản phân phối dựa trên Debian:

Debian và Ubuntu gửi một tập lệnh lưu trữ mật khẩu decrypt_keyctl với gói cryptsetup .

tập lệnh decrypt_keyctl cung cấp cùng một mật khẩu cho nhiều mục tiêu LUKS được mã hóa, giúp bạn không phải gõ nhiều lần. Nó có thể được kích hoạt trong crypttab với keyscript=decrypt_keyctltùy chọn. Mật khẩu tương tự được sử dụng cho các mục tiêu có cùng định danh trong trường keyfile . Trên mật khẩu khởi động cho mỗi định danh được yêu cầu một lần.

Một ví dụ 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

Sau khi bạn cập nhật tiền điện tử , bạn cũng sẽ phải cập nhật initramfs để áp dụng các thay đổi. Sử dụng update-initramfs -u.

Toàn bộ readme cho decrypt_keyctl nằm ở /usr/share/doc/cryptsetup/README.keyctl

Thật không may, điều này hiện không hoạt động trên các hệ thống Debian sử dụng init systemd do lỗi (các hệ thống init khác sẽ không bị ảnh hưởng). Trang người dùng Debian crypttab gợi ý như một cách giải quyết để sử dụng initramfstùy chọn để buộc xử lý trong giai đoạn khởi động initramfs.


Các bản phân phối không cung cấp tập lệnh decrypt_keyctl :

Nếu decrypt_keyctrl không được phân phối của bạn cung cấp, thiết bị có thể được mở khóa bằng cách sử dụng keyfile trong hệ thống tệp gốc được mã hóa. Điều này khi hệ thống tập tin gốc có thể được mở khóa và gắn kết trước bất kỳ thiết bị mã hóa nào khác.

LUKS hỗ trợ nhiều khe cắm chính. Điều này cho phép bạn thay thế mở khóa thiết bị bằng mật khẩu nếu tệp khóa không khả dụng / bị mất.

  1. Tạo khóa với dữ liệu ngẫu nhiên và chỉ đặt quyền cho chủ sở hữu có thể đọc được để tránh rò rỉ. Lưu ý rằng tệp chính cần phải nằm trên phân vùng gốc được mở khóa trước.

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. Thêm khóa vào thiết bị LUKS của bạn

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. Cấu hình crypttab để sử dụng tệp chính. Dòng đầu tiên phải là thiết bị gốc, vì các thiết bị được mở khóa theo thứ tự như được liệt kê trong crypttab . Sử dụng đường dẫn tuyệt đối cho các tệp chính.

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

Từ những dòng đầu tiên của readme có vẻ rất hứa hẹn, cảm ơn bạn. Tôi sẽ kiểm tra cái này vào ngày mai (không muốn khởi động lại ngay bây giờ).
đôi

Thật không may, nó không hoạt động (như không thay đổi). Xem phần của tôicrypttab (Tôi không chạm vào UUID=được tạo bởi trình cài đặt hệ thống, tôi đoán nó không quan trọng) và dẫn đến các mục trong/var/log/syslog . Các lỗi là loại dễ hiểu, nhưng tôi không biết phải làm gì về chúng. Tệp /lib/cryptsetup/scripts/decrypt_keyctltồn tại, vì vậy tôi không biết tại sao nó phàn nàn về tùy chọn không xác định. Tôi cũng không có ý tưởng gì để chỉ định là keyfile, tôi không thấy lời giải thích nào ở bất cứ đâu ...
doublep

Bạn đã xác minh decrypt_keyctl được bao gồm trong initramfs chưa? Kiểm tra nó bằng tùy chọn verbose khi cập nhật hình ảnh : update-initramfs -u -k $(uname -r) -v, nó sẽ xuất ra Adding binary /lib/cryptsetup/scripts/decrypt_keyctl.
sebasth

1
Để xem initramfs chứa gì:lsinitramfs /boot/initrd.img-$(uname -r)
sebasth

3
Uh, xin lỗi, bây giờ tôi đã chú ý hơn đến những gì đã update-initramfsnói, tôi nhận thấy điều này : E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. Sau một chút loay hoay, tôi phát hiện ra rằng có lẽ tôi cần keyutilsgói (thực sự chưa được cài đặt). Bây giờ update-initramfsthành công và lsinitramfskhông đề cập đến decrypt_keytls. Sẽ cập nhật sau lần khởi động tiếp theo (có thể vào ngày mai).
đôi

3

Đây là cách giải quyết của tôi về debian, với lỗi được tham chiếu ở trên bởi @sebasth.

Thiết lập của tôi là hơi khác nhau. Tôi có một phân vùng gốc được mã hóa và một loạt các đĩa đột kích. Đối với tôi, tôi đã phải thêm tùy chọn initramfs vào 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

Điều này nói với update-initramfs rằng tôi muốn có các mục nhập tiền điện tử này được gắn kết trong initramfs. Tôi đã kiểm tra tiền điện tử của mình bằng cách chạy

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

Lưu ý rằng các đĩa đột kích của tôi là dm-crypt đơn giản. Điều này có nghĩa là tôi không thể sử dụng phương thức keyfile luks hoạt động xung quanh lỗi keycript systemd. Đối với dm-crypt đơn giản, tôi sẽ phải lưu cụm mật khẩu trong văn bản gốc.

Các đĩa được mã hóa phải được gắn trước khi update-initramfschạy; nếu không nó sẽ ném lỗi. Tôi đã phải tìm các dòng sau khi initramfs của tôi được xây dựng:

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

trong đó cho thấy hai tập tin sau:

/bin/keyctl
cryptkeyctl

được thêm vào initramfs.

Cuối cùng, tôi đã phải vô hiệu hóa systemd xử lý crypttab của mình, để xử lý lỗi được tham chiếu ở trên: systemd không hỗ trợ tùy chọn keycript trong crypttab. Đối với điều này, tôi đã thêm tùy chọn kernel

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

đến / etc / default / grub và chạy update-grub. systemd bây giờ bỏ qua crypttab và tất cả các phân vùng được mã hóa được tải trong initramfs.

Bởi vì tôi có một phân vùng gốc được mã hóa, cryptroot không xuất hiện để lưu trữ khóa của tôi. Điều này có nghĩa là tôi phải nhập mật khẩu của mình hai lần; một cho phân vùng gốc và một lần cho mảng đột kích của tôi.


1

Một tùy chọn khác là sử dụng /lib/cryptsetup/scripts/decrypt_derivedtập lệnh, cũng là một phần của cryptsetup trong Debian / Ubuntu.

Thay vì lưu trữ khóa, bạn sử dụng phím âm lượng của một đĩa làm mật khẩu bổ sung cho đĩa thứ hai. Điều này đòi hỏi phải thêm mật khẩu thứ hai vào đĩa được mã hóa thứ hai (và thứ ba, v.v.), nhưng LUKS hỗ trợ điều đó. Do đó, giải pháp này cũng hoạt động nếu nhiều đĩa được mã hóa của bạn không sử dụng cùng một mật khẩu.

Ví dụ để thêm khóa từ sda6crypt vào sda5:

Thêm khóa âm lượng của sda6crypt làm mật khẩu bổ sung cho sda5:

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

Định cấu hình sda5crypt để được mở khóa tự động trong /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

Điều này sử dụng một đường ống có tên ( fifo) để truyền khóa để tránh phải lưu trữ phím âm lượng trong một tệp tạm thời trên đĩa.

Các keyscriptlựa chọn duy nhất hoạt động nếu crypttabđược xử lý bởi các công cụ cryptsetup gốc của Debian, các reimplementation systemd hiện không hỗ trợ nó. Nếu hệ thống của bạn sử dụng systemd (hầu hết các hệ thống), bạn cần initramfstùy chọn buộc xử lý xảy ra trong initrd bởi các công cụ cryptsetup, trước khi systemd khởi động.

Dựa trên /unix//a/32551/50793


Phải nói rằng đây là một giải pháp tuyệt vời Đã làm việc ngay lập tức khi không có trục trặc nào trên debian 10 buster!
Janus
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.