1. 備份

1. 備份

我的公司正在努力在一些新的測試工作中實施一些 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
  1. partclone.ext4是partclone 專用於ext4 的二進位檔案之一。每個受支援的檔案系統都有自己的部分克隆二進位檔案。

  2. /dev/sda2顯然是您要克隆的分區。我更喜歡透過部分標籤來引用分區,例如。/dev/disk/by-partlabel/os- IMO 比較乾淨。/dev/sda2不過,更容易辨認。

  3. 豬豬是多核心gzip。-0告訴它優先考慮速度而不是有效壓縮。

  4. /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會複製一切包括可用空間,更快的方法是僅複製分割區中的檔案。

祝你好運!

相關內容