eCryptfs (Enterprise Cryptographic File System)

eCryptfs
ECryptfs-logo.png
Создатели: Michael Halcrow, IBM Linux Technology Center, Erez Zadok, Michael Halcrow
Выпущена: 30 November 2006 года; 15 years ago (2006-11-30)
Постоянный выпуск: 106 / 11 March 2015 года; 7 years ago (2015-03-11)
Состояние разработки: Active
Написана на: C
Операционная система: Linux
Платформа: Linux kernel
Тип ПО: filesystem, encryption
Лицензия: GPL v2+
Веб-сайт ecryptfs.org

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

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

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

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

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

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

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

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

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

Установка

Всё, что нужно для работы eCryptfs, во всех современных Linux-дистрибутивах имеются по умолчанию «из коробки». Если же ядро Linux вы собирали самостоятельно, то удостоверьтесь, что в вашей сборке присутствует необходимый модуль:

 modprobe ecryptfs && lsmod | grep crypts

Далее, для работы с eCryptfs нам понадобятся userspace-инструменты, которые в Debain/Ubuntu легко устанавливаются из пакета:

 apt-get install ecryptfs-utils

Монтирование

Чтобы лучше понять и увидеть на практике, как работает eCryptfs, смонтируем какой-нибудь каталог и посмотрим, что происходит в реальности. Для начала создадим пустой каталог, который будем шифровать:

 mkdir /mnt/ecryptfs-demo

Теперь смонтируем созданный каталог используя eCryptfs:

 mount -t ecryptfs /mnt/ecryptfs-demo/ /mnt/ecryptfs-demo/

Обратите внимание, что исходным и целевым каталогом команде mount указан один и тот же каталог. Это несколько «нетрадиционно» для операции монтирования, однако вполне допустимо и удобно. Если вас это запутывает, вы можете использовать разные точки с более осмысленными именами, вроде:

 mount -t ecryptfs /mnt/plaintext/ /mnt/encrypted/

После ввода команды вам необходимо ввести пароль для ключа шифрования:

 Passphrase:

Введите пароль, не забывая о том, что его утеря будет означать невозможность получения данных! После ввода пароля вам будет предложено выбрать алгоритм шифрования, с по-умолчанию выбранным AES:

 Select cipher:
 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 2) blowfish: blocksize = 16; min keysize = 16; max keysize = 56 (not loaded)
 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 (not loaded)
 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 (not loaded)
 Selection [aes]:

Далее вам необходимо выбрать размер ключа:

 Select key bytes:
 1) 16
 2) 32
 3) 24
 Selection [16]:

Значением следующей опции вы разрешаете или запрещаете доступ к файлам, которые не были зашифрованы при помощи eCrypfs:

 Enable plaintext passthrough (y/n) [n]:

Шифровать или нет имена файлов:

 Enable filename encryption (y/n) [n]:

Далее вы увидите сводку выбранных опций (их можно использовать в опциях монтирования в будущем):

Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=8f9887d2339cafb0

Если вы впервые монтируете и/или сигнатура этого монтирования не сохранена в кэше, то вас вежливо предупредят о том, что вы могли ввести пароль неверно:

 WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
 it looks like you have never mounted with this key
 before. This could mean that you have typed your
 passphrase wrong.

Если всё ок, можно подтверждать монтирование:

 Would you like to proceed with the mount (yes/no)? : yes

Чтобы избежать в будущем появления вышеуказанного предупреждения, вы можете добавить сигнатуру монтирования eCryptfs в файл:

 Would you like to append sig [8f9887d2339cafb0] to
 [/root/.ecryptfs/sig-cache.txt]
 in order to avoid this warning in the future (yes/no)? : yes

Если всё прошло успешно, вы получите соответствующее сообщение:

 Successfully appended new sig to user sig cache file
 Mounted eCryptfs

Теперь скопируем что-нибудь в смонтированный каталог:

 cp /etc/passwd /mnt/ecryptfs-demo/

Посмотрим его содержимое и размер:

 cat /mnt/ecryptfs-demo/passwd
...
  file /mnt/ecryptfs-demo/passwd
 /mnt/ecryptfs-demo/passwd: ASCII text
 
 ls -l /mnt/ecryptfs-demo/passwd
 -rw-r--r-- 1 root root 911 Feb  7 01:18 /mnt/ecryptfs-demo/passwd

Теперь отмонтируем eCryptfs и посмотри, как изменился наш файл:

 umount /mnt/ecryptfs-demo/
 
 file /mnt/ecryptfs-demo/passwd
 /mnt/ecryptfs-demo/passwd: data
 
 ls -l /mnt/ecryptfs-demo/passwd
 -rw-r--r-- 1 root root 12288 Feb  7 01:18 /mnt/ecryptfs-demo/passwd

Заглянув же вовнутрь файла, вы увидите там лишь двоичные данные.

Применение

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

 $ mv ~/.mozilla ~/Private/mozilla
 $ ln -s ~/Private/mozilla ~/.mozilla

Удаление

Удаление зашифрованой папки производится после её размонтирования. Если содержащиеся в ней файлы нужно сохранить, то это делается перед её разминированием.

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

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

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

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

Примечания

Источники

Ссылки