Encryption

如何在Google云計算實例(gcloud)上強制自定義磁碟加密?

  • July 6, 2020

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
    
  • 串列控制台:

    • *總結:*開啟串口連接,通過串口(doc1doc2doc3)連接機器
    • 元數據下添加serial-port-enableTRUE(並在實例選項上啟用串列埠)
    • 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)
    
    • 將引導分區的文件系統設置為 ext4mkfs.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
    • 將加密的映射分區設置為 ext4mkfs.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_CRYPTODISKGRUB_CMDLINE_LINUX這裡GRUB_DISABLE_OS_PROBERcat /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

  • 應用魔法:

    • 關閉臨時虛擬機;分離所有磁碟;附加加密磁碟作為啟動磁碟。
    • 開啟臨時虛擬機;使用串列控制台連接到它,瞧!(系統會在引導時要求您輸入密碼以解鎖加密分區)。
    • 測試是否一切正常,然後在生產虛擬機上使用新的加密磁碟並刪除臨時複製磁碟和臨時虛擬機。
    • 更多資訊可在此處此處獲得。享受 ;)

引用自:https://unix.stackexchange.com/questions/580793