Как принудительно настроить пользовательское шифрование диска в экземпляре облачных вычислений Google (gcloud)?

Так как это bash, вы можете:

< <(shopt -s extdebug; declare -F my_bash_func) IFS=' ' read -d '' _ _ fn
echo "$fn"

Это сбросит значение extdebug при выходе из подоболочки.
Это будет работать с файлами с пробелами и новой строки.

0
19.04.2020, 02:21
1 ответ

В Linux при использовании зашифрованного диска (luks )он разблокируется во время загрузки с помощью пароля. Идея заключается в том, чтобы зашифровать диск с помощью cryptsetup поверх системы google. (шифрование по умолчанию )и получить более ранний доступ к экземпляру, чтобы иметь возможность разблокировать диск во время загрузки. Это можно реализовать с помощью функции удаленной последовательной консоли (. Обратите внимание, что для этого руководства использовалась виртуальная машина opensuse, разные шаги не должны отличаться для других дистрибутивов ).

Кон:

  • Скорость диска будет снижена на 10 ~15%.
  • Во время загрузки/перезагрузки необходимо ввести пароль шифрования в последовательном сеансе.
  • Перезагрузка в случае сбоя/миграции может потребовать ручного ввода пароля (, если он не автоматизирован ).

Про:

  • Доступ к данным действительно ограничен клиентом/владельцем.
  • Приватизированное клиентом шифрование диска в состоянии покоя.
  • Приватизированное клиентом шифрование диска для моментальных копий и образов.
  • Google не может получить доступ к данным на диске (или, по крайней мере, это будет очень сложно ).
  • Ключ шифрования диска не передан Google.
  • Настраиваемый метод шифрования, алгоритм и размер ключа.
  • Улучшение защиты данных и т. д.

Краткое описание реализации:

  • 0 Иметь существующий экземпляр ВМ
  • 1 Включить последовательный доступ к экземпляру/ВМ
  • 2 Создайте дополнительный (целевой )зашифрованный жесткий диск
  • 3 Скопируйте текущий жесткий диск на зашифрованный
  • 4 Замените старый диск на новый
  • 5 Запустите виртуальную машину и введите пароль через последовательную консоль

Как зашифровать диск виртуальной машины (gcloud, cryptsetup):

  • Условие:

    • Создайте новую временную виртуальную машину в целевой зоне (это должна быть копия целевой машины, вы можете сделать резервную копию диска с помощью моментального снимка, а затем восстановить моментальный снимок на новый диск)
    • Создайте новый пустой диск (для последующего шифрования ), это целевой диск, его размер должен быть как минимум на 256 МБ больше исходного диска (для нового раздела /boot ), также диск может быть больше, если вы хотите расширить пространство.
    • Подключите оба диска к временной виртуальной машине и запустите ее.
      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(un -зашифрованный )и другой для системы/(зашифрованный ), не имеет значения если у вас уже был отдельный раздел для /bootили нет в вашей старой системе, в новой нам потребуется, чтобы система загружала grub и запрашивала пароль для разблокировки зашифрованного раздела.
    • Отформатируйте пустой диск и создайте 2 раздела размером не менее 256 МБ (, один из которых будет содержать /boot), а другой — с оставшимся пространством; Для этого используйте fdisk /dev/sdb, создайте первый раздел размером 256 МБ или более в качестве основного раздела и включите загрузочный флаг ; затем создайте второй основной раздел размером с оставшимся пространством (обратите внимание, что если вы использовали раздел для свопа в старой системе, вам также необходимо создать этот раздел )
      /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с
      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 )для этого шага вы можете использовать различные инструменты, в этом руководстве мы будем использовать dd, важное примечание здесь, чтобы ddскопировать диск без ошибок, необходимо размонтировать исходный раздел. Если вы хотите избежать потери данных , вы можете создать другую временную виртуальную машину и подключить к ней исходный и целевой диски в качестве дополнительных дисков для выполнения этого шага... В противном случае, чтобы избежать слишком долгого процесса миграции, я закрыл большая часть запущенного процесса и используется 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(не обращайте внимания на размер зашифрованного диска, мы исправим это позже)
  • 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конфигурации (убедитесь, что вы используете uuid sdb1, а не 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--), также убедитесь, что используете uuid sdb2, а не 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
      
    • Обновите начальный электронный диск и принудительно включите модули шифрования:

      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

  • Применить магию:

    • Отключить временную виртуальную машину; Отсоедините все диски;Прикрепите зашифрованный диск в качестве загрузочного.
    • Включить временную виртуальную машину; Подключитесь к нему через последовательную консоль и вуаля! (вам будет предложено ввести пароль для разблокировки зашифрованного раздела во время загрузки ).
    • Проверьте, все ли в порядке, затем используйте новый зашифрованный диск на рабочей ВМ и удалите диск с временной копией и временную ВМ.
    • Дополнительная информация доступна здесь и здесь . Наслаждаться ;)
1
19.03.2021, 02:28

Теги

Похожие вопросы