Шифрующая файловая система linux

Шифрование дисков в Linux

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

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

Методы шифрования данных в Linux

Шифрование на уровне файловой системы:

  • 1. eCryptfs — это криптографическая файловая система Linux. Она хранит криптографические метаданные для каждого файла в отдельном файле, таким образом, что файлы можно копировать между компьютерами. Файл будет успешно расшифрован, если у вас есть ключ. Это решение широко используется для реализации зашифрованной домашней директории, например, в Ubuntu. Также ChromeOS прозрачно встраивает эти алгоритмы при использовании сетевых устройств для хранения данных (NAS).
  • 2. EncFS — обеспечивает шифрованную файловую систему в пространстве пользователя. Она работает без каких-либо дополнительных привилегий и использует библиотеку fuse и модуль ядра для обеспечения интерфейса файловой системы. EncFS — это свободное программное обеспечение и она распространяется под лицензией GPL.

Блочное шифрование на уровне устройства:

  • Loop-AES — быстрая и прозрачная файловая система, а также пакет для шифрования раздела подкачки в Linux. Исходный код программы давно не изменялся. Она работает с ядрами 4.x, 3.x, 2.2, 2.0.
  • TrueCrypt — это бесплатное решение с открытым исходным кодом для шифрования диска в операционных системах Windows 7 / Vista /XP / Mac OS X, а также в Linux.
  • dm-crypt+LUKS — dm-crypt — это прозрачная подсистема для шифрования диска в ядре 2.6 и более поздних версиях. Поддерживается шифрование целых дисков, съемных носителей, разделов, томов RAID, программного обеспечения, логических томов и файлов.

В этой инструкции мы рассмотрим шифрование жесткого диска на Linux с помощью алгоритма Linux Unified Key Setup-on-disk-format (LUKS).

Как работает LUKS?

LUKS (Linux Unified Key Setup — протокол шифрования блочного устройства. Но мы забежали далеко наперед, чтобы понять как это работает, нужно скачала разобраться с другими технологиями, используемыми в этом способе.

Чтобы выполнить шифрование диска linux используется модуль ядра dm-crypt. Этот модуль позволяет создавать в каталоге /dev/mapper виртуальное блочное устройство с прозрачным для файловой системы и пользователя шифрованием. Фактически все данные лежат на зашифрованном физическом разделе. Если пользователь пытается записать данные на виртуальное устройство, они на лету шифруются и записываются на диск, при чтении с виртуального устройства, выполняется обратная операция — данные расшифровываются с физического диска и передаются в открытом виде через виртуальный диск пользователю. Обычно для шифрования используется метод AES, потому что под него оптимизированы большинство современных процессоров. Важно заметить, что вы можете шифровать не только разделы и диски, но и обычные файлы, создав в них файловую систему и подключив как loop устройство.

Алгоритм LUKS определяют какие действия и в каком порядке будут выполняться во время работы с шифрованными носителями. Для работы с LUKS и модулем dm-crypt используется утилита Cryptsetup. Ее мы и рассмотрим далее.

Утилита Cryptsetup

Утилита Cryptsetup позволят облегчить шифрование раздела Linux с помощью модуля dm-crypt. Давайте сначала ее установим.

В Debian или Ubuntu, для этого используйте такую команду:

В дистрибутивах, основанных на Red Hat это будет выглядеть так:

Синтаксис запуска команды такой:

$ cryptsetup опции операция параметры_операции

Рассмотрим основные операции, которые можно сделать с помощью этой утилиты:

  • luksFormat — создать зашифрованный раздел luks linux
  • luksOpen — подключить виртуальное устройство (нужен ключ)
  • luksClose — закрыть виртуальное устройство luks linux
  • luksAddKey — добавить ключ шифрования
  • luksRemoveKey — удалить ключ шифрования
  • luksUUID — показать UUID раздела
  • luksDump — создать резервную копию заголовков LUKS
Читайте также:  Центр обновления windows не искать

Параметры операции зависят от самой операции, обычно это либо физическое устройство, с которым нужно произвести действие, либо виртуальное или и то и другое. Еще не все понятно, но на практике, я думаю, вы со всем разберетесь.

Шифрование диска Linux

Теория пройдена, все инструменты готовы. Теперь рассмотрим шифрование раздела linux. Перейдем к настройке жесткого диска. Обратите внимание, что это удалит все данные из диска или раздела, который вы собираетесь зашифровать. Так что если там есть важные данные, лучше скопируйте их в более надежное место.

Создание раздела

В этом примере мы будем шифровать раздел /dev/sda6, но вместо него вы можете использовать целый жесткий диск или просто один файл, заполненный нулями. Создаем шифрованный раздел:

Are you sure? (Type uppercase yes): YES

Enter LUKS passphrase:

Эта команда выполнит инициализацию раздела, установит ключ инициализации и пароль. Указывайте такой пароль, чтобы его потом не забыть.

Выполните такую команду чтобы открыть только что созданный раздел с помощью модуля dm-crypt в /dev/mapper, для этого понадобится ввести пароль, с которым выполнялось шифрование luks linux:

Enter passphrase for /dev/sda6

Теперь вы можете увидеть новое виртуальное устройство /dev/mapper/backup2 созданное с помощью команды luksFormat:

Чтобы посмотреть состояние устройства выполните:

А с помощью следующей команды вы можете сделать резервную копию заголовков LUKS на всякий случай:

Ну, можно сказать, раздел готов. И что самое интересное, теперь вы можете им пользоваться так же, как и любым другим обычным разделом в каталоге /dev. Его можно форматировать с помощью стандартных утилит, записывать на него данные, изменять или проверять файловую систему и т д. Нельзя только изменить размер. То есть все полностью прозрачно, как и сказано в начале статьи.

Форматирование раздела

Давайте для начала отформатируем диск. Для надежности, чтобы стереть все данные, которые были в этом месте раньше, перезапишем наш шифрованный раздел linux нулями. Это уменьшит вероятность взлома шифрования, через увеличение количества случайной информации. Для этого выполните:

Работа утилиты может занять несколько часов, чтобы иметь возможность наблюдать за процессом, используйте pv:

Когда процесс завершится мы можем отформатировать устройство в любую файловую систему. Например, отформатируем в ext4:

Как видите, все команды cryptsetup применяются к физическому разделу, в то время как остальные команды для работы с дисками — к нашему виртуальному.

Монтирование раздела

Теперь можно примонтировать только, что созданную файловую систему:

$ mount /dev/mapper/backup2 /backup2

Отключение раздела

Все работает, но как отключить устройство и защитить данные. Для этого выполните:

Повторное монтирование

Чтобы снова получить возможность работать с зашифрованным разделом с помощью LUKS linux необходимо опять его открыть:

Теперь можем монтировать:

Проверить файловую систему luks

Поскольку после открытия раздела с помощью luks linux, этот раздел воспринимается системой, как и все другие, вы можете просто использовать утилиту fsck:

$ fsck -vy /dev/mapper/backup2

$ mount /dev/mapper/backup2 /backu2

Изменить парольную фразу luks

Шифрование дисков Linux выполняется с определенной парольной фразой, но вы можете ее изменить. Даже больше, вы можете создать до восьми разных парольных фраз. Для изменения выполнив следующие команды. Сначала сделаем резервную копию заголовков LUKS:

Затем создадим новый ключ:

Enter new passphrase for key slot:

И удалим старый:

Сейчас вам придется ввести еще старый пароль.

Выводы

Вот и все теперь вы знаете как зашифровать раздел в Linux, а также понимаете как все это работает. Кроме того, шифрование дисков в Linux по алгоритму LUKS открывает широкие возможности для полного шифрования устанавливаемой системы.

  • LUKS шифрует все блочное устройство, и поэтому очень хорошо подходит для защиты содержимого переносных устройств, таких как мобильные телефоны, съемные носители или жесткие диски ноутбуков.
  • Вы можете использовать на серверах NAS для защиты резервных копий
  • Процессоры Intel и AMD с AES-NI (Advanced Encryption Standard) имеют набор команд, которые могут ускорить процесс шифрования на основе dm-crypt в ядре Linux начиная с 2.6.32.
  • Работает в том числе и с разделом подкачки, так что ваш ноутбук может использовать функцию спящего режима, или гибернации полностью безопасно.

Источник

Шифрование в EXT4. How It Works?

1. Как это работает

Для начала необходимо освоить несколько полезных команд

Читайте также:  Ipv6 отключить или нет windows 10

Форматирование тома с опцией шифрования

Включение опции шифрования на существующий том

Создание ключа шифрования

При создании ключа том с поддержкой шифрования должен быть примонтирован, иначе 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-байтовая структура, содержащая контрольную сумму этого блока.

Читайте также:  Windows update не показывает обновления

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:

Источник

Оцените статью