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

Linux Unified Key Setup: как защитить флэшки и внешние диски от взлома

Посмотрим, как с помощью системы на базе спецификации Linux Unified Key Setup (LUKS) и утилиты Cryptsetup можно зашифровать флэш-накопители, внешние жёсткие диски и прочие переносные устройства, хранящие дорогую вашему сердцу информацию.

Чаще всего, пользователи рассуждают достаточно просто: накопители в безопасности, пока их никто не украл. Некоторые идут в размышлениях дальше: если для входа в систему нужно знать пароль — злоумышленнику будет сложно получить доступ к данным на украденном диске. Успокаиваясь на этой мысли, они забывают задать себе важный вопрос: к чему именно мешает получить доступ их пароль на самом деле?

Во многих случаях они всего лишь служат для разблокировки пользовательского сеанса. И тогда злоумышленник может забрать данные с диска, не зная пользовательский пароль: он просто обойдётся без разглядывания заставки на вашем рабочем столе.

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

Если время сильно ограничено, злодеи действительно могут украсть накопитель и взять работу на дом. Особенно легко это им удаётся, если он внешний и подключён через USB. В этой статье речь пойдёт о простом инструменте, позволяющем защитить от несанкционированного доступа данные на внешних накопителях. Даже если они уже попали в руки к злоумышленникам. Речь пойдёт о шифровании дисков в операционных системах семейства Linux.

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

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

Шифрование на этапе инсталляции

Проще всего выполнить полное шифрование диска, выбрав соответствующую опцию в процессе установки операционной системы. Большинство современных Linux-дистрибутивов позволяют это сделать. Здесь не буду расписывать в деталях, так как статья посвящена шифрованию внешних накопителей (далее я подробно буду рассматривать именно его).

Изображение: Seth Kenlon, CC BY-SA 4.0

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

Шифрование внешних накопителей

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

LUKS вместе с утилитой Cryptsetup позволяет шифровать внешние накопители почти так же просто, как и при инсталляции ОС.

Как это сделать с помощью LUKS

ВАЖНО: внешний накопитель должен быть либо пустым, либо содержать ненужные вам данные. Так что, если оба этих условия не выполнены, нулевым шагом должен стать бэкап.

Читайте также:  Используя windows movie maker можно

1. Подключите и найдите свой внешний диск

Я для примера взял небольшую флэшку. Представим, что путь к ней выглядит как /dev/sdX. Утилита lsblk покажет мне вот такую информацию о блочных устройствах:

Всё правильно, моя флэшка обнаружена. Да, это именно она. Я точно знаю, что её размер 1.8Gb. В списке всего один диск (disk) с таким размером (ему соответствует один раздел part).
Я уделяю такое внимание этой, казалось бы, мелочи, так как дисков может быть много. И в случае ошибки на следующем шаге вы сотрёте с другого диска данные, которые вам всё ещё нужны.

2. Очистите диск

На этом шаге я обнуляю таблицу разделов диска:

Это, конечно, необязательно, но я люблю это состояние чистого листа.

3. Отформатируйте диск под LUKS

Используем для этого утилиту Cryptsetup. Её подкоманда luksFormat запускает первый этап создания зашифрованного раздела LUKS (позже мы создадим там файловую систему).
После этого появится предупреждение об удалении всех данных (которые могли всё ещё оставаться на диске). Кроме того, вас попросят придумать и ввести парольную фразу для диска.

4. Откройте LUKS-том

Процесс создания зашифрованного раздела завершён. Теперь для продолжения работы с диском нужно вводить парольную фразу. Открыть произвольный LUKS-том (то есть, подключить виртуальное блочное устройство) можно с помощью подкоманды open.

Я придумал фразу (а точнее, просто пароль в одно слово) «vaultdrive». У вас будет какой-то свой вариант. Чтобы посмотреть список открытых томов, нужно вывести содержимое каталога /dev/mapper:

Чтобы закрыть LUKS-том vaultdrive нужно написать:

После этого он исчезнет из каталога /dev/mapper.

5. Создайте файловую систему

Создайте файловую систему, чтобы иметь возможность хранить свои данные на диске. Я выбрал XFS, но это далеко не единственный вариант: можно использовать, например, ext4 или JFS. И многие другие.

Финал: монтирование LUKS-тома

Можно делать это через терминал. Например, мы хотим использовать для нашей цели директорию /mnt/hd

А рабочий стол KDE, например, позволяет указать диск для монтирования в специальном разделе с настройками. Но и там я тоже должен вводить пароль или парольную фразу, прежде чем произойдёт монтирование.

Изображение: Seth Kenlon, CC BY-SA 4.0

А какие инструменты для шифрования внешних дисков на Linux используете вы? Какие инструменты используете для аналогичных задач на macOS и Windows?

Недорогие VDS для любых задач. Используем новейшее железо, лучший дата-центр в Москве уровня надёжности TIER IV, бесплатно предоставляем защиту от DDoS-атак на любом тарифном плане, который можно создать самостоятельно в течение минуты.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Источник

Шифрование в 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). Одним и тем же ключом можно зашифровать несколько директорий. Для шифрования разных директорий можно использовать разные ключи. Чтобы узнать, каким ключом зашифрована директория, необходимо выполнить команду:

Установить другую политику безопасности на зашифрованную директорию не получится:

Читайте также:  Windows iso downloader как пользоваться

Зато такую директорию можно беспрепятственно удалить:

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

Ключ аннулирован, читаем содержимое директории:

Имя файла уже абырвалг. Но всё-таки попробуем прочитать файл:

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.

Читайте также:  Как узнать пароль лицензии windows 10

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:

Источник

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