Mã hóa không cần mật khẩu phân vùng gốc Linux trên Debian 8 bằng khóa USB

theanh

Administrator
Nhân viên
Bảo mật dữ liệu quan trọng trên thiết bị lưu trữ (ổ cứng, thẻ nhớ di động) là cần thiết để kẻ xâm nhập không thể đánh cắp thông tin nhạy cảm. Trong hướng dẫn này, chúng tôi tập trung vào bảo mật hệ thống tệp gốc Linux và vùng trao đổi. Tính năng mã hóa Linux mặc định "LUKS" sẽ được sử dụng, tính năng này yêu cầu mật khẩu khi khởi động. Do đó, mục tiêu tiếp theo của chúng tôi là tự động cung cấp mật khẩu cho ổ đĩa được mã hóa khi khởi động. Đã có một số bài viết về cùng chủ đề cho các bản phát hành cũ hơn của bản phân phối Debian. Tuy nhiên, trong hướng dẫn này, phiên bản Debain 8 (Jessie) được cài đặt trên VM VirtualBox.


Cài đặt hệ điều hành Debian​

Trong hướng dẫn này, Debian Jessie được cài đặt trên VM và thông tin chi tiết được hiển thị trong hình sau. Quy trình tương tự cũng sẽ hoạt động trên máy chủ "thực" hoặc Máy tính để bàn.

Thêm tệp iso cài đặt Debian net vào VM và khởi động VM, dấu nhắc cài đặt sẽ xuất hiện. Chọn tùy chọn "Cài đặt" để bắt đầu quá trình cài đặt.



Một vài màn hình sau sẽ nhắc bạn về các thiết lập cơ bản của Debian. Chọn tùy chọn ngôn ngữ mong muốn từ danh sách được cung cấp.



Chọn quốc gia hoặc khu vực như trong hình sau.



Cấu hình ngôn ngữ cho bàn phím.



Sau các thiết lập cơ bản, trình cài đặt sẽ tải thêm các thành phần để cấu hình.



Một lần nữa, nhiều thiết lập cơ bản hơn sẽ được cấu hình trong quá trình cài đặt.

1. Thiết lập tên máy chủ



2. Cấu hình tên miền



3. Đặt mật khẩu cho người dùng "root".





4. Tạo người dùng mới không phải root.









5. Đặt múi giờ



6. Và cuối cùng, phần quan trọng nhất là phân vùng đĩa.



Bài viết này yêu cầu phân vùng đĩa cứng thủ công. Do đó, hãy chọn tùy chọn "Thủ công" trong lời nhắc ở trên và chọn đĩa cứng mong muốn để bắt đầu quá trình.



Như hình trên, Debian sẽ được cài đặt trong VM. Nhấn enter để bắt đầu phân vùng đĩa cứng đã chọn như hình dưới đây.



Màn hình sau sẽ hiển thị sau khi chấp nhận thông báo ở trên. Như được hiển thị trong ảnh chụp màn hình sau, hiện tại không có phân vùng nào trên ổ cứng.



Nhấn "enter" để tạo phân vùng đầu tiên trên ổ cứng ảo.



Phân vùng đầu tiên mà chúng tôi đã tạo trên ổ cứng là "/dev/sda1" cho điểm gắn kết "/boot".



Loại Primary hoặc Logical được chọn cho phân vùng.



Vị trí của phân vùng mới được chọn.



Điểm gắn kết "/boot" được hiển thị trong ảnh chụp màn hình sau.



Phân vùng đầu tiên đã được tạo thành công trên ổ cứng. Sau đó, hạt nhân Linux được đặt trong phân vùng "/boot".



Phân vùng thứ hai được tạo trên ổ cứng VM là swap và kích thước của phân vùng swap phải gấp đôi kích thước RAM. Như được hiển thị trong ảnh chụp màn hình sau, không gian trống còn lại được chọn để hoán đổi.



Đặt kích thước của phân vùng hoán đổi.



Ảnh chụp màn hình sau cho thấy phân vùng được chọn làm vùng hoán đổi.



Một phân vùng khác cũng được tạo trên VM.



Phân vùng cốt lõi của nền tảng Linux được tạo trên không gian còn lại cho / (điểm gắn kết "root"). Ảnh chụp màn hình sau cho thấy kích thước của phân vùng "root".



Chọn tùy chọn "physical volume of encryption" cho phân vùng mới trên ổ cứng.



Tùy chọn được tô sáng trong ảnh chụp màn hình sau là bắt buộc để mã hóa phân vùng trên nền tảng Linux.



Thiết lập phân vùng sau khi chọn "physical volume for encryption" được hiển thị trong hình sau. Phương pháp mã hóa mặc định là device-mapper (dm-crypt), thuật toán mã hóa là AES với kích thước khóa 256.





Việc tạo phân vùng thành công trên ổ cứng ảo được hiển thị trong hình bên dưới.



Sau đây là cấu hình nâng cao của các ổ đĩa được mã hóa trên Debian được chọn trong ảnh chụp màn hình sau.



Lời nhắc sau đây cho biết lược đồ phân vùng hiện tại cần ghi vào ổ cứng trước khi chúng ta có thể bắt đầu cấu hình ổ đĩa được mã hóa.



Lời nhắc sau đây cho biết việc tạo ổ đĩa được mã hóa trên nền tảng Debian.



Chọn các thiết bị cho ổ đĩa được mã hóa. Không chọn thiết bị khởi động "/dev/sda1" cho ổ đĩa được mã hóa vì nó không được phép mã hóa phân vùng khởi động.

Như được hiển thị trong ảnh chụp màn hình sau, chỉ có "/dev/sda3" được chọn cho ổ đĩa được mã hóa và đây là phân vùng gốc của đĩa.



Sau khi cấu hình ổ đĩa được mã hóa, hãy chọn hoàn tất để áp dụng các thay đổi.



Tuy nhiên, lỗi sau sẽ nhắc nếu phân vùng hoán đổi không được chọn cho ổ đĩa được mã hóa.



Do đó, chúng tôi chọn cả hai phân vùng cho ổ đĩa được mã hóa.



Cài đặt phân vùng cho ổ đĩa được mã hóa hoán đổi được hiển thị bên dưới.



Lời nhắc sau cho biết dữ liệu sẽ bị xóa trên "sda2" (hoán đổi).



Xóa dữ liệu trên "sda2" và "sda3" được hiển thị bên dưới.





Sau khi quá trình hoàn tất, hãy nhập cụm mật khẩu cho cả hai phân vùng được mã hóa.



Nhập lại cùng một cụm mật khẩu.



Bảng phân vùng sau khi cấu hình thành công các ổ đĩa được mã hóa trên đĩa được hiển thị bên dưới.



Hoàn tất quá trình phân vùng để bắt đầu cài đặt HĐH Debian. Tuy nhiên, lời nhắc lỗi sau sẽ xuất hiện vì điểm gắn kết "/" vẫn chưa được chọn cho bất kỳ phân vùng nào.



Sau lời nhắc lỗi trên, hãy cấu hình lại các ổ đĩa được mã hóa để đặt điểm gắn kết. Trong bài viết này, "sda3_crypt" là hệ thống tệp gốc và "sda2_crypt" là vùng hoán đổi.



Chọn điểm gắn kết "/" cho ổ đĩa được mã hóa.



Chọn ổ đĩa được mã hóa "sda2_crypt" làm vùng hoán đổi.



Ảnh chụp màn hình sau đây hiển thị bảng phân vùng cuối cùng cho các ổ đĩa được mã hóa.



Định dạng phân vùng được hiển thị bên dưới.



Sau khi hoàn tất quá trình định dạng, hệ thống cơ sở sẽ được cài đặt.



Ảnh chụp màn hình sau đây hiển thị lựa chọn bản sao lưu trữ cho các gói Debian.



Cấu hình trình quản lý gói được hiển thị bên dưới.



Chỉ có hệ thống cơ sở hoặc lõi được cài đặt và các gói khác có thể được cài đặt từ danh sách được hiển thị.



Chọn môi trường máy tính để bàn và các gói khác từ danh sách.



Cài đặt các gói đã chọn được hiển thị bên dưới.



Cài đặt bộ nạp khởi động Linux "GRUB" được hiển thị trong ảnh chụp màn hình sau.



Thiết bị (sda) được chọn để cài đặt bộ nạp khởi động.



Cuối cùng, quá trình cài đặt đã hoàn tất.



Sau khi khởi động lại, nhập mật khẩu để giải mã đĩa sda3.



Nhập mật khẩu để giải mã đĩa sda2 là vùng hoán đổi.



Đăng nhập thành công vào hệ thống đã cài đặt.




Cấu hình cho hệ thống tệp gốc không mật khẩu​

Quá trình nhập mật khẩu khi khởi động giờ đây sẽ được tự động hóa bằng thẻ nhớ USB. Thay vì sử dụng

một mật khẩu, khóa bí mật trên USB sẽ giải mã các ổ đĩa được mã hóa. Kết nối thẻ nhớ USB với VM và định vị nó bằng lệnh "dmesg". Nó được phát hiện là "/dev/sdb" trong VM của tôi.



Khóa bí mật của 8192 byte ngẫu nhiên được trích xuất từ ổ USB bằng lệnh dd.
Mã:
dd if=/dev/sdb of=/root/secret.key bs=512 skip=4 count=16

Khóa bí mật được tạo ở trên được thêm vào các ổ đĩa được mã hóa bằng lệnh "cryptsetup". Theo mặc định, cụm mật khẩu được lưu trong khe 0. Do đó, khe 1 sẽ được sử dụng cho khóa bí mật thứ hai.

Chạy lệnh "blkid" để biết thông tin chi tiết về ổ đĩa trên đĩa.
Mã:
blkid


Trong hướng dẫn này, khóa bí mật để giải mã ổ đĩa chỉ được thêm vào /dev/sda3. Tuy nhiên, nó cũng có thể được thêm vào phân vùng "/dev/sda2" (swap).
Mã:
cryptsetup luksAddKey /dev/sda3 /root/secret.key --key-slot 1


Một quy tắc udev đơn giản được tạo cho thiết bị USB trong tệp /etc/udev/rules.d/99-custom-usb.rules, liên kết tượng trưng mà chúng ta sẽ sử dụng là /dev/usbdevice.
Mã:
SUBSYSTEMS=="usb", DRIVERS=="usb", SYMLINK+="usbdevice%n"


Tải lại các quy tắc bằng lệnh sau.
Mã:
udevadm control --reload-rules


Khởi động lại USB thiết bị để xác minh quy tắc tùy chỉnh.



Cần có một tập lệnh shell để đọc khóa bí mật từ thiết bị USB và cung cấp cho cryptsetup khi khởi động. Tập lệnh được tạo dưới dạng "/usr/local/sbin/openluksdevices.sh" và được lấy từ trang webhttp://www.oxygenimpaired.com/.


Mã:
#!/bin/sh
########### lấy từ liên kết sau#########
###http://www.oxygenimpaired.com/debian-lenny-luks-encrypted-root-hidden-usb-keyfile

TRUE=0
FALSE=1

# đánh dấu tính khả dụng của tệp khóa
OPENED=$FALSE

nếu [ -b /dev/usbdevice ]; sau đó
# nếu thiết bị tồn tại thì xuất tệp khóa từ khóa usb 
dd if=/dev/usbdevice bs=512 skip=4 count=16 | cat
OPENED=$TRUE
fi

nếu [ $OPENED -ne $TRUE ]; then
echo "FAILED to get USB key file ..." >&2
/lib/cryptsetup/askpass "Thử mật khẩu LUKS: "
else
echo "Tải thành công tệp khóa cho Root. Đang tiếp tục." >&2
fi

sleep 2
Đặt quyền cho tập lệnh để có thể thực thi.
Mã:
chmod a+x /usr/local/sbin/openluksdevices.sh


Tương tự như tệp cấu hình fstab, tệp crypttab chứa thông tin về các ổ đĩa được mã hóa trên nền tảng Linux. Thêm một tập lệnh shell cho phân vùng được mã hóa sda3_crypt. Nội dung của tệp cấu hình "/etc/crypttab" cho ổ đĩa được mã hóa được đưa ra bên dưới.
Mã:
sda3_crypt /dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc none luks,keyscript=/usr/local/sbin/openluksdevices.sh


Thêm dòng sau vào tệp "/etc/initramfs-tools/conf.d/cryptroot".
Mã:
CRYPTROOT=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc


Đảm bảo "usb_storage" được thêm vào Tệp "/etc/initramfs-tools/modules".



Tập lệnh shell sau (/etc/initramfs-tools/hooks/udevusbkey.sh) cũng được lấy từ mộtnguồn bên ngoài. Nó được sử dụng để thêm một quy tắc udev tùy chỉnh vào hệ thống tệp tạm thời "initrd".
Mã:
#!/bin/sh
# udev-usbkey script
###lấy từ
###http://www.oxygenimpaired.com/ubuntu-with-grub2-luks-encrypted-lvm-root-hidden-usb-keyfile
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}

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

. /usr/share/initramfs-tools/hook-functions

# Sao chép qua các quy tắc có liên quan

cp /etc/udev/rules.d/99-custom-usb.rules ${DESTDIR}/lib/udev/rules.d/

exit 0

Thay đổi quyền của tập lệnh.
Mã:
chmod a+x /etc/initramfs-tools/hooks/udevusbkey.sh

Cần phải có một số thay đổi trong cấu hình bộ nạp khởi động GRUB2. Tuy nhiên, không được phép thay đổi trực tiếp trong tệp cấu hình "/boot/grub/grub.cfg". Do đó, hãy thay đổi tham số "GRUB_CMDLINE_LINUX_DEFAULT" trong tệp cấu hình "/etc/default/grub". Như được hiển thị bên dưới, "rootdelay" và "cryptopts" được bao gồm trong tham số "GRUB_CMDLINE_LINUX_DEFAULT".
Mã:
GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh"
GRUB_CMDLINE_LINUX=""

# Bỏ chú thích để bật bộ lọc BadRAM, sửa đổi cho phù hợp với nhu cầu của bạn
# Thao tác này hoạt động với Linux (không cần bản vá) và với bất kỳ hạt nhân nào cóKết luận


Chạy Lệnh "update-grub" để áp dụng những thay đổi trên vào tệp cấu hình "/boot/grub/grub.cfg".



Sau lệnh trên, những thay đổi sau đã được áp dụng vào tệp cấu hình "/boot/grub/grub.cfg".
Mã:
echo 'Đang tải Linux 3.16.0-4-686-pae ...'
linux /vmlinuz-3.16.0-4-686-pae root=UUID=b30cdb22-8e3c-4ffd-a0c7-af96b90ba016 ro rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh
echo 'Đang tải ramdisk ban đầu ...'
initrd /initrd.img-3.16.0-4-686-pae
Chạy "update-initramfs -u" để cập nhật tệp hệ thống tệp tạm thời cho tất cả các hạt nhân.



Trước khi khởi động lại, hãy giải nén "initrd.img" mới tạo và xác minh rằng keyscript đã được sao chép vào thư mục "lib/cryptsetup/scripts" và quy tắc udev tùy chỉnh vào thư mục "lib/udev/rules.d/".
Mã:
cd /tmp/
zcat /boot/initrd.img-3.16.0-4-686-pae | cpio -iv


Keyscript đã được đưa thành công vào các tập lệnh initramfs.



Quy tắc USB tùy chỉnh cũng được đưa vào các quy tắc udev.



Thêm thiết bị USB vào cài đặt VM trước khi kiểm tra toàn bộ thiết lập.



Cuối cùng, khóa bí mật đã được tải thành công cho ổ đĩa được mã hóa.




Kết luận​

Trong bài viết này, một phân vùng được mã hóa được mở bằng khóa bí mật được lưu trong thiết bị bộ nhớ usb. Một tập lệnh shell tự động được sử dụng để cung cấp khóa bí mật cho ổ đĩa được mã hóa khi khởi động.
 
Back
Bên trên