notby.NET Logo

Шифрование накопителя или раздела утилитой cryptsetup (LUKS) в Linux

В операционных системах Linux можно зашифровать отдельный раздел на диске, полностью накопитель SSD/HDD или USB/SD флешку использую стандарт шифрования LUKS. Управление шифрованными LUKS контейнерами (разделами) происходит через утилиту cryptsetup. Для расшифровки раздела или накопителя шифрованного LUKS можно использовать до 8 разных паролей паролей или ключей.

В отличие от шифрованных разделов через программу VeraCrypt, раздел LUKS создает сигнатуру в разметке диска или раздела. Операционные системы Linux будут понимать что это шифрованный накопитель или раздел, а Windows будет предлагать отформатировать накопитель. С одной стороны это минус что сразу понятно что на накопителе находятся зашифрованные данные, с другой стороны это удобство на дистрибутивах Linux. Вставил флешку, кликнул по ней, ввел пароль и можно пользоватся.

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

LUKS позволяет полностью зашифровать всю операционную систему и загрузочный раздел, но в статье будет рассмотрено шифрование USB-флешки или другого внешнего накопителя и опционально отдельного раздела. Показывать буду на примере операционной систему Debian/Ubuntu, в других дистрибутивах работы с утилитой cryptsetup и LUKS контейнерами происходит аналогично.

Все действия выполняются от root пользователя или с его привилегиями через sudo.

su -

1. Установка cryptsetup для работы с LUKS

Для того что бы работать с шифрованием LUKS необходимо установить утилиту cryptsetup, если она не установлена в операционной системе.

Устанавливаем cryptsetup

apt install cryptsetup
Установка утилиты cryptsetup через консольную команду “apt install cryptsetup” в операционной системе Debian

Вместе с cryptsetup будут установлены все необходимые модули и утилиты.

2. Определение накопителя в системе

Вставляем USB-флешку в компьютер.

Выводим список всех накопителей в системе Linux

fdisk -l
В консоли Debian выполнена команда “fdisk -l”, показана USB флешка объемом 2 Гб по адресу устройства /dev/sda с одном разделом /dev/sda1 в файловой системе FAT32

В моем случаи /dev/sda необходимый USB накопитель. Вместо всего устройства, можно выбрать раздел для шифрования, например /dev/sda1 или предварительно его создать на накопителе. Также можно создать два раздела, один с файловой системой FAT32 чтобы определялся в Windows и второй раздел для LUKS который будет виден в Linux.

Если система работает на NVME SSD и нет SATA устройств, то единственная подключённая флешка будет иметь путь /dev/sda

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

3. Очистка данных с USB-флешки

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

Заполняем всю флешку нулями

dd if=/dev/zero of=/dev/sda status=progress

где /dev/sda — USB-флешка которую необходимо очистить или раздел.

USB-флешка объемом 2 ГБ заполнена нулями при помощи команды “dd if=/dev/zero of=/dev/sda status=progress” в консоли Debian

Если оставить накопитель забитым нулями, то будет возможно определить объем зашифрованной информации.

Перезаписываем всю флешку случайными данными

dd if=/dev/random of=/dev/sda status=progress

где /dev/sda — USB-флешка которую необходимо очистить или раздел.

USB-флешка объемом 2 ГБ заполнена случайными данными при помощи команды “dd if=/dev/zero of=/dev/sda status=progress” в консоли Debian

Двух проходов достаточно чтобы все данные были стерты с накопителя.

4. Создание шифрованной USB-флешки

4.1. Разметка и шифрование накопителя

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

Создаем LUKS контейнер с использованием пароля

cryptsetup luksFormat /dev/sda

где /dev/sda — USB-флешка или раздел.

После запуска будет выведено предупреждение This will overwrite data on /dev/sda irrevocably. Are you sure? (Type 'yes' in capital letters):. Оно означает что все данные будет удалены с выбранного устройства или раздела и чтобы продолжить, необходимо ввести YES заглавными буквами.

Вводим заглавными буквами YES, далее придумываем и вводим пароль два раза для шифрования.

Подтверждено удаление данных с накопителя, указан пароль для LUKS контейнера и успешно шифрована USB-флешка командой “cryptsetup luksFormat /dev/sda” в консоли Debian

USB-флешка была полностью занята шифрованным LUKS контейнером(разделом).

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

cryptsetup --help

4.2. Создание файловой системы внутри LUKS

Открываем LUKS контейнер, для этого указываем путь до USB-флешки или раздела и придумываем имя для открытого устройства LUKS, например usbflash

cryptsetup open /dev/sda usbflash

В результате было создано расшифрованное устройство /dev/mapper/usbflash для шифрованного LUKS контейнера.

Создание файловой системы ext4

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

mkfs.ext4 -m 0 /dev/mapper/usbflash

где /dev/mapper/usbflash — расшифрованное LUKS устройство, параметр -m 0 указывает что не резервировать место для root пользователя.

Успешно создана файловая система ext4 для устройства /dev/mapper/usbflash через консольную команду “mkfs.ext4 -m 0 /dev/mapper/usbflash” в Debian

Файловая система ext4 успешно создана внутри LUKS. Так как она была создана от root пользователя, то доступ на запись получить только root-пользователь. Можно изменить владельца или настроить права доступа 777, чтобы иметь возможность записывать файлы на любом компьютере от не суперпользователя. Вместо ext4 можно использовать любую файловую систему и самое удобное решение чтобы пользоватся с любых компьютеров и от любых пользователей это использовать FAT32 или exFAT.

Создание файловой системы FAT32

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

mkfs.fat -v -F 32 /dev/mapper/usbflash

где /dev/mapper/usbflash — расшифрованное LUKS устройство, параметр -F 32 указывает что будет создана файловая система FAT32.

Успешно создана файловая система FAT32 для устройства /dev/mapper/usbflash через консольную команду “mkfs.fat -v -F 32 /dev/mapper/usbflash” в Debian

Файловая система FAT32 успешно создана внутри LUKS.

Закрытие LUKS контейнера 

Закрываем расшифрованное LUKS устройство

cryptsetup close usbflash

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

5. Открытие шифрованной USB-флешки

5.1. Монтирование вручную через консоль

Создаем каталог для монтирования  с правами 755

mkdir -m 0755 -p /mnt/encrypted/

Открываем LUKS контейнер с указанием имени usbflash для создания расшифрованного устройства /dev/mapper/usbflash

cryptsetup open /dev/sda usbflash

где /dev/sda — USB-флешка или раздел шифрованный LUKS, usbflash — имя для расшифрованного LUKS устройства.

Вводим пароль и будет создано расшифрованное устройство /dev/mapper/usbflash, которое необходимо будет смонтировать.

Монтируем LUKS устройство

mount /dev/mapper/usbflash /mnt/encrypted/

где /dev/mapper/usbflash — расшифрованное LUKS устройство, /mnt/encrypted/ — каталог монтирования.

Каталог /mnt/encrypted/ доступен для записи только для root так как он создан от него с правами 755. Выполняем необходимые действия с файлами внутри флешки и после завершения работы с USB-флешкой выполняем действия в обратной последовательности.

Размонтируем точку монтирования

umount /mnt/encrypted/

Закрываем LUKS устройство

cryptsetup close usbflash

Удаляем каталог монтирования, если это необходимо

rm -r /mnt/encrypted/

Извлекаем флешку с USB порта компьютера.

5.2. Открытие через графический интерфейс

В большинстве сред рабочего стола (KDE, Xfce, GNOME и другие) достаточно подключить флешку к компьютеру и на рабочем столе появится ярлык для открытия шифрованного устройства.

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

В рабочей среде Xfce после нажатия на ярлык шифрованной USB-флешки объемом 2Gb открыто окно с запросом пароля для расшифровки накопителя

Шифрованная USB-флешка успешно открыта.

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

6. Резервная копия заголовка LUKS контейнера

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

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

Резервная копия заголовка LUKS контейнера поможет восставить данные, если было повреждение каких-то секторов накопителя в месте заголовка.

Создаем резервную копию заголовка LUKS

cryptsetup --header-backup-file=/home/user/Documents/usb-flash-2GB.backup luksHeaderBackup /dev/sda

где /home/user/Documents/usb-flash-2GB.backup путь до файла в которых будет создана резервная копия заголовка, /dev/sda — USB-флешка или раздел шифрованный LUKS.

Теперь для эксперимента можно скинуть файл и отформатировать флешку в Windows или Linux.

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

Восстанавливаем из резервной копии заголовок LUKS

cryptsetup --header-backup-file=/home/user/Documents/usb-flash-2GB.backup luksHeaderRestore /dev/sda

где /home/user/Documents/usb-flash-2GB.backup путь до файла в котором находится резервная копия заголовка, /dev/sda — USB-флешка или раздел шифрованный LUKS.

Переподключаем накопитель к компьютеру и открываем его вводя пароль. Проверяем что все открылось и повреждённых данных нет.

Сравниваем хеш-сумму файла скинутого в качестве эксперимента при помощи утилиты sha256sum или аналогичных на шифрованной флешки и в месте откуда он был скинут. Значение хеш-сумму файлов должны быть идентичные.

7. Изменение пароля доступа

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

Изменяем пароль к шифрованному LUKS контейнеру

cryptsetup luksChangeKey /dev/sda

где /dev/sda — USB-флешка или раздел шифрованный LUKS.

Вводим старый пароль, затем вводим два раза новый пароль.

Пароль для LUKS контейнера USB-флешки /dev/sda успешно обновлен командой “cryptsetup luksChangeKey /dev/sda” в консоли Debian

Пароль был успешно обновлен.