EncFS | |
---|---|
Тип | криптографическая[англ.] файловая система |
Разработчик | Valient Gough (Валент Гоф) |
Операционные системы | Linux, FreeBSD и macOS |
Первый выпуск | 2003[1] |
Последняя версия | |
Репозиторий | github.com/vgough/encfs |
Лицензия | GNU GPL |
Сайт | vgough.github.io/encfs/ |
EncFS — свободная криптографическая[англ.] файловая система, основанная на FUSE, прозрачно шифрующая файлы, используя произвольный каталог в качестве места для хранения зашифрованных файлов. Распространяется под лицензией GPL.
При монтировании EncFS указывается каталог-источник (исходный каталог с зашифрованными файлами) и точка монтирования. После монтирования каждому файлу в каталоге-точке монтирования соответствует определённый файл из зашифрованного каталога. Таким образом, в каталоге-точке монтирования представлены файлы каталога источника в незашифрованном виде. Файлы шифруются с помощью ключа, который в свою очередь хранится в том же каталоге, что и зашифрованные файлы, в зашифрованном виде. Пароль, вводимый пользователем с клавиатуры, служит для расшифровки этого ключа.
EncFS взаимодействует непосредственно с libfuse (интерфейс FUSE), библиотекой логирования и OpenSSL (библиотека шифрования). «Общение» с ядром происходит через FUSE.
Используемая библиотека OpenSSL предоставляет алгоритмы шифрования AES (16-байтный блочный шифр с длиной ключа 128—256 бит) и Blowfish (8-байтный блочный шифр с длиной ключа 128—256 бит). В ранних версиях (до 1.1) частично поддерживалась библиотека шифрования Botan. Шифрование происходит следующим образом:
Имена файлов шифруются и затем кодируются в 64-битную кодировку, параллельно избавляясь от символов «.» и «/». Есть возможность потокового (стандарт до версии 1.1) и блочного шифрования. 16-битный MAC используется как IV (инициализационный вектор) и приписывается спереди к зашифрованному имени, что позволяет рандомизировать результат шифрования (одинаковые имена файлов шифруются по-разному, так как при формировании инициализационного вектора используется весь путь к файлу).
Каждый экземпляр файловой системы EncFS использует случайно сгенерированный ключ (ключ тома). Этот ключ сохраняется зашифрованным с помощью вводимого пользователем пароля. И расшифровывается при введении пользователем пароля с клавиатуры. Это позволяет добиться следующих преимуществ:
Все операции чтения/записи в EncFS являются блочными. Размер блоков определяется пользователем при создании файловой системы и варьируется от 64 до 4096 байт. Маленький размер блоков уменьшает время произвольного доступа, но увеличивает число запросов при чтении/записи больших кусков файлов. Большой размер блоков способствует увеличению скорости обработки данных, но увеличивает время произвольного доступа. В отличие от реальных файловых систем большой размер блоков не приводит к потере дискового пространства (незаполненные до конца блоки не забиваются нулями).
При шифровании каждому блоку в файле добавляется заголовок MAC. Вплоть до последней версии EncFS включительно в качестве MAC’а используется 64-битный SHA-1. Таким образом, 512-байтный блок является 504 байтами зашифрованных данных и 8 байтами MAC’а.
Каждый экземпляр файловой системы EncFS содержит конфигурационный файл «.encfs%», где % — номер версии. В этом файле содержатся:
EncFS поддерживает основную семантику файловой системы за исключением следующего:
Основная реализация EncFS поддерживается операционными системами Linux, Mac OS X, FreeBSD. Под Windows существует несколько активно развивающихся реализаций[3][4][5][6].
Использование зашифрованных каталогов очень похоже на установку любой другой файловой системы под Linux. Создаётся реальный каталог со всеми вашими файлами, для примера, /home/user/crypt-raw. Необходимо также создать точку монтирования, пусть это будет /home/user/crypt. При обращении к этим каталогам следует убедиться, что используете абсолютные пути (не только/usr/bin/crypt).
Шифруются данные командой:
> encfs /home/user/crypt-raw /home/user/crypt
Volume key not found, creating new encrypted volume.
Password:
Verify:
Когда шифрование завершилось, обращаться к файлам можно используя каталог crypt. После завершения работы можно использовать команду:
> fusermount -u /home/user/crypt
Эта команда отмонтирует каталог crypt, оставляя crypt-raw в зашифрованном виде.
EncFS имеет ряд преимуществ над другими системами шифрования разделов жёсткого диска, потому что каждый файл отдельно шифруется и сохраняется как обычный файл.
При создании нового EncFS каталога доступны различные опции.
EncFS может использовать любые алгоритмы шифрования, которые можно найти в системе. Обычно доступны Blowfish и AES.
Если алгоритм шифрования позволяет выбрать длину ключа, это можно сделать и при использовании его в EncFS.
Каждый файл шифруется поблочно и эта опция позволяет выбрать размер блока. При чтении хотя бы одного байта из зашифрованного файла расшифровывается весь блок. Также при записи блок сначала расшифровывается целиком, а потом зашифровывается обратно.
По умолчанию размер блока равен 512, чего достаточно в большинстве случаев.
В отличие от содержимого зашифрованных файлов, имена файлов могут быть зашифрованы блочным или поточным шифром. Блочный шифр позволяет скрывать точную длину имён файлов, тогда как поточный показывает её точь-в-точь, экономя при этом место на носителе (хоть и незначительное).
Данная опция позволяет шифровать одинаковые имена файлов, находящихся в разных каталогах, по-разному, исходя из полного пути к файлу.
Однако, если родительский каталог будет переименован, то все нижележащие файлы и каталоги будут также переименованы. Это может быть довольно ресурсозатратной операцией. Поэтому не рекомендуется использовать эту опцию, если предполагается частое переименование каталогов большой вложенности.
Если опция включена, то каждый файл шифруется с произвольным 8-байтовым инициирующим вектором, который располагается внутри зашифрованного файла. Если опция отключена, то каждый файл шифруется одним и тем же инициирующим вектором, который может сделать ключ менее стойким к взлому.
Включение этой опции делает файловую систему более защищённой ценой добавления всего лишь 8 байт к каждому файлу.
Позволяет шифровать содержимое одинаковых блоков различных файлов по-разному, исходя из полного пути к файлу.
Соответственно, изменение пути к файлу будет менять и его зашифрованное содержимое.
Позволяет хранить контрольную сумму каждого зашифрованного блока, чтобы повреждение или модификация зашифрованного файла могли быть детектированы EncFS. Контрольная сумма — это 8 байт, добавляемых к каждому блоку. Можно использовать ещё 8 дополнительных произвольных байтов, чтобы два одинаковых открытых блока имели разную контрольную сумму.
Эта опция накладывает дополнительные расходы на CPU, так как каждый блок должен быть проверен на соответствие своей контрольной сумме при каждом чтении или записи.
Если зашифрованная файловая система не использовалась некоторое время (несколько минут), то она может быть автоматически размонтирована. Размонтирование не будет происходить, если открыт хотя бы один файл, даже на чтение.
Сравнение проводилось с файловыми системами CryptoFS (также основанной на FUSE) и LUKS (реализованной на уровне ядра). Файловые системы CryptoFS и EncFS показывают лучшую производительность при размере файла и записи, близком к «родному» размеру страницы Linux-систем (4096 Кбайт). Результаты обеих userspace-систем существенно отстают от результатов шифрования LUKS, как и предполагалось. Действительно, использование различных абстракций FUSE и криптографических систем накладывает дополнительную задержку на все операции чтения и записи. Однако, производительность EncFS оказалась несколько выше производительности CryptoFS[7].