Роман Теличко

Блог о программировании, оптимизации и администрировании

Ubuntu 21.04 и полнодисковое шифрование LUKS (включая раздел /boot)

// | 224 просмотров

На данный момент во многих дистрибутивах уже из коробки предоставляется возможность создавать шифрованные разделы. Однако, все варианты предусматривают нешифрованный /boot, что является небезопасным.

Настройка начинается при инсталляции новой Ubuntu 21.04.
Нажмите «Установить», чтобы начать установку Ubuntu в окне инсталлятора Ubiquity, выберите язык и раскладку, подключитесь к Интернет.
После чего откройте терминал Terminal (Ctrl+Alt+T) и продолжите в нём:

sudo -i
lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0   2,1G  1 loop /rofs
loop1    7:1    0  55,4M  1 loop /snap/core18/1997
loop2    7:2    0   219M  1 loop /snap/gnome-3-34-1804/66
loop3    7:3    0    51M  1 loop /snap/snap-store/518
loop4    7:4    0  64,8M  1 loop /snap/gtk-common-themes/1514
loop5    7:5    0  32,3M  1 loop /snap/snapd/11588
sda      8:0    0 476,9G  0 disk 
sdb      8:16   1 115,5G  0 disk 
├─sdb1   8:17   1   2,6G  0 part /cdrom
├─sdb2   8:18   1   4,9M  0 part 
├─sdb3   8:19   1   300K  0 part 
└─sdb4   8:20   1 112,9G  0 part /var/crash

Мой диск /dev/sda и все операции я буду производить над ним. Если у вас другой — не забывайте менять название.

Размечаем диск /dev/sda

sgdisk --zap-all /dev/sda
sgdisk --new=1:0:+512M /dev/sda
sgdisk --new=2:0:+2M /dev/sda
sgdisk --new=3:0:+128M /dev/sda
sgdisk --new=5:0:0 /dev/sda
sgdisk --typecode=1:8301 --typecode=2:ef02 --typecode=3:ef00 --typecode=5:8301 /dev/sda
sgdisk --change-name=1:boot --change-name=2:grub --change-name=3:efi --change-name=5:rootfs /dev/sda
sgdisk --hybrid 1:2:3 /dev/sda
sgdisk --print /dev/sda
Disk /dev/sda: 1000215216 sectors, 476.9 GiB
Model: SanDisk SD8SN8U5
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 3C4AA847-FE7E-4F39-8D77-C9454904FDD8
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1000215182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1050623   512.0 MiB   8301  boot
   2         1050624         1054719   2.0 MiB     EF02  grub
   3         1054720         1316863   128.0 MiB   EF00  efi
   5         1316864      1000215182   476.3 GiB   8301  rootfs

Добавляем шифрование LUKS1 для раздела /boot (потому что GRUB пока не поддерживает LUKS2)

cryptsetup luksFormat --type=luks1 /dev/sda1
WARNING!
========
This will overwrite data on /dev/sda1 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sda1: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Verify passphrase: XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Добавляем шифрование LUKS2 для раздела / (root)

cryptsetup luksFormat --type=luks2 /dev/sda5
WARNING!
========
This will overwrite data on /dev/sda5 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sda5: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Verify passphrase: XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Открываем оба раздела (sda1 — boot, sda5 — rootfs) с помощью введенного выше пароля для дальнейшей инсталляции.

cryptsetup open /dev/sda1 boot
Enter passphrase for /dev/sda1: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
cryptsetup -v status boot
/dev/mapper/boot is active.
  type:    LUKS1
  cipher:  aes-xts-plain64
  keysize: 512 bits
  key location: dm-crypt
  device:  /dev/sda1
  sector size:  512
  offset:  4096 sectors
  size:    1044480 sectors
  mode:    read/write
Command successful.
cryptsetup open /dev/sda5 rootfs
Enter passphrase for /dev/sda5: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
cryptsetup -v status rootfs
/dev/mapper/rootfs is active.
  type:    LUKS2
  cipher:  aes-xts-plain64
  keysize: 512 bits
  key location: keyring
  device:  /dev/sda5
  sector size:  512
  offset:  32768 sectors
  size:    998865551 sectors
  mode:    read/write
Command successful.

Форматируем разделы boot и rootfs в файловой системе ext4, а sda3 (efi) в файловой системе FAT16

mkfs.ext4 -L boot /dev/mapper/boot 
mke2fs 1.45.7 (28-Jan-2021)
Creating filesystem with 130560 4k blocks and 130560 inodes
Filesystem UUID: d0b63335-c4ff-469f-be74-87a14cf966de
Superblock backups stored on blocks: 
	32768, 98304
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
mkfs.vfat -F 16 -n EFI /dev/sda3
mkfs.fat 4.2 (2021-01-31)
mkfs.ext4 /dev/mapper/rootfs
mke2fs 1.45.7 (28-Jan-2021)
Creating filesystem with 124858193 4k blocks and 31219712 inodes
Filesystem UUID: a5500a0f-f5f1-4548-a25f-1f02646d546c
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done 

Продолжаем в окне инсталляции

Выбираем раздел /dev/mapper/boot как «Журналированная файловая система ext4», ставим галочку «Форматировать» и выбираем точку монтирования «/boot«
Выбираем раздел /dev/mapper/rootfs как «Журналированная файловая система ext4», ставим галочку «Форматировать» и выбираем точку монтирования «/» (корень)

Пока продолжается инсталляция в фоне, в консоли выполняем следующую команду, что обеспечит корректное завершение инсталляции системы с помощью инсталлятора Ubiquity.

while [ ! -d /target/etc/default/grub.d ]; do sleep 1; done; echo "GRUB_ENABLE_CRYPTODISK=y" > /target/etc/default/grub.d/local.cfg

После успешного завершения инсталляции системы с помощью инсталлятора Ubiquity НЕ ПЕРЕЗАГРУЖАЕМСЯ, а продолжаем работу.

Монтируем свеже-установленную систему и заходим внутрь с помощью chroot

mount /dev/mapper/rootfs /target
for n in proc sys dev etc/resolv.conf; do mount --rbind /$n /target/$n; done
chroot /target
mount -av
/                        : проігноровано
/boot                    : successfully mounted
/boot/efi                : successfully mounted
none                     : проігноровано

Добавляем возможность загрузки с шифрованного раздела /boot

apt install -y --reinstall grub-efi-amd64-signed linux-generic linux-headers-generic cryptsetup-initramfs 
echo "KEYFILE_PATTERN=/etc/luks/*.keyfile" >> /etc/cryptsetup-initramfs/conf-hook
echo "UMASK=0077" >> /etc/initramfs-tools/initramfs.conf 
mkdir /etc/luks
dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=512 count=1
1+0 записів прочитано
1+0 записів записано
скопійовано 512 байтів, 0,000276825 s, 1,8 MB/s
chmod u=rx,go-rwx /etc/luks
chmod u=r,go-rwx /etc/luks/boot_os.keyfile
cryptsetup luksAddKey /dev/sda1 /etc/luks/boot_os.keyfile
Введіть пароль: 
cryptsetup luksAddKey /dev/sda5 /etc/luks/boot_os.keyfile
ПОПЕРЕДЖЕННЯ: не вистачає блокування каталогу /run/cryptsetup!
Введіть пароль: 
echo "boot   UUID=$(blkid -s UUID -o value /dev/sda1) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab
echo "rootfs UUID=$(blkid -s UUID -o value /dev/sda5) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab
cat /etc/crypttab
boot   UUID=fe4dbe2e-13aa-4e0f-8533-f0fe7c7fe77f /etc/luks/boot_os.keyfile luks,discard
rootfs UUID=f7c32fe4-2d5c-480d-b8de-7f19538a3640 /etc/luks/boot_os.keyfile luks,discard

Выключаем swap-файл (опционально)

swapoff /swapfile
sed -i '\|^/swapfile|d' /etc/fstab

Переустанавливаем initramfs и grub:

echo "GRUB_ENABLE_CRYPTODISK=y" > /etc/default/grub.d/local.cfg
update-initramfs -u -k all
grub-install /dev/sda
Встановлюємо для платформи x86_64-efi.
Встановлення завершено. Помилок не виявлено.
update-grub
Обробляємо файл «/etc/default/grub»
Обробляємо файл «/etc/default/grub.d/init-select.cfg»
Обробляємо файл «/etc/default/grub.d/local.cfg»
Створюємо файл налаштувань grub...
Виявлено образ linux: /boot/vmlinuz-5.11.0-17-generic
Виявлено образ initrd: /boot/initrd.img-5.11.0-17-generic
Виявлено образ linux: /boot/vmlinuz-5.11.0-16-generic
Виявлено образ initrd: /boot/initrd.img-5.11.0-16-generic
Додаємо пункт меню завантаження для параметрів мікрокоду UEFI
виконано
exit
reboot

Это всё.
Удачи!