Введение ¶
Шифрование диска с использованием dm-crypt — это надёжный способ защиты данных. Однако в экстремальных ситуациях может потребоваться мгновенное и необратимое уничтожение ключей шифрования, чтобы данные стали недоступными. Для этого можно использовать механизм nuke, который активируется при вводе специального пароля.
В этой статье рассмотрим, как реализовать nuke в dm-crypt, используя initramfs, cryptsetup и mkpasswd.
Разработанный хук умеет:
- Расшифровывать диск используя данные с файла
- Если файл не найден, спрашивает пароль
- Если пароль это nuke пароль - удаляет все ключи
Важно! У меня это работает на Ubuntu 22.04.5, есть большая вероятность, что на других дистрибутивах нужно будет сделать что-то по другому. В любом случае, вот статья по восcтановлению Grub.
Установка ¶
Я подготовил DEB пакет для простой установки. Качаем и ставим вот такой командой.
| |
Настройка загрузки ¶
В моём случае, у меня зашифрован / и не зашифрован /boot.
Прежде всего, нужно добавить cryptdevice аргумент в /etc/default/grub. UUID можно получить из вывода blkid (берём UUID зашифрованного раздела).
| |
Теперь, нужно добавить в /etc/crypttab указание использовать таш скрипт.
| |
Описание аргументов:
cryptroot- имя раздела после расшифровки. В данном случае он появится в системе как /dev/mapper/cryptroot. Должно совпадать с тем, что мы написали в /etc/default/grub.UUID=bb85fe0a-4ef7-49c4-b15c-fb613d51e9ef- то же, что мы прописали в /etc/default/grub.- Всё третье поле это аргумент к скрипту:
keyfile-path=/dev/mmcblk0- путь к файлу или устройству откуда читать пароль, в моём случае это SD картаkeyfile-offset=4194836274- отступ в байтах от начала файла, если не указано - читать с начала.keyfile-size=7333- длинна последовательности для чтения, если не указано - читать до конца.nuke=HASH- хеш пароля самоуничтожения.
luks,discard,keyscript=decrypt_smart_nuke- опции для cryptsetup, где мы, среди всего прочего, указываем имя скрипта для получения пароля.
Замените HASH на хэш пароля, который можно получить вот так.
| |
И keyfile, и nuke опциональны, можно не указывать их и скрипт отработает только на интерактивный ввод.
Файле для считывания ключа ¶
Тут идея в следующем. У меня на ноутбуке есть SD Card Reader, так вот он всегда живёт с заглушкой. Почему бы, подумал я, его не использовать для хранения ключа? Есть два интересных варианта:
- Сделать раздел на флешке, но оставить буквально один мегабайт до или после него. Забить случайными данными и использовать этот кусок как ключ - незаметно. Сам раздел использовать с пользой.
- Забить всю флешку случайными данными и использовать случайный адрес и длину последовательности.
Вот второй вариант я и выбрал. Да, сторонний наблюдатель поймёт, что тут что-то не чисто, да, флешку нельзя использовать по прямому назначению, но поди угадай тот адрес начала и длину последовательности.
И ещё, можно использовать другие, более безопасные варианты указаний пути к разделу:
- /dev/disk/by-id/…
- /dev/disk/by-uuid/…
- /dev/disk/by-label/…
У меня просто SD Card Reader один физически и больше не планируется.
Обновление initramfs ¶
После внесения всех изменений обновите initramfs и grub.
| |
Итог ¶
Теперь, если при загрузке системы ввести nuke-пароль, скрипт уничтожит ключи шифрования и сделает данные недоступными. Этот метод подходит для критических ситуаций, требующих быстрой и необратимой защиты информации.
Кроме того, система будет расшифровываться сама, а если нужно куда-то поехать с ноутбуком, то флешку можно вытащить и он будет спрашивать пароль.
Будьте осторожны при использовании данного механизма и имейте бекап.
| |
