Создаём зашифрованные диски при помощи LUKS

Ни в коем случае нельзя аргументировать желание обезопасить собственные данные фразой “мне нечего скрывать”, потому-что когда вам действительно захочется что-то скрыть, то будет уже поздно. Неприкосновенность личной жизни - очень шаткая вещь, которая может испариться в один миг.

В повседневной жизни часто требуется хранить конфиденциальную информацию. Это могут быть данные любого характера: от общих (паспортные данные) до биометрических (отпечатков пальцев). Это всё должно защищаться не только правительством на законодательном уровне, но и самим владельцем при помощи аппаратных и программных средств.

Вместо того чтобы хранить зашифрованные файлы по отдельности проще и разумнее будет использовать полноценное устройство с шифрованием, в отличии от обычного шифрования, шифрование диска (FDE) позволяет защищать не только сами файлы, но временные и метаданные самой в файловой системе, которые могли использоваться в процессе и частично скомпрометировать данные. Также FDE защищает данные при внезапном отключении сети, потому-что файлы читаются и записываются на устройство сразу в зашифрованном виде, поэтому такое шифрование называют “прозрачным”, то есть не требуют время на запись.

Среди спецификаций шифрования дисков особенно выделяется LUKS (Linux Unified Key Setup), распространённый для внешних накопителей. В некоторых дисковых менеджерах (в частности KDE Partition Manager) уже давно существует кнопка “БДЫЩ”, которая делает всё быстро и возможно качественно, но в рамках статьи я делаю это из консоли. Чтобы его установить LUKS для начала подготовим диск.

Подготовка диска

Оговорки:

Форматируем диск и создаём новый раздел (для наглядности я использую fdisk):

# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.41.5).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): g
Created a new GPT disklabel (GUID: C09608DB-5381-468B-90FF-F8D5548CA76C).

Command (m for help): n
Partition number (1-128, default 1): 
First sector (2048-1000215182, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1000215182, default 1000214527): 

Created a new partition 1 of type 'Linux filesystem' and of size 476.9 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Внимание: При использовании FDE простого форматирования диска может быть недостаточно, потому-что старые файлы всё ещё физически находятся на диске, а размер зашифрованного раздела известен. Благодаря этому можно установить приблизительный размер и характер файлов. Чтобы этого избежать нужно предварительно заполнить диск случайными данными. Я использую disk-filltest потому-что это самое близкое к тому что я нашёл в репозиторий Debian. Не повторяйте за мной и используйте специальное программное обеспечение.

Это внешний жёсткий диск, который я собираюсь использовать для резервных копий со своего ноутбука. Если вы тоже используйте внешнее устройство, я рекомендую также выбирать все доступные сектора, таким образом будет сложно оценить стоимость взлома.

Установка LUKS

Теперь когда диск готов мы можем приступить к установке LUKS. LUKS создаёт новое устройство (контейнер) поверх обычного раздела где устанавливается новая зашифрованная файловая система. Нельзя просто зашифровать диск со всеми файлами, поэтому временно переносим файлы в безопасное место. Инициализируем раздел и устанавливаем парольную фразу в key-slot 0:

# cryptsetup luksFormat /dev/sdb1

WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sdb1: 
Verify passphrase: 

После этого мы можем создать ещё ключей для открытия контейнера (luksAddKey), изменить ключи (luksChangeKey) или удалить их (luksRemoveKey).

К сожалению, LUKS не поддерживает ключи которые могли бы окрипичить контейнер или показать “безопасные” файлы на случай когда вас физически принуждают открыть контейнер (XKCD: Security). Вы сами можете написать скрипт который уничтожит заголовок LUKS (первые 2 МБ) после чего контейнер перестанет быть читаемым, даже имея все ключи на руках. По этой же причине рекомендуется делать резервную копию заголовка (luksHeaderBackup) на случай повреждения диска.

По умолчанию после создания контейнер закрыт, поэтому открываем его и присваиваем к нему название (в моём случае это “backup”).

# cryptsetup open /dev/sdb1 backup

Устройство теперь доступно как “/dev/mapper/backup” и мы можем создать файловую систему. Я буду создавать ext4, но вы можете выбирать любую:

# mkfs.ext4 /dev/mapper/backup 
mke2fs 1.47.2 (1-Jan-2025)
Creating filesystem with 125022464 4k blocks and 31260672 inodes
Filesystem UUID: beecd548-8204-41f9-b974-53d6428d9b8b
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

Закрываем контейнер:

# cryptsetup close backup

Используем как пользователь

Готово, всё самое сложное позади и мы можем использовать его как пользователь. Разблокируем контейнер при помощи UDisks:

$ udisksctl unlock -b /dev/sdb1
Passphrase: 
Unlocked /dev/sdb1 as /dev/dm-3.

И сразу же смонтируем его, чтобы получить доступ к файлам:

$ udisksctl mount -b /dev/dm-3
Mounted /dev/dm-3 at /media/lessavin/beecd548-8204-41f9-b974-53d6428d9b8b

Приятного пользования. Берегите свою неприкосновенность. Делайте резервные копии. Слушайтесь маму.

-- 
Aleksei Savin                   mailto:lessavin@hotmail.com  
https://lessavin.ru             xmpp:lessavin@lessavin.ru  
Europe/Moscow (MSK, +0300)      matrix:u/lessavin:gnulinux.club