воскресенье, 8 июня 2014 г.

Linux: создаём зашифрованный контейнер

Наверно, в жизни каждого человека происходят случаи, которые можно охарактеризовать одним словом: "невезуха". Например, ты заказал себе жесткий диск для хранения бэкапов, но твой компьютер не дождался и сгорел за день до получения покупки. Или ты сменил работу, а через месяц твоя новая фирма разорилась. Или ты купил дачу, а рядом с ней с наветренной стороны построили свиноферму. Или ещё что-нибудь.

В середине весны у меня на служебном компьютере умер очередной винчестер, и стало ясно, что так продолжаться не может. Хоть я потерял и не сильно критичные файлы - какие-то старые бэкапы и пиратские дистрибутивы - но это событие всё равно оказалось, что называется, close call. Поэтому было принято стратегическое решение: упорядочить свои данные и работу с ними. Сделал я это следующим образом.

Во-первых, был выполнен аудит имеющейся в моём распоряжении информации и произведено её разделение на три неравные части:

1) Критически важная: продукты моего труда (исходники программ, какие-то запросы, заметки, уникальные документы и т.п.), логины-пароли и т.д.

2) Важная: служебная почтовая переписка, оказавшиеся у меня файлы других пользователей, рабочие файлы и т.д.

3) Не важная: дистрибутивы, скачанные с инета, временные файлы и т.д. В общем, всё, что можно восстановить или не сильно жалко потерять.

Во-вторых, принят регламент дальнейшей работы:

1) В качестве операционной системы использовать Linux.

2) Те задачи, которые не могут быть перенесены под линукс и которые нужно решать по долгу службы (в частности, у нас существенно используются .NET приложения, часть из которых разрабатывал я сам), будут жить на виртуальной машине под управлением Oracle VM VirtualBox.

3) Не раскидываться по компьютерам. Не должно быть такого: что-то дома, что-то на работе, что-то вообще непонятно, где. Всё, что я делаю, должно храниться в одном месте.

4) Вся моя информация должна быть целиком и полностью под моим контролем. Не должно быть так, что воспользовался, скажем, сетевым хранилищем, а оно послезавтра закрылось или посчитало, что мой контент нарушает чьи-то права, и закрыло меня.

Лучшим решением, наверно, было бы переселиться на ноутбук. Но, во-первых, тупо нет лишних денег, и, во-вторых, лень таскать его с работы домой и обратно. Поэтому в качестве паллиатива был прикуплен внешний жесткий диск (3Q 500Гб USB 2.0) за 1800 рублей. Дальше предполагалось следующее:

1) создать четыре криптоконтейнера (критически важная, важная и не важная информация плюс виртуальная машина)

2) копировать их ежедневно на свой домашний компьютер

3) криптоконтейнер с критически важной информацией закидывать в DropBox (это, кстати, накладывает ограничение на объем этого криптоконтейнера - 2 Гб и служит одной из причин наличия приставки "крипто-" во всей этой истории вообще)

И всё получилось как нельзя лучше, но дальше началась та самая "невезуха". В качестве средства для создания криптоконтейнеров я выбрал знакомый мне с незапамятных виндовских времён TrueCrypt 7.1a. Это было в конце апреля. В конце мая вышеуказанный проект начало как-то подозрительно колбасить, и это заставило меня начать поиск альтернатив.

И тут выяснилась поразительная вещь. Оказывается, всё это время у меня под носом тихо лежало всё необходимое для создания полноценных криптоконтейнеров! Я имею в виду cryptsetup с LUKS. Удивительная всё-таки штука этот линукс. Делается подобное, как я понял, так:

1) Создаётся файл myContainer нужного размера:
dd if=/dev/urandom of=myContainer bs=1M count=2048

2) Этот файл превращается в криптоконтейнер:
sudo cryptsetup luksFormat myContainer

3) Просматривается список занятых loopback-устройств:
sudo losetup -a
и находится первое свободное, скажем, /dev/loop0. Либо это можно сделать сразу командой:
sudo losetup -f

4) Криптоконтейнер ассоциируется с этим свободным устройством:
sudo losetup /dev/loop0 myContainer
либо, опять-таки, минуя п.3 всё это делается сразу:
sudo losetup -f myContainer

5) Открывается криптоконтейнер командой:
sudo cryptsetup luksOpen /dev/loop0 LUKSmyContainer

6) Содержимое криптоконтейнера форматируется командой:
sudo mkfs -t ext4 /dev/mapper/LUKSmyContainer

7) Теперь можно примонтировать криптоконтейнер к заранее созданной точке myMountpoint:
sudo mount /dev/mapper/LUKSmyContainer myMountpoint

То есть в итоге получается такая цепочка:
файл myContainer -> устройство /dev/loop0 -> устройство LUKSmyContainer -> точка монтирования myMountpoint

Теперь можно производить запись в этот криптоконтейнер, как на обычный диск. Правда, есть одна тонкость, впрочем, характерная для всех моих дисков - в корень писать без рутовых прав мне не удалось. Так что я создаю в корне нужную папку, командой chown меняю ей владельца на себя, и дальше уже работаю в этой папке из-под непривилегированного пользователя.

После того, как работа завершена, можно отключить этот криптоконтейнер, выполнив последовательность команд:
sudo umount myMountpoint
sudo cryptsetup luksClose LUKSmyContainer
sudo losetup -d /dev/loop0

Кстати, ещё один приятный момент: cryptsetup всю работу с loopback-устройствами может взять на себя. Так что, если мне потребуется примонтировать криптоконтейнер, я могу воспользоваться более простым вариантом:
sudo cryptsetup luksOpen myContainer LUKSmyContainer
sudo mount /dev/mapper/LUKSmyContainer myMountpoint
(Кстати, в убунте вторая команда не требуется - устройство подхватывается и монтируется автоматически.)

Соответственно, при отключении криптоконтейнера в этом случае понадобятся всего две команды:
sudo umount myMountpoint
sudo cryptsetup luksClose LUKSmyContainer
(И снова кстати - в убунте при отключении тома через файловый менеджер Thunar никаких дополнительных команд не требуется вообще.)

Ну и напоследок: чтобы посмотреть все подключенные в данный момент устройства, включая и криптоконтейнеры, достаточно выполнить команду:
lsblk --fs

Комментариев нет:

Отправить комментарий