Шифрование в EXT4. How It Works?
1. Как это работает
Для начала необходимо освоить несколько полезных команд
Форматирование тома с опцией шифрования
Включение опции шифрования на существующий том
Создание ключа шифрования
При создании ключа том с поддержкой шифрования должен быть примонтирован, иначе e4crypt выдаст ошибку “No salt values available”. Если примонтировано несколько томов с опцией encrypt, то будут созданы ключи для каждого. Утилита e4crypt входит в состав e2fsprogs.
Ключи добавляются в Linux Kernel Keyring [1].
Чтение списка ключей
Ключи, используемые для шифрования, имеют тип “logon”. Содержимое (payload) ключей такого типа недоступно из пространства пользователя — keyctl команды read, pipe, print вернут ошибку. В данном примере у ключа префикс “ext4”, но может быть и “fscrypt”. Если keyctl отсутствует в системе, то необходимо установить пакет keyutils.
Создание зашифрованной директории
Здесь в команду set_policy передается дескриптор созданного ключа без указания префикса (ext4) и типа (logon). Одним и тем же ключом можно зашифровать несколько директорий. Для шифрования разных директорий можно использовать разные ключи. Чтобы узнать, каким ключом зашифрована директория, необходимо выполнить команду:
Установить другую политику безопасности на зашифрованную директорию не получится:
Зато такую директорию можно беспрепятственно удалить:
Имена файлов в директории и содержимое файла будут доступны, пока в хранилище ключей существует ключ, которым была зашифрована директория. После аннулирования ключа доступ к директории будет сильно ограничен:
Ключ аннулирован, читаем содержимое директории:
Имя файла уже абырвалг. Но всё-таки попробуем прочитать файл:
NOTE: в Ubuntu 17.04 (kernel 4.10.0-19) директория остается доступной после удаления ключа до перемонтирования.
Директория зашифрована ключом с дескриптором “8e679e4449bb9235”. Ключ отсутствует в хранилище. Несмотря на это, директория и содержимое файла в свободном доступе.
2. Изменения в файловой системе
В Суперблоке: набор опций s_feature_incompat на томе с поддержкой шифрования содержит флаг EXT4_FEATURE_INCOMPAT_ENCRYPT,
s_encrypt_algos[4] — хранит алгоритмы шифрования; на данный момент это:
s_encrypt_algos[0] = EXT4_ENCRYPTION_MODE_AES_256_XTS;
s_encrypt_algos[1] = EXT4_ENCRYPTION_MODE_AES_256_CTS;
s_encrypt_pw_salt — также задается при форматировании.
В айноде: i_flags содержит флаг EXT4_ENCRYPT_FL и именно по нему можно определить, что объект зашифрован.
Структура зашифрованной директории
Чтобы прочитать содержимое директории, нужно по ее айноду определить ее местоположение на диске.
1. Определение номера айнода:
2. Поиск айнода в таблице айнодов.
Айнод 14 принадлежит 0-й группе, поэтому необходимо прочитать таблицу дескрипторов 0-й группы и найти в ней номер блока таблицы айнодов. Таблица дескрипторов 0-й группы находится в кластере, следующим за суперблоком:
Рис. 1. Таблица дескрипторов 0-й группы
Вначале пропускаем номера кластеров битмапа блоков и битмапа айнодов, номер кластера начала таблицы айнодов читаем по смещению 8 байт от начала таблицы — 0x00000424 (1060) в BigEndian формате. Айнод директории = 14, при размере айнода в 256 байт в таблице он будет находиться по смещению 0x0D00 от ее начала. Таким образом, достаточно прочитать только 1-й кластер таблицы айнодов:
Рис. 2. Айнод зашифрованной директории.
В айноде определяем начало поля i_block[]. Т.к. это ext4, то в первых 2 байтах i_block находится заголовок дерева экстентов — 0xF30A. Далее можно увидеть номер блока, в котором хранится зашифрованная директория — 0x00000402 (1026). (На рисунке выделено не всё поле i_block, а только информативные 24 байта — остальные 36 байт заполнены нулями.)
3. Чтение блока директории:
Рис. 3. Дамп зашифрованной директории.
Подробнее: первые две entry (выделены красным) — это записи “.” и “..”, соответственно, текущая и родительская директории. У текущей директории айнод 0x0000000E, длина записи 0x000C байт, количество символов в имени файла — 01 и тип entry 02 — это директория. Далее следует имя директории, выровненное по 4-байтовой границе — 2E000000 (2E соответствует символу ‘.’ — точка).
Следующая, родительская директория, имеет айнод 0x00000002 (корневая директория), аналогичная длина записи 0x000C, в имени 02 символа, тип также 02, после чего идет имя директории — 2E2E0000 (две точки).
Наконец, последняя entry в данной директории имеет айнод 0x0000000F, размер записи 0x0FDC, количество символов в имени 0x10, тип 01 — это и есть зашифрованный файл. Как видно его имя не соответствует созданному my_secrets.txt. К тому же, в исходном имени файла всего 14 символов, а не 16 как здесь.
NOTE: особенно внимательные читатели с калькулятором могли заметить, что т.к. зашифрованный файл является последней entry в директории, то его размер записи должен ссылаться на границу блока. Однако, 0x1000 — 0xC — 0xC = 0xFE8, а не 0xFDC. Это связано с тем, что том создавался с опцией “metadata_csum”, которая задается по умолчанию, начиная с Ubuntu 16.10. При включении этой опции в конце каждого блока директории создается 12-байтовая структура, содержащая контрольную сумму этого блока.
4. Чтение зашифрованного файла.
Из дампа директории определяем, что файл имеет айнод 15 (0xF). Ищем его в таблице айнодов и аналогично определяем его положение на диске:
Рис. 4. Айнод зашифрованного файла.
Читаем содержимое кластера 0x0000AA00 (43520)
Рис. 5. Содержимое зашифрованного файла
И это совсем не соответствует записанной в файл информации. Настоящий размер файла можно прочитать в поле i_size айнода (отмечен синим прямоугольником на рис. 4): 0x00000017 — именно столько было записано командой echo “My secret file content” + символ перевода строки 0x0A.
3. Расшифровка
Расшифровка имени файла
Согласно EXT4 Encryption Design Document [2] расшифровка имен файлов выполняется в два этапа:
1. DerivedKey = AES-128-ECB(data=MasterKey, key=DirNonce);
2. EncFileName = AES-256-CBC-CTS(data=DecFileName, key=DerivedKey);
Т.е. на первом этапе надо получить ключ для расшифровки. Для этого используются данные Мастер-ключа, созданного при добавлении ключа в keyring, которые шифруются по AES-ECB 128-битным ключом DirNonce. На втором этапе используется фиксированный вектор инициализации (IV), заполненный нулями. Для AES-ECB вектор инициализации не нужен.
Что такое DirNonce? В айноде зашифрованной директории есть extended attribute.
Рис. 6. Айнод зашифрованной директории и его extended attribute
При размере айнода в 256 байт в структуре остается около сотни неиспользуемых байт (0x100 — EXT2_GOOD_OLD_INODE_SIZE — i_extra_size), в которых можно хранить информацию (красная область на рис. 6). Как видно по заголовку 0xEA020000 в первых четырех байтах этой области, здесь хранится extended attribute с индексом 09, данные которого смещены на 0x40 байт от заголовка и имеют размер 0x1C. Область данных поделена на 3 зоны: в первой (01 01 04 00) записаны алгоритмы, по которым был зашифрован айнод. Во второй — хранится 8 байт (8E 67 9E 44 49 BB 92 35), повторяющие дескриптор ключа. В третьей — содержится 16-байтовый одноразовый код (нонс [3]), используемый при шифровании Мастер-ключа.
Таким образом, для расшифровки имени файла, необходимо:
1) прочитать значение безымянного extended attribute директории с индексом 9 — получаем нонс директории;
2) по алгоритму AES-ECB зашифровать данные Мастер-ключа, используя в качестве ключа 128 бит нонса директории;
3) по алгоритму AES-CBC-CTS расшифровать имя файла, используя в качестве ключа первые 256 бит (половину) ключа, полученного на предыдущем этапе.
Расшифровка содержимого файла
Выполняется аналогично процедуре расшифровки имени файла, за исключением того, что в качестве нонса используется значение extended attribute, полученное из айнода файла. И вместо CBC содержимое дешифруется по алгоритму AES-XTS с полным 64-байтовым ключом. В качестве IV используется Logical Block Offset относительно начала файла
Рис. 7. Айнод зашифрованного файла и его extended attribute.
Сравнивая значение extended attribute зашифрованного файла и директории, можно заметить, что их нонсы различаются, в то время как алгоритмы шифрования и дескрипторы ключей совпадают (желтая и синяя зоны на рисунках).
Содержимое файлов шифруется постранично, поэтому для расшифровки контента обязательно использовать целый кластер файла (4K), а не размер, указанный в поле i_size айнода.
Реализация дешифратора выполнена на основе Linux Kernel Crypto API [4]. В цепочке используется два вида шифраторов в зависимости от того, что прописано в /proc/crypto для алгоритмов ebc(aes), cts(cbc(aes)), xts(aes). Рассматриваем ядро 4.10.0-19: шифр ebc реализуется через blkcipher, cts(cbc) и xts — через skcipher:
$ cat /proc/crypto
name: ecb(aes)
driver: ecb(aes-aesni)
module: kernel
priority: 300
internal: no
type: blkcipher
blocksize: 16
min keysize: 16
max keysize: 32
ivsize: 0
geniv: default
name: cts(cbc(aes))
driver: cts(cbc-aes-aesni)
module: kernel
priority: 400
internal: no
type: skcipher
async: yes
blocksize: 16
min keysize: 16
max keysize: 32
ivsize: 16
chunksize: 16
name: xts(aes)
driver: xts-aes-aesni
module: aesni_intel
priority: 401
internal: no
type: skcipher
async: yes
blocksize: 16
min keysize: 32
max keysize: 64
ivsize: 16
chunksize: 16
NOTE: В версиях ядра младше 4.4 отсутствует функция user_key_payload. Данные ключа можно прочитать непосредственно из struct key* keyring_key.
Расшифровка имени файла
Для упрощения опущена работа с памятью. Предположим, 2 x PAGE_SIZE нам дали на стеке.
Используемые заголовочные файлы (актуально для 4.10.0-19)
5. Результаты
Закодированное имя файла enc_file_name получено из дампа директории (рис. 3).
Нонс директории nonce_dir получен из дампа айнода директории (рис. 6)
Нонс файла nonce_file получен из дампа айнода файла (рис. 7)
Мастер-ключ показан здесь полностью для наглядности. Его можно получить при отладке e4crypt:
Источник
Шифрованные файловые системы
В наши дни особой важности набирает защита данных и личной информации. С помощью информации и файлов, которые хранятся на компьютере можно узнать очень многое о человеке, который этим компьютером пользуется. Поскольку там могут быть не только ненужные данные, но логины, пароли или просто токены доступа к различным сетевым ресурсам.
Для защиты информации от несанкционированного доступа при физическом контакте с вашим устройством можно использовать шифрование и шифрованные файловые системы. Такой метод дает достаточно большую надежность и прост в использовании, разве что во время монтирования нужно вводить пароль. Еще один вариант — это передача файлов через интернет. Такие данные тоже лучше шифровать. В этой статье мы рассмотрим самые популярные шифрованные файловые системы, которые вы можете использовать для обеспечения безопасности ваших файлов.
Шифрованные файловые системы
Сначала разберем самодостаточные файловые системы, которые часто используются в Linux и среди прочего имеют функцию шифрования данных. Затем поговорим о файловых системах, разработанных только для шифрования.
1. ZFS
ZFS — это одна из самых интересных и перспективных файловых систем. Ее разработка началась еще в компании Sun Microsystems в 90 годах. Затем она прошла очень долгий путь развития и стала файловой системой с открытым исходным кодом. В этой файловой системе одной из первых появились такие возможности, как создание логических томов, снапшотов и многое другое. Изначально файловая система разрабатывалась для Solaris, но потом была портирована и для Linux. Шифрование в Linux версию было добавлено недавно.
Как и другие операции с файловой системой, шифрование можно выполнить даже для примонтированого раздела. Поддерживаются такие режимы шифрования, как AES (Advanced Encryption Standard) с длинной ключа 128, 192 и 256 бит. Но стоит отметить, что таким образом вы не можете зашифровать системный раздел. Можно выполнять шифрование без прав суперпользователя, и даже можно настроить политику шифрования для файлов, но отключить ее от обычного пользователя нельзя.
2. Ext4
Ext4 — это одна из самых популярных файловых систем, используемых в дистрибутивах Linux. Она применяется по умолчанию в большинстве дистрибутивов. Эта файловая система изначально разрабатывалась для Linux и с самого начала была включена в ядро. На данный момент это самая стабильная файловая система, в нее достаточно редко вносятся крупные изменения, а последний серьезный выпуск был в 2006 году, хотя новые функции добавляются постоянно.
Поддержка шифрования в файловой системе появилась тоже относительно недавно, начиная с ядра версии 4.1. Реализацией этой функции занималась компания Google, вероятно для своего Android. Здесь, также как и в предыдущем варианте можно настроить шифрование как для раздела целиком, так и для папок. Каждый файл шифруется собственным ключом, который генерируется на основе главного ключа. Поддерживается шифрование имен файлов и символических ссылок. Пока что для шифрования можно использовать алгоритмы AES-256 и AES-256 CBC+CTS. В отличие от ZFS, в ext4 можно использовать шифрование для корневого раздела.
3. F2FS
Файловая система F2FS известна как файловая система, адаптированная для работы на флеш накопителях и SSD дисках. Она содержит ряд оптимизаций, которые уменьшают число перезаписей диска, чем повышают срок его службы. Поддержка шифрования в F2FS появилась примерно тогда же, когда и в ext4, в ядре Linux 4.2. Из алгоритмов шифрования поддерживается AES-256.
4. CryFS
CryFS была разработана специально для шифрования. Файловая система позволяет скрывать не только данные, но и такую информацию, как размер файлов, метаданные и структуру каталогов. Файлы разбиваются на небольшие блоки фиксированного размера, которые используются по отдельности, независимо один от другого. Для запоминания размещения блоков используется древовидная структура. Метаданные и каталоги тоже записываются в зашифрованные блоки. Такой подход позволяет использовать шифрование с минимальными потерями производительности.
Эта шифрованная файловая система может использоваться поверх любой другой файловой системы. Каждый блок хранится в виде отдельного файла в базовом каталоге, эти файлы можно синхронизировать, например, в облачное хранилище. По умолчанию используется AES-256-GCM.
5. EncFS
EncFS — это еще одна шифрованная файловая система, основанная на FUSE. Как и в предыдущем случае зашифрованные файлы будут хранится в любой файловой системе, а для доступа к ним нужно использовать EncFS. При монтировании вы указываете директорию-источник и фразу-пароль, с помощью которой будут расшифрованы файлы. Зашифрованные файлы будут храниться как есть, без дополнительных изменений. Эта файловая система довольно старая и не использует современные практики шифрования. Поэтому на данный момент она считается небезопасной и была удалена из официальных репозиториев многих дистрибутивов.
6. eCryptfs
eCryptfs — это полноценная файловая система, предназначенная для шифрования. Она встроена в ядро Linux начиная с версии 2.6. Для шифрования используется стандарт OpenPGP, с несколькими модификациями. Каждый файл разделен на так называемые экстенты, части, которые могут быть расшифрованы независимо одна от одной, что позволяет реализовать произвольный доступ. Все метаданные файловой системы зашифрованы и находятся в отдельном файле. Это позволяет передавать данные через сеть.
7. LessFS
LessFS — файловая система, очень похожая по возможностях на Btrfs. Она позволяет оптимизировать дубли файлов, поддерживает сжатие и шифрование. LessFS основана на Fuse, а это значит, что нет необходимости модифицировать ядро. Поддерживается сжатие LZO, OuickLZ и Bzip. Из алгоритмов шифрования поддерживается AES.
8. GocryptFS
Это шифрованная файловая система, написанная на Go и основанная на FUSE. Она работает аналогично EncFS, только не содержит её уязвимостей и проблем с безопасностью. Впервые она появилась в 2015 году. Файловая система шифрует каждый файл отдельно, поэтому её можно использовать для загрузки шифрованных файлов в облака. Для шифрования используется алгоритм AES-GCM, а для шифрования имен файлов — алгоритм EME.
9. SecureFS
И снова файловая система специально разработанная для шифрования файлов на основе FUSE. Поддерживает не только Linux, но и Mac, а также Windows. Файловая система может работать в режиме lite, когда шифруются имена файлов и их содержимое отдельно, аналогично EncFS. Или же в режиме full, когда все файлы и папки хранятся в зашифрованной фиртуальной файловой системе.
Выводы
В этой статье мы рассмотрели лучшие шифрованные файловые системы Linux, которые вы можете использовать для защиты своих данных. Сейчас конфиденциальность и безопасность информации имеет первостепенное значение. Если ваш компьютер находится в потенциально опасной обстановке и может быть доступен другим, то важно использовать шифрование чтобы избежать проблем. А какие шифрующие файловые системы вы используете? Напишите в комментариях!
Источник