eCryptfs

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
eCryptfs
Тип Файловая система, Шифрование
Авторы Michael Halcrow, IBM Linux Technology Center, Erez Zadok
Написана на C
Операционная система Linux
Первый выпуск 30 ноября 2006; 17 лет назад (2006-11-30)
Аппаратная платформа Linux kernel
Последняя версия 111 (2 мая 2016; 8 лет назад (2016-05-02))
Лицензия GPL v2+
Сайт ecryptfs.org

eCryptfs — POSIX-совместимая многоуровневая криптографическая файловая система в ядре Linux (появилась в версии ядра 2.6.19).

Общие сведения[править | править код]

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

eCryptfs реализована в виде модуля ядра Linux, дополненная различными утилитами для работы с ключами. Этот модуль производит шифрование содержимого файлов, используя криптографическое API ядра. Модуль хранения ключей вытягивает информацию из заголовков отдельных файлов и отправляет эти данные в приложение, осуществляющее шифрование. На основе полученной информации определяются правила шифрования, согласно которым принимается решение о дальнейших действиях (например, предложить пользователю ввести пароль или расшифровать сессионный ключ с помощью закрытого ключа).

Особенности архитектуры[править | править код]

В основе eCryptfs лежит формат файла OpenPGP, описанный в RFC2440[1]. При этом, чтобы сохранить возможность произвольного доступа к данным в файле, разработчики отклонились от стандарта. Согласно формату OpenPGP, операции шифрования и расшифрования должны производиться над всем содержимым файла. Это приводит к тому, что нельзя прочитать ни одного байта из файла до тех пор, пока он не расшифрован полностью. Чтобы обойти эту проблему и не ухудшить безопасность системы, eCryptfs разбивает данные на экстенты. По умолчанию, эти куски имеют размер страницы файловой системы (задается в ядре, как правило, это 4096 байт). Чтобы прочитать данные из одного куска, его нужно полностью расшифровать, а чтобы записать данные в блок, нужно шифровать весь блок.

Архитектура системы eCryptfs

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

Схема разбиения файла на экстенты и шифрования, применяемая в файловой системе eCryptfs

Реализация шифрования на уровне файловой системы и хранение криптографических данных вместе с самими файлами несёт определённые преимущества:

  • Ключи шифрования можно прикреплять к отдельным файлам, а не к каталогу или файловой системе в целом.
  • Инкрементальные бэкап-утилиты могут корректно работать с файлами без доступа к их расшифрованному содержимому.
  • Увеличение производительности. В большинстве случаев надо шифровать только некоторые файлы. Так, например, библиотеки и исполняемые файлы, как правило, в шифровании не нуждаются.
  • Файлы можно свободно переносить с одного устройства на другое без каких-либо преобразований.

Структура заголовка[править | править код]

Каждый индексный дескриптор 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 в данный момент безопасна для использования. Тем не менее, она нуждается в дополнительных исследованиях касательно безопасности, так как была разработана не специалистом в области криптографии.

См. также[править | править код]

Примечания[править | править код]

  1. Donnerhacke, Lutz, Callas, Jon. OpenPGP Message Format. tools.ietf.org. Дата обращения: 30 октября 2015. Архивировано 16 ноября 2015 года.
  2. Алгоритмы шифрования в ECryptfs. Дата обращения: 19 сентября 2018. Архивировано 19 сентября 2018 года.
  3. eCryptfs Security Audit. defuse.ca. Дата обращения: 30 октября 2015. Архивировано 17 ноября 2015 года.

Ссылки[править | править код]