Encryption
如何在Google云計算實例(gcloud)上強制自定義磁碟加密?
Google云服務(計算實例)預設為磁碟儲存提供加密,客戶可以使用客戶提供的加密功能提供自己的密鑰(此處也有詳細說明)。
我們如何在不將加密密鑰提供給Google的情況下使用cryptsetup應用磁碟加密?
在 Linux 上,當使用加密磁碟 (luks) 時,它會在啟動時使用密碼解鎖,這裡的想法是在 google 系統之上使用cryptsetup加密磁碟(預設加密),並獲得對實例的更早訪問權限以能夠在引導時解鎖驅動器。這可以在遠端串列控制台功能的幫助下實現(請注意,本指南使用了一個 opensuse VM,其他發行版的不同步驟不應有所不同)。
和:
- 磁碟速度將降低 10~15%。
- 在啟動/重新啟動時,需要通過串列會話引入加密密碼。
- 失敗/遷移時重新啟動可能需要手動輸入密碼(如果不是自動的)。
臨:
- 數據訪問確實僅限於客戶/所有者。
- 客戶私有化靜態磁碟加密。
- 客戶為快照備份和映像私有化磁碟加密。
- Google 無法訪問磁碟的數據(或者至少會非常困難)。
- 磁碟加密密鑰未提供給 Google。
- 可定制的加密方法、算法和密鑰大小。
- 數據保護改進等
實施總結:
- 0 有一個現有的虛擬機實例
- 1 啟用實例/VM 串列訪問
- 2 創建一個額外的(目標)加密硬碟驅動器
- 3 將目前硬碟複製到加密硬碟
- 4 用新驅動器更換舊驅動器
- 5 啟動 VM 並通過串列控制台輸入密碼
如何加密虛擬機的磁碟(gcloud、cryptsetup):
先決條件:
- 在目標區域創建一個新的臨時虛擬機(這需要是目標機器的副本,您可以使用快照備份磁碟,然後將快照恢復到新磁碟)
- 創建一個新的空磁碟(稍後加密),這是目標磁碟,它的大小需要至少比源磁碟大 256 MB(用於新的 /boot 分區),如果你的磁碟可以更大想擴大空間。
- 將兩個磁碟都掛載到臨時 VM 並啟動它。
Temporary VM Config: /dev/sda : main disk, copy of the original source disk /dev/sdb : new empty disk larger than /dev/sda
串列控制台:
- *總結:*開啟串口連接,通過串口(doc1、doc2、doc3)連接機器
- 在元數據下添加
serial-port-enable
值TRUE
(並在實例選項上啟用串列埠)ssh
用/連接到串口gcloud
;gcloud 範例:gcloud compute --project=prj-name connect-to-serial-port vm-name --zone=us-central2-b
更新 grub 配置:
- *摘要:*啟用串列控制台(使 grub 可以通過串列控制台訪問)
- 添加/編輯這個到
/etc/default/grub
# ...Enabling serial console... GRUB_TIMEOUT=15 GRUB_TERMINAL="serial" GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1" # ...End
- 應用設置
grub2-mkconfig -o /boot/grub2/grub.cfg
- 重新啟動並檢查是否可以在串列控制台上訪問 grub。
格式化目標磁碟:
- *摘要:*我們需要創建 2 個分區,一個用於
/boot
(未加密),另一個用於系統/
(加密),無論您是否/boot
在舊系統上已經有一個單獨的分區,在新系統上我們都會需要它讓系統啟動 grub 並詢問密碼以解鎖加密分區。- 格式化空磁碟並創建 2 個分區,一個大小至少為 256 MB(以包含
/boot
),另一個具有剩餘空間;使用**fdisk /dev/sdb
這樣做,創建第一個具有 256 MB 或更多作為主分區並啟用可引導標誌**;然後使用剩餘空間創建第二個主分區(請注意,如果您在舊系統上使用分區進行交換,則還需要創建該分區)/dev/sda : /dev/sdb : |- sdb1 : 256 MB primary and bootable (empty) |- sdb2 : xx GB primary (empty)
- 將引導分區的文件系統設置為 ext4
mkfs.ext4 /dev/sdb1
- 擦拭第二個分區以獲得額外的安全性
dd if=/dev/urandom of=/dev/sdb2 bs=4096 status=progress
sdb2
為with 設置加密cryptsetup -y -v --cipher aes-xts-plain64 --key-size 256 --pbkdf-force-iterations=100200 --hash sha256 --type luks1 --label=linux --use-random luksFormat /dev/sdb2
更改密碼、密鑰大小、加密類型等以滿足您的需求
- 檢查加密分區
cryptsetup luksDump /dev/sdb2
- 解鎖加密分區
cryptsetup luksOpen /dev/sdb2 crypteddisk
- 將加密的映射分區設置為 ext4
mkfs.ext4 /dev/mapper/crypteddisk
- 關閉加密分區
cryptsetup close /dev/mapper/crypteddisk
複製源盤:
- *總結:*我們需要將我們的系統複製
/
到新的加密分區/dev/mapper/crypteddisk
(sdb2),這一步你可以使用不同的工具,在這個howto中我們將使用dd
,重要的注意事項在這裡,為了dd
複製一個沒有任何錯誤的磁碟源分區需要解除安裝。如果您想避免任何數據失去,您可以創建另一個臨時 VM 並將源磁碟和目標磁碟作為附加磁碟附加到它以執行此步驟…否則為避免遷移過程過長,我關閉了大部分正在執行的程序並在dd
不解除安裝源分區的情況下使用(不推薦),然後用於fsck
糾正由於源未解除安裝而導致的任何錯誤。- 解鎖加密分區
cryptsetup luksOpen /dev/sdb2 crypteddisk
- 使用以下內容將源分區復製到目標(假設
/
是/dev/sda1
)dd if=/dev/sda1 of=/dev/mapper/crypteddisk bs=4096 status=progress
- 檢查並修復新的加密分區
fsck /dev/mapper/crypteddisk
- 檢查磁碟結構
fdisk -l
(不要注意 crypteddisk 大小,我們稍後會修復它)分區 UUID:
- 獲取所有分區的所有 UUID 並保留該資訊。
blkid /dev/sda blkid /dev/sda1 blkid /dev/sdb blkid /dev/sdb1 blkid /dev/sdb2 blkid /dev/mapper/crypteddisk
調整磁碟大小:
- *摘要:*在這一步中,我們將擴大新加密分區的大小。
- 擴展加密分區
cryptsetup resize crypteddisk -v e2fsck -f /dev/mapper/crypteddisk resize2fs /dev/mapper/crypteddisk
備份 MBR:
- 這不是必需的,但它可能有用
dd if=/dev/sdb of=/backup/location/sdb.mbr count=1 dd if=/dev/sda of=/backup/location/sda.mbr count=1
設置引導分區:
- 掛載新的引導分區並將
/boot
內容複製到其中。mkdir /tmp/boot mount /dev/sdb1 /tmp/boot cp -a /boot/* /tmp/boot/ ls -l /tmp/boot/* umount /tmp/boot rmdir /tmp/boot
- 刪除舊
/boot
文件夾內容並將其保留為安裝位置。mkdir /tmp/system mount /dev/mapper/crypteddisk /tmp/system rm -rf /tmp/system/boot/* ls -l /tmp/system/boot/* umount /tmp/system rmdir /tmp/system
Chroot 並設置新系統:
- 將新的加密磁碟載入為目前磁碟(chroot)並設置它以應用新的系統配置、加密等(還要確保
/mnt
在繼續之前為空)。mount /dev/mapper/crypteddisk /mnt/ mount /dev/sdb1 /mnt/boot for i in sys dev proc; do mount --bind /$i /mnt/$i; done chroot /mnt
從現在開始,我們在新系統上(請記住,sdb 需要在配置文件中被視為 sda)
- 更新
/etc/fstab
配置(確保使用 sdb1 uuids 而不是 sda1),這裡是cat /etc/fstab
輸出:# Main Partition ---------------------- # Entry for /dev/mapper/crypteddisk (sda2) : UUID=CHANGE-THIS-WITH-CRYPTEDDISK-UUID / ext4 noatime,acl 0 0 # Boot Partition ---------------------- # Entry for /dev/sda1 : #/dev/sda1 /boot ext4 defaults 1 2 UUID=CHANGE-THIS-WITH-THE-CURRENT-SDB1-UUID /boot ext4 noatime,acl 1 2 # Swap Partition/File ----------------- /swap/swapfile swap swap defaults 0 0 #
- 更新
/etc/crypttab
配置(如果crypttab
文件不存在,請使用-rw-r--r--
權限創建它),還要確保使用 sdb2 uuids 而不是 sda1 或 crypteddisk,這裡是cat /etc/crypttab
輸出:crypteddisk UUID=CHANGE-THIS-WITH-CURRENT-SDB2-UUID
- 在 上更新 grub 配置
/etc/default/grub
,您只需要更改GRUB_ENABLE_CRYPTODISK
,GRUB_CMDLINE_LINUX
這裡GRUB_DISABLE_OS_PROBER
是cat /etc/default/grub
輸出:GRUB_DISTRIBUTOR=My-Custom-Server... # .................................... Command line #GRUB_CMDLINE_LINUX=" root=/dev/sda1 disk=/dev/sda resume=swap console=ttyS0,38400n8 quiet" GRUB_CMDLINE_LINUX=" root=/dev/mapper/crypteddisk luks_root=/dev/sda2 luks="root" disk=/dev/sda resume=swap console=ttyS0,38400n8 quiet" # .................................... Options GRUB_DEFAULT=0 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_GFXMODE=800x600 GRUB_GFXPAYLOAD_LINUX=keep GRUB_THEME=/boot/grub2/theme/theme.txt GRUB_BACKGROUND= # .................................... Enabling serial console... GRUB_TIMEOUT=30 GRUB_TERMINAL="serial" GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1" # .................................... Enabling cryptsetup GRUB_ENABLE_CRYPTODISK="y" # .................................... Ignore other os GRUB_DISABLE_OS_PROBER="true" # ....................................
- 應用 grub 更改:
grub2-mkconfig -o /boot/grub2/grub.cfg
- 更新 init ram 磁碟並強制加密模組包含在:
mkinitrd -d /dev/mapper/crypteddisk -f "dm luks"
- 更新 MBR 並在新磁碟上重新安裝 grub 以使其可啟動
grub2-install /dev/sdb
- 退出 chroot 並解除安裝所有內容
exit cd / for i in sys dev proc; do umount /mnt/$i; done unmount /mnt/boot unmount /mnt
如果您在解除安裝分區使用
-l
選項時遇到任何問題,例如umount -l /mnt/sys
應用魔法: