5/14/2012

Шифрование разделов и файлов в Linux с помощью loop-device и AES алгоритма

Способов шифрования в Linux много, но в данном случае будет показан простой и быстрорастворимый метод с использованием cryptoloop. С его помощью мы можем шифровать как отдельные разделы (например, создать зашифрованный раздел на флешке), либо сделать криптофайл (зашифрованный файл, внутри которого хранятся ценные данные). Последнее особенно удобно для личного применения.




Немного юниксвея
Шифрование раздела на физическом носителе и создание криптофайла на самом деле для UNIX будут выглядеть одинаково. Это есть следствие принципа UNIX "всё есть файл", над которым стоит немного помедитировать. Так, в посте о монтировании разделов уже приводился пример того, как можно примонтировать ISO-образ файла в Linux и получить доступ к файлам. Хотелось бы подчеркнуть этот факт ещё раз:
с точки зрения UNIX/Linux не важно, примонтируете ли вы:
  • физический CD-диск, который соответствует устройству /dev/cdrom в точку монтирования /mnt/cdfiles
  • ISO-образ этого диска в точку монитирования /mnt/cdfiles
вы получите один и тот же результат. На самом деле вы монтируете логическую структуру, подключая её к корневой файловой системе.
Понимание этого факта важно для последующего изложения, и вообще важно для работы в Linux, а не только тыкания по кнопкам в KDE/GNOME.


Два слова о петлевом устройстве (Loop-device)
Loopback Device (loop) это механизм ядра Linux, используемый для интерпретации файлов как реальных блочных устройств. Главное, что все инструменты, используемые для работы с реальными дисками (например mount), могут быть использованы и для петлевых устройств.

Говоря простыми словами, loop нужен для того, чтобы структурированные файлы (ISO-образы, копии разделов с флешек, шифрованные файлы) для ядра выглядели, как реальные диски. В посте о монтировании разделов был пример с ISO-образом

mount -t iso9660 file.iso /mnt/dvd -o loop
Именно параметр и указывает на то, что при монтировании будет использовано loop-устройство (петлевое устройство, петля). Петлевых устройств в системе несколько, и называются они /dev/loop0 ... /dev/loop7. Можно создать их и больше, если надо:

mknod /dev/loop8 b 7 8
mknod /dev/loop9 b 7 9
Главное, чтобы поддержка loopback-device была в ядре Linux (если вы его не собирали сами, она там скорее всего есть). Больше о петлевых устройствах можно прочитать тут, там и здесь.


Установка и подготовка к работе
Для cryptoloop нам потребуется установить небольшой пакет:
sudo aptitude install loop-aes-utils
Далее загружаем модуль cryptoloop:
sudo modprobe cryptoloop
он должен появиться в списке модулей ядра, проверить который можно командой lsmod.


Шифруем файлы и разделы с помощью Cryptoloop и алгоритма AES
Для начала нужно определиться: указываемый метод НЕ ПРЕДНАЗНАЧЕН для шифрования разделов с данными, а только для создания зашифрованных разделов, куда эти данные потом будут скопированы. Так что если вы сотрёте свой раздел с важными данными - пеняйте на себя и читайте в следующий раз внимательно.

Если следовать рецептам ниже с головой и всё сделать правильно, то в результате мы получим раздел\файл, с которым можно будет работать, как с любым диском на чтение и запись - с той разницей, что данные там будут зашифрованы. Каждый раз при монтировании нас будут спрашивать пароль для доступа к этим файлам.

Итак, начинаем подготавливать криптораздел\криптофайл, куда мы скопируем ценные данные и зашифруем.

0. Создание криптофайла или криптораздела
Если мы хотим создать один большой файл, который будет содержать зашифрованные файлы, делаем это так:
dd if=/dev/zero of=~crypto.file bs=1M count=30
В данном примере это файл на 30 Мб, но при нужде можно сделать сколько угодно.

Или ищем флешку, на которой есть пустой раздел - этот пустой раздел мы сделаем шифрованным. Допустим, это будет /dev/sdd2 который мы скоро отформатируем и зашифруем.

Ещё раз:/dev/sdd2 это НЕ раздел с вашими данными, а пустой раздел, куда вы эти данные переместите - и они при этом зашифруются. О создании разделов можно почитать в посте о форматировании.


1. Связываем устройство с loop device (петлевым устройством) с использованием шифрования
В случае криптофайла:
losetup -e aes /dev/loop0 ~crypto.file
В случае криптораздела:
losetup -e aes /dev/loop0 /dev/sdd2
При любом варианте вас попросят ввести пароль - он будет использоваться для доступа к вашим файлам.
cat file | losetup -e aes /dev/loop0 /dev/sdd2 -p0
Пароль меньше 20 символов оно не примет - и правильно сделает. Излишне напоминать, что если забудете пароль - не сможете примонтировать данные обратно. Для любопытных: ключ -e aes указывает программе использовать шифрование AES, который довольно устойчив ко взлому.

Теперь больше работать с устройством через /dev/sdd2 или crypto.file мы не будем, потому как оно зашифровано и система его просто так не примонтирует. Вместо этого работать мы будем именно с петлевым устройством, на которое замкнули криптофайл или криптораздел - оно может быть /dev/loop0 или другое (необязательно каждый раз замыкать на одно и то же устройство).


2. Форматирование зашифрованного раздела или файла
После того, как мы связали устройство или файл с loop-device, нужно его отформатировать:
mkfs.ext2 /dev/loop0
В этом примере мы отформатировали на файловую систему Ext2, но можно использовать любую.


3. Перенос данных и работа с зашифрованным разделом или файлом
Работаем с петлевым устройством, как с обычным разделом: монтируем, записываем на него данные и так далее. Монтирование зашифрованного раздела или файла выглядит так:

mkdir /mnt/cryptodisk <--- это если точка монтирования ещё не создана
mount /dev/loop0 /mnt/cryptodisk
Размонтирование:
umount /dev/loop0
Больше о монтировании можно прочитать в соответствующем посте.


4. Окончание работы с криптофайлом\криптоустройством
После отмонтирования нужно отвязать устройство или файл от петлевого устройства:
losetup -d /dev/loop0
На всякий случай, просмотреть список задействованных петлевых устройств (loop devices) можно командой:
losetup -a
Теперь петлевое устройство свободно, данные зашифрованы, враг не пройдёт.


А как теперь обратно прикрутить криптованный раздел или файл?
Легко - доступ к зашифрованным данным можно получить, опять привязав к петлевому устройству криптораздел\криптофайл и введя пароль, который вы назначили ранее. То есть в случае криптофайла:
losetup -e aes /dev/loop0 ~crypto.file
В случае криптораздела:
losetup -e aes /dev/loop0 /dev/sdd2
Вас снова попросят ввести пароль, который нужен для доступа к вашим файлам.

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

Альтернативы
  • более каноничный способ по мнению некоторых комментаторов ниже, это использовать штатный cryptsetup. Об этом есть хорошая заметка на блоге у Librarian и толковое руководство.
  • ещё можно попробовать Truecrypt, где есть возможность создания зашифрованного контейнера с "двойным" дном, т.е. двух уровней правдоподобного отрицания, на случай рассекречивания паролей.


Лирическое отступление
Не хотелось бы разочаровывать начинающих криптоанархистов, но ребята с xkcd в общем реалистично смотрят на вещи:


Тем не менее, светить своими данными не комильфо, и какое-то время вы выиграете.

26 комментариев:

  1. Насколько я помню, loop-aes никогда не включали в официальное ядро, т.е. это левый патч. Одно время его добавляли при сборке ядра в Debian (например, в Lenny), но начиная со Squeeze прекратили.

    Поэтому лучше все-таки через штатный cryptsetup.

    ОтветитьУдалить
  2. правильно это делать через lvm. там можно совершать все действия онлайн, перенося данные с одного физ диска на другой, шифруюя, сжимая и разжимая.

    или btrfs.

    ОтветитьУдалить
  3. Мы с тобой одновременно написали про шифрование http://libc6.org/page/perenos-home-na-zashifrovannyj-razdel

    Занятное совпадение.

    ОтветитьУдалить
  4. По поводу лирического отступления вспомнилось одно из суждений Инь Фу Во :)

    Однажды инженер Чжа Вынь обратился к Учителю:
    – Один достойный уважения человек сказал мне, что шифровать электронную почту неправильно. Поскольку честному человеку нечего скрывать, шифрованная переписка неизбежно привлечёт внимание Охранительного ведомства. Учитель, что вы об этом думаете?
    Инь Фу Во ответил:
    – Благородный муж имеет чувство стыдливости. Он закрывает одеждой свою наготу. Вовсе не потому, что лицезрение другими принесёт ему ущерб. Но такова воля Неба, и таков ритуал. Честному человеку есть, что скрывать.

    ОтветитьУдалить
  5. @Анонимный комментирует...
    Насколько я помню, loop-aes никогда не включали в официальное ядро, т.е. это левый патч.
    Анонимус, главное - он работает, просто и легко. Я лично ценю Дебиан именно вот за это - оно работает без отваливаний иксов, юнити, сломанных зависимостей и безумного релиз-цикла "полгода и хоть потоп".

    Одно время его добавляли при сборке ядра в Debian (например, в Lenny), но начиная со Squeeze прекратили.
    А это, в Сквизи оно в репах тоже есть. Должно ж работать...

    Поэтому лучше все-таки через штатный cryptsetup.
    Что-то у меня оно не завелось в своё время. Анонимус намекает, что стоит попробовать ещё раз? :-)


    @Alexey Kuznetsov комментирует...
    правильно это делать через lvm.
    Ну, Алексей, мне пескарей в пруду поудить - вы предлагаете подогнать линкор. Он не плох, просто это слишком.

    или btrfs.
    Кхм... я в общем-то хочу получить свои зашифрованные данные обратно, знаете ли. Для безвозвратного уничтожения данных есть менее экзотические методы :-)


    @librarian комментирует...
    Мы с тобой одновременно написали про шифрование
    Это да. Ну так Большой Брат наступает, вот параноики и зашевелились :-))

    Кстати, я на твой пост ссылку поставил. И да, Librarian, твой дискас не переваривает блоггеровские OpenID. Покрути его :-)


    @Livid комментирует...
    По поводу лирического отступления вспомнилось одно из суждений Инь Фу Во
    Очень поучительная история. Любому человеку всегда есть, что скрывать. Или, скажем так, есть то, что правительству знать необязательно. :-)

    ОтветитьУдалить
  6. Как всегда гуд, однако давно использую EncFS :)

    ОтветитьУдалить
  7. @Михаил Саушкин комментирует...

    Как всегда гуд, однако давно использую EncFS
    Михаил, а оно секурно? Меня смущает вот это (из википедии):

    2. Fragmentation of the encrypted volume causes fragmentation of the filesystem containing the source directory.

    3. Anyone having access to the source directory is able to see how many files are in the encrypted filesystem

    Особенно последнее.

    ОтветитьУдалить
  8. Использую Truecrypt - http://web-bricks.ru/comments/truecrypt_-_besplatnaya_krossplatformennaya_programma_shifrovaniya_dannyh

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

    ОтветитьУдалить
  9. Спасибо за пост! Про cryptsetup знал, а про это нет. Хотя на практике шифрования не юзал, нет у меня ничего тайного и криминального :-)

    Кхм... я в общем-то хочу получить свои зашифрованные данные обратно, знаете ли. Для безвозвратного уничтожения данных есть менее экзотические методы :-)
    Да, пробовал я btrfs... Если "rm -rf /" - патч Бармина, то btrfs - это патч Оракл :-)

    ОтветитьУдалить
  10. привет.

    В debian-russian был не так давно правильный тред на эту тему.

    Сухая выжимка: надо использовать cryptsetup с форматом LUKS. В качестве алгоритма на сегодня правильнее всего aes-xts-plain

    Ссылки на аргументацию можно найти в треде. http://lists.debian.org/debian-russian/2012/04/msg00012.html

    Удачи.

    ОтветитьУдалить
  11. > А это, в Сквизи оно в репах тоже есть. Должно ж работать...

    В репах (включая Sid) есть только юзерспейсная часть (грязно похаканные левыми патчами mount, swapon и losetup). Ядерная часть (модуль cryptoloop) отсутствует в дебиановском штатном ядре, начиная с нынешнего stable.

    > Анонимус, главное - он работает, просто и легко.

    Ничего себе - просто и легко! Требуется пересборка ядра с применением неофициальных патчей. Мы вроде как не на генте и не на LFS живем :)

    ОтветитьУдалить
  12. > XXKB
    Вы, конечно, имели в виду xkcd :)

    ОтветитьУдалить
  13. cryptoloop- это ж старо как говно мамонта, его не рекомендовали использовать еще года четыре назад. cryptsetup, dmcrypt- вот современные решения. encfs же хорош для того, чтоб не ограничивать место для данных, и с другой стороны не занимать лишнее. truecrypt- единственный плюс-правдоподобное отрицание,в остальном не лучше/хуже dmcrypt

    ОтветитьУдалить
  14. > 3. Anyone having access to the source directory is able to see how many files are in the encrypted filesystem

    Меня это не смущает :) Главное, не заморачиваюсь с размером, и приходится синхронизировать не весь образ, а только изменённые данные. Зашифрованный том 2 Г по сети не погоняешь :)

    ОтветитьУдалить
  15. Кстати, в шифрованных папках винды не тока количество, но и названия файлов видны всем желающим. Такая вот защита :)

    ОтветитьУдалить
  16. Приветствую, Михаил! "В нашем полку прибыло!" (с) :)))
    Оч-ч-чень правильный подход: заюзать петлю!

    Посоветовал бы только (в преддверии наступления Б.Б. ;) ну, и для просвещения "новичков" джеймсов-бондов и прочих 007 ;)) при юзании подобной технологии создавать для себя набор скриптиков, которые однозначно и безошибочно выполняли бы нужные команды. И конечно поместить их в заветну папочку, типа SecurityTools или там НиктоНеДолженЗнатьЭТО! :)

    А набор команд необходим и достаточен такой: Создать, Подключить, Отключить, Уничтожить. ТОЧКА! Всё что нужно для собственного спокойствия держать у себя под рукой. Ну, и создано это будет истинно в Ъ юниксвэйном стиле :)))

    Хинт. Конечно, при нужде в интерактивном вводе параметров (начиная с пасспараша) можно как (а) ограничиться терминалом, так и пойти на *незначительные* затраты труда (тем кто умеет юзать шелл+граф.оболочки к gtk) заюзать (б) граф. расширение для получения приятной междумордочки, что вызовется при нужде ввода параметров для каждого этого скриптика. Тогда это почти... "коммерческая" ;) разработка! Но! "Просто, как всё гениальное"! :)

    Чуть-чуть оффтопа. По той же "петлевой" технологии подключают в ось ...горячие австралийские парни из команды Барри Коуэлера "сквашенный" ф/системы, несущие громоздкие пакеты -- типа опенофиса или там пакеты больших графических программ (начиная с гимпа и т.д.) -- очень правильный имхо путь! Сам юзаю это почти 4 года.

    Полезно это особенно в концепции нетбуков и ssd как носителей информации. Почему? это даже в одной статье трудновато описать кратко... Я надеюсь, Вам -то это объяснять не нуно.

    Прошу простить за этот как бы оффтопик... Или считайте это подсказкой материала для будущих статей Вашего замечательного блога, который я с удовольствием (увы "поздно" наткнувшись случайно) начал читать на днях.

    Успехов! Энди

    ОтветитьУдалить
  17. @Lion9 комментирует...
    Использую Truecrypt
    По мне так это overkill для личных нужд. Мне этот метод нравится простотой.

    @Vlsu комментирует...
    Хотя на практике шифрования не юзал, нет у меня ничего тайного
    Есть. Личные документы и всякие весёлые картинки можно истолковать по-разному.

    @GQ комментирует...
    В debian-russian был не так давно правильный тред
    О да, там же Рыцари Света и Правды. Всё знают, всё умеют, но никому от этого не легче. Включая их же дебиановской вики, за которую мне приходится краснеть (дебианщик, а пользуюсь либо Gentoo Wiki, либо Arch Wiki).

    надо использовать cryptsetup с форматом LUKS.
    Добавил в список альтернатив. Спасибо.


    @Анонимный комментирует...
    В репах (включая Sid) есть только юзерспейсная часть
    Шайтан... Я Анонимусу признаюсь по секрету: пост писался дома, а дома ноут с Ленни. Сквизи на работе, так что посыпаю голову пеплом.

    Ничего себе - просто и легко!
    Ну ёшкин свет, в Ленни действительно просто и легко. А со Сквизи я пролетел, это да :-)


    @Andrew Kravchuk комментирует...
    Вы, конечно, имели в виду xkcd
    Пофиксено, спасибо.


    @Анонимный комментирует...
    cryptoloop- это ж старо как говно мамонта
    Анонимус говорит, что софт старый, как будто в этом есть что-то плохое. Расскажите это поклонникам Фортрана, которому полвека, любителям латеха, которому за тридцать, и пользователям Матлаба, которому тоже не меньше 20 лет. Если оно старое, это не значит, что надо вышвырнуть и написать заново.

    cryptsetup, dmcrypt- вот современные решения
    Никто не спорит.

    encfs же хорош
    Ой ли?

    truecrypt- единственный плюс-правдоподобное отрицание
    Заваривать долго. :-)


    @Михаил Саушкин комментирует...
    Меня это не смущает
    Ну и зря. Когда придут ребята в штатском и спросят, что это за файл "10yroldlollypr0n" что будем отвечать? Что это про старые конфетки? %-)


    @Анонимный комментирует...
    Кстати, в шифрованных папках винды не тока количество, но и названия файлов видны всем желающим.
    Почему я не удивлен? Как там у них слоган-то был? "Микрософт! Вчерашние технологии - завтра! Переизобретаем колёса, начиная с 1982 года" :-)

    @Анонимный комментирует...
    "В нашем полку прибыло
    В общем, давно уже прибыло. Баян старый, сейчас вот выложил.

    создавать для себя набор скриптиков, которые однозначно и безошибочно
    Ой, Анонимус, ну муторно это. Если надо каждый день шифроваться, тогда да.

    По той же "петлевой" технологии подключают в ось ...горячие австралийские парни из команды Барри Коуэлера "сквашенный" ф/системы
    Анонимус, при всей моей склонности к англоязычной терминологии, образование прилагательных от английских слов я категорически не приветствую. Получается каша из рус+англ.

    По теме, если речь идёт про SquashFS, так автор давно в теме. Но отказался от этого, ибо разработчики SquashFS, эти бестолковые животные, по 10 раз меняют формат и собственно утилиты. Ковбои красноглазые...

    Или считайте это подсказкой материала для будущих статей
    Ммм... про SquashFS тут уже писалось не раз. На самом деле, оно удобно для LiveCD, и непригодно для архивирования (формат меняется). Ну и хотелось бы добавление возможности записи...

    ОтветитьУдалить
  18. Да, на правах обсуждения. Есть потребность делать сжатые блочные устройства (ну, типа файл, а там сжатая файловая система). Чтобы было чтение и, главное, запись на лету. Шифрование опционально. Лучше через loop, но FUSE тоже сойдёт. Интим и BTRFS не предлагать :-)

    Слышал про fuse-zip, но давно не слежу и не в курсе, как оно - до продакшена созрело, или только покрасноглазить на федоре? :-)

    ОтветитьУдалить
  19. > mknod /dev/loop8 c 7 8
    Loop - блочное устройство. Надо писать не 'c', а 'b'.

    ОтветитьУдалить
  20. @Дмитрий комментирует...
    Loop - блочное устройство. Надо писать не 'c', а 'b'.
    О, это я пропустил. Спасибо, что поправили. Исправлено в посте.

    ОтветитьУдалить
  21. Тоже использую трукрипт, в детали даже не вдаюсь. Файлик храню на флешке =).
    ps: omg, блоггеровская каптча бесполезна: комментаторам она мешает, спамерам нет =), Блоггер вообще и так спам сеет хорошо.

    ОтветитьУдалить
  22. Похоже, тут опечатка:
    при монтировании от размонтировании

    ОтветитьУдалить
  23. Ещё - похоже, потерялся перевод строки после
    "2. Форматирование зашифрованного раздела или файла"
    и прочих подразделов, упомянутых после указанного

    ОтветитьУдалить
  24. Кстати, прочитайте
    http://www.pustyshek.net/literature/articles/469-vzlom-sistem-shifrovaniya-zhestkih-diskov-pod-algoritmom-aes-s-ispolzovaniem-256-bitnyh-klyuchey.html
    и не очень надейтесь на надежность защиты.

    ОтветитьУдалить
  25. @aldous комментирует...
    блоггеровская каптча бесполезна: комментаторам она мешает, спамерам нет

    Неправда. Если я выключаю капчу, сюда лезет куча сеошников с большими членами :-) Кроме того, троллей тут и так полно, капча сдерживает их активность.

    Блоггер вообще и так спам сеет хорошо.
    Часто длинные комментарии попадают в спам, и их приходится вылавливать. Так что не совсем.

    @Ostrich's Poison комментирует...
    Похоже, тут опечатка:
    Точно. Исправил. Спасибо.

    Ещё - похоже, потерялся перевод строки после
    Поправил. Переводы строк, кстати, довольно часто слетают при правках.

    @Анонимный комментирует...
    и не очень надейтесь на надежность защиты.
    Анонимус, оно подразумевает доступ к машине. Если вы сидите в Гуантанамо с конфискованным ноутбуком и файлами lolli_pr0n.truecrypt, то поздно пить Боржоми :-)

    ОтветитьУдалить
  26. Так шифрование и должно спасать в случае наличия физического доступа к машине, иначе на фига оно вообще. В оригинале, кстати, и ролик- поливают память из баллончика для охлаждения, вырубают, суют в свой бук, грузят прогу для дампа памяти, затем для поиска ключей- и пожалте бриться. Менее чувствительна к такой атаке память с ЕСС, там очистка вроде как обязательна, чтобы заполнить корректными данными биты коррекции

    ОтветитьУдалить