eCryptfs


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

Общие сведения

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

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

Особенности архитектуры

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

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

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

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

Структура заголовка

Каждый индексный дескриптор eCryptfs соответствует индексному дескриптору нижележащей файловой системы и содержит криптографический контекст, связанный с ним. Этот контекст включает в себя:

  • Сессионный ключ шифрования
  • Флаг — шифрован или нет файл
  • Подписи аутентификационных токенов, связанных с этим файлом
  • Размеры экстентов

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

Работа с паролями

Чтобы избежать словарных атак на пароли, eCryptfs «солит» пароли аутентификации: пароль соединяется со строчкой «соли», затем сконкатенированная строчка итеративно хешируется (по умолчанию 65537 раз), чтобы сгенерировать идентификационную подпись, соответствующую паролю.

Работа с ключами

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

Сессионные ключи

Каждый файл получает сгенерированный случайным образом сессионный ключ, который используется для шифрования содержимого файла. eCryptfs хранит этот сессионный ключ в криптографических метаданных файла. Они, в свою очередь, хранятся у соответствующего пользователя. Когда приложение закрывает только что созданный файл, eCryptfs шифрует сессионный ключ ровно один раз для каждого аутентификационного токена, связанного с этим файлом, согласно правилам шифрования. Затем эти зашифрованные сессионные ключи записываются в заголовки соответствующих файлов. Когда позже приложение открывает зашифрованный файл, eCryptfs читает зашифрованные сессионные ключи и вытаскивает их из криптографического контекста файла. Затем система просматривает пользовательские аутентификационные токены, пытаясь найти соответствие с зашифрованными сессионными ключами. Используется первый найденный ключ для расшифровки сессионного ключа. В случае, когда ни один токен не подходит для расшифровки, система действует в соответствии с политикой работы. Следующим действием может быть, например, запрос к модулю PKI либо запрос на ввод пароля.

Используемые алгоритмы шифрования

Для шифрования используются следующие симметричные алгоритмы шифрования:

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