В свете последнего жестокого дизастера, своей циничной простотой потрясшего весь OmskLUG, я начал задумываться, как можно предотвратить потерю данных, связанную с потенцальным багами в LUKS. Результатом раздумий стала пара скриптов и, как побочный эффект, эта небольшая статья. Если вас не интересует эпистолярный жанр, можете перейти сразу к разделу со ссылкой на репозиторий.
Потеря — это всегда боль…
Потеря данных — не исключение. И неважно на самом деле, были ли эти данные рабочими базами с боевых серверов или же мегатоннами порнухи семейными фотографиями и личной перепиской. Важно то, что данные, которые не были сознательно удалены хозяином, обязаны оставаться доступными. А иногда даже и те, которые были удалены…
Особенно это касается систем хранения данных с шифрованием разделов. Просто потому, что зашифрованные данные особенно уязвимы к ошибкам. Да, безусловно, некоторые алгоритмы позволяют восстановить поток после сбойного блока. Но этот блок в любом случае будет безвозвратно потерян. И особенно это страшно, если речь идёт об ошибках в области заголовков LUKS. Ведь если ошибка появилась в том месте, где размещены слоты для ключей, это в контексте восстановленя данных практически равносильно низкоуровневому форматированию. Да, это очень удобно, когда срочно необходимо избавиться от информации. А когда эта самая информация, зашифрованная криптостойким алгоритмом с 256-битным ключом, позарез нужна для работы крупного предприятия? Что же делать в таких случаях?
Выход есть!
Во-первых, без паники! Если вы используете любое ПО для резервного копирования данных, в худшем случае вы потеряете время на развёртывании копии системы. Не имеет значения, bacula ли это будет, backuppc или голый rsync. Главное, что важные данные, которые требуются ежедневно, будут сохранены в надёжном месте. Безусловно, на другой машине. Желательно в другом здании. Ещё лучше — в другой стране в надёжном дата-центре.
«Но как же,» — спросите вы, — «это связано с LUKS?» Собственно, напрямую. Поскольку cryptsetup
умеет делать бэкапы LUKS-заголовков и, соответственно, восстанавливать их. И что самое важное, восстановление заголовка из бэкапа может спасти диск даже в том случае, когда заголовок был просто полностью забит мусором из /dev/random
. Да-да! Я лично проверял. Всё работает. Кстати, в связи с этим возникает некая идея «уничтожения» данных с последующим их «волшебным восстановлением»… Ну там если «маски-шоу»… Или если подзаработать захотелось… Гм… Впрочем, ближе к делу. Итак, вот они — две волшебные команды, которые спасут ваши данные/время/деньги/задницупрочие причиндалы.
Сделать бэкап LUKS-заголовка:
cryptsetup luksHeaderBackup <LUKS_DEVICE> --header-backup-file <header_file_name>
Восстановить LUKS-заголовок из бэкапа:
cryptsetup luksHeaderRestore <LUKS_DEVICE> --header-backup-file <header_file_name>
Да, есть ещё одна дополнительная возможность, которая считается весьма опасной. И правильно, в сущности, считается. Потому что это не что иное, как создание мастер-ключа. Удобно, на самом деле: можно на одном мастер-ключе наклепать шифрованных разделов и не бояться забыть пароли. Да вообще пароли можно не знать: нагенерить их автоматически из /dev/random
и поскидывать на флэшки, которые вставлять по мере надобности при загрузке. В случае чего мастер-ключ позволит расшифровать раздел, даже без знания обычных ключей. Однако, очевидно, что это палка о двух концах: посеял файлик с мастер-ключом, и все соответствующие разделы можно считать скомпрометированными. Ну либо мёртвыми. И неизвестно ещё, что хуже. Кстати, вот команда для сдампливания мастер-ключа:
cryptsetup luksDump --dump-master-key <LUKS_DEVICE>
Да, вот так просто можно подарить кому-то все свои заботливо зашифрованные данные.
Ну так, собственно, к чему это я всё? К тому, что следующим логичным шагом в деле защиты данных будет
Автоматизация
Собственно, отсюда и начинается та самая реклама, про которую был соответствующий тэг.
Итак… [барабанная дробь] Встречайте! Скрипты для автоматического создания бэкапа заголовков LUKS и мастер-ключа! А на…зачем, собственно, нужны какие-то там непонятные скрипты, если всё делается буквально в полторы-две команды? Отличный вопрос!
- Во-первых, теперь даже не нужно набирать эти полторы команды, достаточно одной.
- Во-вторых, для файлов заголовка и мастер-ключа подсчитываются контрольные суммы по нескольким алгоритмам.
- В-третьих, всё это добро архивируется и шифруется.
- В-четвёртых, к шифрованному архиву по мере возможностей добавляются тома для восстановления. Чтобы в случае, если флэшку с бэкапом пробьёт шальной протон с высокой энергией, и банк в 128 кБ окажется мёртвым, то была бы возможность откачать этот архиив. А то кому нужен супер-пупер защищённый, вусмерть зашифрованный, но при этом битый бэкап, который невозможно восстановить?
Подробно работу со скриптами описывать не буду, поскольку всё есть в Readme. Однако, на всякий случай отмечу, что кроме coreutils
и cryptsetup
, скриптам для работы понадобится ещё и xxd
. А если хочется ещё и создать тома для восстановления архива, то нужно будет поставить par2
. Больше никаких сложностей возникнуть не должно.
Так что, если кто хочет дополнительно обезопасить свои данные и себя, заходите в репу на гитхабе (по ссылке выше).
P.S.: Этот пост посвящается памяти всех данных, безвозвратно утерянных вследствие обстоятельств непреодолимой силы или просто пользовательского/админского раздолбайства (что по сути одно и то же).