eCryptfs
eCryptfs | |
---|---|
Тип | Файловая система, Шифрование |
Авторы | Michael Halcrow, IBM Linux Technology Center, Erez Zadok |
Написана на | C |
Операционная система | Linux |
Первый выпуск | 30 ноября 2006 |
Аппаратная платформа | Linux kernel |
Последняя версия | 111 (2 мая 2016 ) |
Лицензия | GPL v2+ |
Сайт | ecryptfs.org |
eCryptfs — POSIX-совместимая многоуровневая криптографическая файловая система в ядре Linux (появилась в версии ядра 2.6.19).
Общие сведения
Отличие eCryptfs от большинства других криптографических файловых систем в том, что все криптографические мета-данные хранятся внутри зашифрованного файла. Это позволяет перемещать такие файлы через доверенные каналы, сохраняя возможность авторизованным лицам получить доступ к содержимому файлов.
eCryptfs реализована в виде модуля ядра Linux, дополненная различными утилитами для работы с ключами. Этот модуль производит шифрование содержимого файлов, используя криптографическое API ядра. Модуль хранения ключей вытягивает информацию из заголовков отдельных файлов и отправляет эти данные в приложение, осуществляющее шифрование. На основе полученной информации определяются правила шифрования, согласно которым принимается решение о дальнейших действиях (например, предложить пользователю ввести пароль или расшифровать сессионный ключ с помощью закрытого ключа).
Особенности архитектуры
В основе eCryptfs лежит формат файла OpenPGP, описанный в RFC2440[1]. При этом, чтобы сохранить возможность произвольного доступа к данным в файле, разработчики отклонились от стандарта. Согласно формату OpenPGP, операции шифрования и расшифрования должны производиться над всем содержимым файла. Это приводит к тому, что нельзя прочитать ни одного байта из файла до тех пор, пока он не расшифрован полностью. Чтобы обойти эту проблему и не ухудшить безопасность системы, eCryptfs разбивает данные на экстенты. По умолчанию, эти куски имеют размер страницы файловой системы (задается в ядре, как правило, это 4096 байт). Чтобы прочитать данные из одного куска, его нужно полностью расшифровать, а чтобы записать данные в блок, нужно шифровать весь блок.
Каждый блок обладает своим уникальным вектором инициализации. Несколько векторов инициализации хранятся в блоке, стоящем перед несколькими последующими блоками с данными. Когда данные записываются в блок, соответствующий вектор инициализации в блоке таких векторов обновляется и перезаписывается до начала шифрования блока. Блоки шифруются блочным шифром, выбранным на основе правил, соответствующих данному файлу, в режиме сцепления блоков шифротекста.
Реализация шифрования на уровне файловой системы и хранение криптографических данных вместе с самими файлами несёт определённые преимущества:
- Ключи шифрования можно прикреплять к отдельным файлам, а не к каталогу или файловой системе в целом.
- Инкрементальные бэкап-утилиты могут корректно работать с файлами без доступа к их расшифрованному содержимому.
- Увеличение производительности. В большинстве случаев надо шифровать только некоторые файлы. Так, например, библиотеки и исполняемые файлы, как правило, в шифровании не нуждаются.
- Файлы можно свободно переносить с одного устройства на другое без каких-либо преобразований.
Структура заголовка
Каждый индексный дескриптор eCryptfs соответствует индексному дескриптору нижележащей файловой системы и содержит криптографический контекст, связанный с ним. Этот контекст включает в себя:
- Сессионный ключ шифрования
- Флаг — шифрован или нет файл
- Подписи аутентификационных токенов, связанных с этим файлом
- Размеры экстентов
eCryptfs может кэшировать криптографический контекст каждого файла, чтобы ускорить работу системы.
Работа с паролями
Чтобы избежать словарных атак на пароли, eCryptfs «солит» пароли аутентификации: пароль соединяется со строчкой «соли», затем сконкатенированная строчка итеративно хешируется (по умолчанию 65537 раз), чтобы сгенерировать идентификационную подпись, соответствующую паролю.
Работа с ключами
eCryptfs работает максимально прозрачно для всех приложений, которые работают с шифрованными файлами. В большинстве случаев, когда контроль доступа не может быть полноценно обеспечен хостом, тот факт, что файл зашифрован, не должен быть проблемой для пользователя. Шифрование по определению должно обеспечить целостность и конфиденциальность информации, и система решает эти задачи, используя пользовательские аутентификационные данные для генерации ключей и доступа к содержимому.
Сессионные ключи
Каждый файл получает сгенерированный случайным образом сессионный ключ, который используется для шифрования содержимого файла. eCryptfs хранит этот сессионный ключ в криптографических метаданных файла. Они, в свою очередь, хранятся у соответствующего пользователя. Когда приложение закрывает только что созданный файл, eCryptfs шифрует сессионный ключ ровно один раз для каждого аутентификационного токена, связанного с этим файлом, согласно правилам шифрования. Затем эти зашифрованные сессионные ключи записываются в заголовки соответствующих файлов. Когда позже приложение открывает зашифрованный файл, eCryptfs читает зашифрованные сессионные ключи и вытаскивает их из криптографического контекста файла. Затем система просматривает пользовательские аутентификационные токены, пытаясь найти соответствие с зашифрованными сессионными ключами. Используется первый найденный ключ для расшифровки сессионного ключа. В случае, когда ни один токен не подходит для расшифровки, система действует в соответствии с политикой работы. Следующим действием может быть, например, запрос к модулю PKI либо запрос на ввод пароля.
Используемые алгоритмы шифрования
Для шифрования используются следующие симметричные алгоритмы шифрования[2]:
- AES с размером блока — 16; размер ключа в байтах — 16, 32
- Blowfish с размером блока 8; размер ключа в байтах — 16, 56
- DES3_EDE с размером блока 8; размер ключа в байтах — 24
- Twofish с размером блока 16; размер ключа в байтах — 16, 32
- CAST6 с размером блока 16; размер ключа в байтах — 16, 32
- CAST5 с размером блока 8; размер ключа в байтах — 5, 16
Дополнительные утилиты
В eCryptfs интегрированы несколько инструментов, облегчающих работу с системой.
Подключаемые модули аутентификации
Подключаемый модуль аутентификации (англ. pluggable authentication module, PAM) обеспечивает механизм, помогающий администратору определить, как конечные пользователи будут аутентифицироваться. PAM получает пароль пользователя и сохраняет его в пользовательских данных. Хранится пароль в виде несоленого аутентификационного токена. Преимущество этой системы в гибкости. Так, аутентификацию при помощи пароля можно без проблем заменить на аутентификацию с помощью USB-ключа.
Интерфейс PKI
eCryptfs обеспечивает настраиваемую PKI (Public Key Infrastructure). Модуль PKI принимает на вход ключи и данные и возвращает шифрованные либо расшифрованные данные.
Безопасность системы
В 2014 году сайтом DefuseSec проведен аудит[3] eCryptfs (почти одновременно с аудитом системы EncFS). Согласно его результатам, система eCryptfs в данный момент безопасна для использования. Тем не менее, она нуждается в дополнительных исследованиях касательно безопасности, так как была разработана не специалистом в области криптографии.
См. также
Примечания
- ↑ Donnerhacke, Lutz, Callas, Jon. OpenPGP Message Format . tools.ietf.org. Дата обращения: 30 октября 2015. Архивировано 16 ноября 2015 года.
- ↑ Алгоритмы шифрования в ECryptfs . Дата обращения: 19 сентября 2018. Архивировано 19 сентября 2018 года.
- ↑ eCryptfs Security Audit . defuse.ca. Дата обращения: 30 октября 2015. Архивировано 17 ноября 2015 года.
Ссылки
- Официальный сайт eCryptfs
- Halcrow, Michael Austin: «eCryptfs: An Enterprise-class Encrypted Filesystem for Linux» (PDF) Proc. Linux Symposium
- Использование eCryptfs: настройка шифрования в ArchLinux