我的公司正在努力在一些新的測試工作中實施一些 Ubuntu 系統,我的任務是為它們提供加密解決方案。作為一個主要使用 Windows 的用戶,通常只了解 Ubuntu 和 Linux/Unix 的工作知識,這有點具有挑戰性,但很有趣。我知道許多就地加密服務可以在 Windows 上使用,但注意到 Ubuntu 缺乏這些服務,在閱讀了 20 多篇關於它的文章後,決定全新安裝帶全碟加密是唯一現實的選擇。話雖這麼說,一些系統已經在使用中,並且不能僅僅被擦除並透過加密重新安裝。我需要所有設定和更改以及複製/備份的現有文件。因此,它並不像複製/home那麼簡單。我很好奇對我來說最好的做法是什麼,我有一個完整的分割區副本(使用 gparted 快速複製到外部),用於我的測試機,並全新安裝了 Ubuntu w/LUKS。我熟悉 Clonezilla 的基礎知識,但我不認為這對我收集的資訊有幫助。
tldr:我需要將 Ubuntu 16.04 的完整安裝移至加密磁碟。有些機器將啟用 TPM,而有些則不會,我需要知道每台機器的最佳操作方案。感謝您幫助新管理員。
如果您可以描述一種不需要外部網路存取但不是必需的方法,那就更好了。即,如果需要軟體包,我可以在測試 PC 上將其下載到 USB/CD/DVD 並離線安裝軟體包。
答案1
下面描述的是我多次成功使用的過程。它適用於 Ubuntu 16.04 和 18.04。與 @Arno 在其答案中提出的解決方案不同,它不需要手動編輯內核啟動選項。相反,它依賴於update-grub
基於/etc/crypttab
更規範(雙關語無意)的解決方案來產生正確的配置,Ubuntu 在安裝預設的基於 LVM 的加密時也使用該解決方案。 (此解決方案不使用 LVM 也不加密/boot
)
對於遵循本指南造成的任何資料遺失或其他潛在的不愉快後果,我不承擔任何責任。在做任何事情之前,請確保您有可靠的備份。
我在打字時並不是在測試本指南。它是基於(經過測試)我自己寫的部落格文章有點類似的案例和一些我記得的細節。
本指南假設:
- Ubuntu已經安裝了
- 系統使用 (U)EFI 啟動,而非 BIOS/CSM
/boot
位於單獨的分區1上- 您可以啟動 Ubuntu 16.04/18.04 或 Pop!_OS 18.04 的即時媒體(從 USB、PXE、DVD 等)2
如果您/boot
不在單獨的分割區上,則提取它非常簡單:在任何地方建立 200-500 MB 的分割區,將其格式化為 ext4,複製目前/boot
內容,新增/etc/fstab
條目,update-grub
然後重新啟動。
1. 備份
您必須備份目前的系統分割區。最簡單的方法是使用 Clonezilla。它是用戶安全的,無需手冊 - 只需按照說明操作即可。
2. 縮減分區
LUKS 標頭佔用分割區上的一些空間。 Clonezilla/partclone 無法將映像還原到小於來源設備的設備,因此您無法將未加密分割區的映像還原到加密容器,因為它要小一些。
然後我們必須稍微縮小要加密的分割區。為了安全起見,請將它們縮小 10 MB 或更多。最簡單的方法是使用 GParted。它可以在 Ubuntu 即時媒體上使用。
3. 製作縮小分區的鏡像
要么再次使用 Clonezilla 執行此操作,要么已經熟悉了部分克隆,Clonezilla 預設使用它。稍後我們將使用 Partclone 手動恢復影像。
使用partclone克隆到影像:
sudo partclone.ext4 -c -s /dev/sda2 | pigz -0 > /mnt/backup/sda2.ext4.ptcl.gz
partclone.ext4
是partclone 專用於ext4 的二進位檔案之一。每個受支援的檔案系統都有自己的部分克隆二進位檔案。/dev/sda2
顯然是您要克隆的分區。我更喜歡透過部分標籤來引用分區,例如。/dev/disk/by-partlabel/os
- IMO 比較乾淨。/dev/sda2
不過,更容易辨認。豬豬是多核心gzip。
-0
告訴它優先考慮速度而不是有效壓縮。/mnt/backup
這裡代表您想要儲存影像的一些外部位置。如果您之前剛使用過 Clonezilla,它仍然可以安裝在/home/partimag
.如果您想掛載 SMB 共享:(sudo mount -t cifs -o username=gronostaj //192.168.1.90/Backup /mnt/backup
互動式要求輸入密碼)
4. 將分割區放大至原始大小
我們希望為 LUKS 標頭保留額外的空間,不是嗎?將分割區大小調整回原始大小。
5. 格式化為LUKS
這是您丟失原始資料的時刻。確保您的備份沒問題。
將系統分割區(除了/boot
)格式化為 LUKS:
sudo cryptsetup luksFormat --type luks2 /dev/sda2
開啟已建立的容器:
sudo cryptsetup open /dev/sda2 os
確保整個加密容器看起來像隨機垃圾,並且您的舊資料仍然不可讀:
sudo dd if=/dev/zero of=/dev/mapper/os bs=1M
(這將用零覆蓋容器的解密內容,但加密內容將看起來像隨機垃圾)
6. 恢復影像
手動運行partclone來恢復鏡像:
cat /mnt/backup/sda2.ext4.ptcl.gz | pigz -d | sudo partclone.ext4 -r -o /dev/mapper/os
如果您採取了簡單的方法並使用 Clonezilla 進行了「縮小」備份,請查看其輸出文件,您將輕鬆找出哪些是部分克隆來源。除非你設定巨大的區塊大小,否則它們將被碎片化,你必須cat
在通過管道傳輸到 Pigz 之前將它們組合在一起。
您還應該調整檔案系統幾何結構以適合整個分割區:
sudo resize2fs /dev/mapper/os
7. 啟用加密支持
首先,chroot 進入剛剛恢復的作業系統:
mkdir /mnt/os
sudo mount /dev/mapper/os /mnt/os
cd /mnt/os
mount --bind /etc/resolv.conf etc/resolv.conf
mount --bind /dev dev
mount -t tmpfs tmpfs tmp
mount -t sysfs sys sys
mount -t proc proc proc
sudo chroot .
mount -a
該終端現在正在您安裝的 Ubuntu 實例上運行,而不是即時實例。
安裝密碼設定:
apt update
apt install cryptsetup -y
它應該創建一個文件/etc/crypttab
。如果沒有,請不要擔心,手動創建它。編輯此文件並新增分區條目:
os /dev/sda2 none luks
儲存並退出編輯器。重建 initramfs:
update-initramfs -u -k all
更新 GRUB 條目:
update-grub
8.刪除多餘的密碼提示
如果您有多個加密分割區,則必須在啟動時為每個分割區輸入密碼。然而,LUKS 允許您添加額外的金鑰文件,這些文件可用於解鎖分區而不是密碼。您可以將這些金鑰檔案儲存在加密/
分割區上,並用它來解鎖後續的金鑰檔案。
建立隨機金鑰檔案:
dd if=/dev/urandom of=/luks.key bs=4096 count=1
將其新增至非根分區:
cryptsetup luksAddKey /dev/sda3 /luks.key
新增crypttab
條目:
home /dev/sda3 /luks.key luks
重建 initramfs:
update-initramfs -u -k all
1為什麼我使用單獨的/boot
:
- 這樣比較容易;)
- GRUB 尚未支援 LUKS2,因此
/boot
無法位於 LUKS2 加密分割區上 - 如果您想要進行 LUKS 加密
/boot
和 LUKS2 加密/
,則必須輸入密碼兩次或在 initramfs 中嵌入密鑰文件- 在我看來太麻煩了,因為... - 單獨加密
/boot
並不會讓你更容易受到攻擊,因為即使你的/boot
分割區被加密,你的 EFI 系統分割區也不能被加密,因此攻擊者可以篡改它,例如。使用他們的自訂惡意核心/initramfs 而不是您的/boot
. (要解決這個問題,你必須建立一個自容器 GRUB 二進位檔案並使用您的私鑰對其進行簽名,然後使用UEFI安全啟動來驗證它)
定義您自己的威脅模型並決定您需要什麼等級的安全性(以及針對什麼)。
2您可以使用其他 Ubuntu 版本或救援 CD 試試運氣,例如GRML,但您的里程可能會有所不同。我經歷過此過程失敗的情況,只是因為即時媒體與系統不符。
答案2
您可以對根分割區進行映像,使用 LUKS 對其進行格式化,安裝它並用映像覆寫它。然後需要對 GRUB 進行一些更改,以便它可以在啟動時對其進行解密。我沒有測試過以下步驟,他們只是一個線索。
我假設/boot
是 on sdb1
,根分割區是 onsdb2
並且/media/hdd
是外部磁碟機。我們在管理員提示字元下使用 Live USB。
加密根分割區
dd if=/dev/sdb2 of=/media/hdd/diskimg bs=1M
cryptsetup luksFormat /dev/sdb2
cryptsetup luksOpen /dev/sdb2 enc_root
dd if=/media/hdd/diskimg of=/dev/mapper/enc_root
掛載分割區
mount /dev/sdb2 /mnt
mount /dev/sdb1 /mnt/boot
配置GRUB
透過執行以下命令記下分割區的 UUID:
blkid /dev/sdb2
編輯/mnt/etc/default/grub
,找到說 的行GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
。將其變更為以下內容,並替換device-UUID
為您在上一個步驟中記下的 UUID。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cryptdevice=UUID=device-UUID:enc_root root=/dev/mapper/enc_root"
然後更新 GRUB 設定:
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /proc /mnt/proc
chroot /mnt
update-grub
exit
並卸載所有內容:
umount /mnt/dev
umount /mnt/sys
umount /mnt/proc
umount /mnt/boot
umount /mnt
並重新啟動。一些陷阱:
- 我還沒有測試過這些,也有一段時間沒有使用 Linux 分割區了,所以我幾乎可以肯定我忘記了或弄亂了一些東西。等待人們校對並修復它。
- 這假設
/boot
位於單獨的分割區上,如果所有內容都位於同一分割區上,則它將無法運作。 - 在 UEFI 系統上,不要忘記將 EFI 分割區安裝到其所屬的位置。
dd
會複製一切包括可用空間,更快的方法是僅複製分割區中的檔案。
祝你好運!