Подписывайтесь на Telegram канал!

Использовать шифрование данных залог того что ваши данные не попадут в руки кому попало. В этой статье расскажу как производить шифрование диска или раздела в ОС Linux используется модуль ядра dm-crypt LUKS.

Введение

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

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

Для работы с LUKS и модулем dm-crypt используется утилита Cryptsetup.

Создание шифрованного устройства

Общая схема работы с шифрованным устройством следующая:

  • Определяется устройство для шифрования;
  • Создается шифрованный раздел;
  • Производится форматирование раздела в необходимую файловую систему;
  • Монтирование раздела в систему.

Установка CRYPTSETUP

Выберите свою команду исходя из своей системы и установите необходимую утилиту:

apt install cryptsetup

dnf install cryptsetup

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

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

Основные операции, которые можно сделать используя утилиту:

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

Подготовка устройства

Вначале необходимо вывести информацию об имеющихся дисках в системе:

fdisk -l
= вывод команды =
Диск /dev/sdb: 32 GiB, 6442450944 байт, 12582912 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/sda: 32 GiB, 34359738368 байт, 67108864 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0xdbf480c5

Устр-во   Загрузочный начало  Конец    Секторы  Размер  Идентификатор  Тип
/dev/sda1 *           2048    2099199  2097152  1G      83             Linux
/dev/sda2             2099200 67108863 65009664 31G     8e             Linux LVM

В нашем случае это диск /dev/sdb. Можно весь диск зашифровать или сделать зашифрованным только какой то раздел.

Для работы с диском я использую утилиту cfdisk.

cfdisk /dev/sdb

= C параметром -z можно создать заново таблицу разделов =
cfdisk -z /dev/sdb

Создание шифрованного раздела

Создадим шифрованный раздел из всего диска sdb:

cryptsetup -y -v luksFormat /dev/sdb
= вывод команды =
ПРЕДУПРЕЖДЕНИЕ: Устройство /dev/sdb уже содержит подпись раздела «dos».
 
WARNING!
========
Данные на /dev/sdb будут перезаписаны без возможности восстановления.
 
Are you sure? (Type uppercase yes): YES - Внимание! Писать только заглавными буквами!
Введите парольную фразу для /dev/sdb: ! пароль
Парольная фраза повторно: ! повтор пароля
Existing 'dos' partition signature on device /dev/sdb will be wiped.
Создан слот ключа 0.
Команда выполнена успешно.

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

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

cryptsetup luksOpen /dev/sdb sdb_crypt

Посмотрим созданное виртуальное устройство:

ls -l /dev/mapper/sdb_crypt
= вывод команды =
lrwxrwxrwx 1 root root 7 дек 27 21:53 /dev/mapper/sdb_crypt -> ../dm-3

Посмотреть состояние устройства можно выполнив команду:

cryptsetup -v status sdb_crypt
= вывод команды =
/dev/mapper/sdb_crypt is active.
type:    LUKS2
cipher:  aes-xts-plain64
keysize: 512 bits
key location: keyring
device:  /dev/sdb
sector size:  512
offset:  32768 sectors
size:    625109680 sectors
mode:    read/write
Команда выполнена успешно.

Рекомендую сделать резервную копию заголовков LUKS это может помочь при возможных в будущем проблем.

Делается резервная копия заголовка LUKS следующей командой:

cryptsetup luksDump /dev/sdb
= вывод команды =
LUKS header information
Version:       	2
Epoch:         	3
Metadata area: 	16384 [bytes]
Keyslots area: 	16744448 [bytes]
UUID:          	cf501772-dd9b-4554-bccc-7a6739e72142
Label:         	(no label)
Subsystem:     	(no subsystem)
Flags:       	(no flags)
 
Data segments:
  0: crypt
	offset: 16777216 [bytes]
	length: (whole device)
	cipher: aes-xts-plain64
	sector: 512 [bytes]
 
Keyslots:
  0: luks2
	Key:        512 bits
	Priority:   normal
	Cipher:     aes-xts-plain64
	Cipher key: 512 bits
	PBKDF:      argon2i
	Time cost:  4
	Memory:     903656
	Threads:    4
	Salt:       00 54 94 e7 r6 bb 00 ec 42 5a c9 81 7f d2 35 3d 
	            07 06 af 27 ac 15 80 5f 4f 29 37 ee 72 4b ff b8 
	AF stripes: 4000
	AF hash:    sha256
	Area offset:32768 [bytes]
	Area length:258048 [bytes]
	Digest ID:  0
Tokens:
Digests:
  0: pbkdf2
	Hash:       sha256
	Iterations: 89043
	Salt:       ac 7b 53 43 4b b3 82 77 07 64 35 35 0b 2f fb c8 
	            24 e0 ba 58 90 3d da 14 2f df 8e f0 fa a6 6a 76 
	Digest:     3f f1 07 4d 93 1b db ae 88 55 21 fa 9a ad a9 a2 
	            ba 77 48 8b 84 41 aw 3c 0d 9d 5e 33 ae e0 af 44

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

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

dd if=/dev/zero of=/dev/mapper/sdb_crypt

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

pv -tpreb /dev/zero | dd of=/dev/mapper/sdb_crypt bs=128M

В случае отсутствия утилиты pv её необходимо установить. Для систем на базе Debian необходимо выполнить команду # apt install pv

Отформатировать можно в любую необходимую файловую систему. В нашем случае отформатируем в ext4:

mkfs.ext4 /dev/mapper/sdb_crypt

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

Создадим место куда будем монтировать и подмонтируем созданную файловую систему:

mkdir /mnt/sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

= При необходимости можно дать полные права всем =
chmod 777 /mnt/sdb_crypt

Для проверки выполним команду которая покажет подмонтированые устройства в системе:

df -h
= вывод команды =
Файловая система         Размер   Использовано   Дост     Использовано%   Cмонтировано в
devtmpfs                 1,9G     0              1,9G     0%              /dev
tmpfs                    1,9G     0              1,9G     0%              /dev/shm
tmpfs                    1,9G     8,5M           1,9G     1%              /run
tmpfs                    1,9G     0              1,9G     0%              /sys/fs/cgroup
/dev/mapper/rl-root      28G      6,0G           22G      22%             /
/dev/sda1                1014M    334M           681M     33%             /boot
tmpfs                    374M     0              374M     0%              /run/user/0
/dev/mapper/sdb_crypt    32G      24M            32G      0%              /mnt/sdb_crypt

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

umount /mnt/sdb_crypt
cryptsetup luksClose sdb_crypt

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

cryptsetup luksOpen /dev/sdb sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

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

Скрипт для подключения шифрованного устройства:

vim /root/start-sdb_crypt.sh
= необходимый код 
#!/bin/bash
cryptsetup luksOpen /dev/sdb sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

Скрипт для отключения шифрованного устройства:

vim /root/stop-sdb_crypt.sh
= необходимый код =
#!/bin/bash
umount /mnt/sdb_crypt
cryptsetup luksClose sdb_crypt

Cделаем скрипты исполнительными выполнив необходимую команду:

chmod +x /root/start-sdb_crypt.sh
chmod +x /root/stop-sdb_crypt.sh

Обслуживание

Проверка файловой системы LUKS

После открытия раздела он воспринимается системой, как и все другие. Для проверки можно использовать утилиту fsck ( при условии что файловая система отмантирована ):

fsck -vy /dev/mapper/sdb_crypt

Изменение парольной фразы LUKS

Парольную фразу можно изменить или создать до восьми разных парольных фраз.

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

cryptsetup luksDump /dev/sdb

Команда для создания новой парольной фразы:

cryptsetup luksAddKey /dev/sdb
= вывод команды =
Введите любую существующую парольную фразу: ! вводим существующий пароль
Введите новую парольную фразу для слота ключа: ! вводим новый пароль
Парольная фраза повторно: ! повторяем новый пароль

Команда для удаления существующего пароля:

cryptsetup luksRemoveKey /dev/sdb
= вывод команды =
Введите удаляемую парольную фразу: ! вводим удаляемую парольную фразу

Заключение

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

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

Решать в любом случае вам как защищать свои данные, но то что сейчас это надо делать обязательно актуально как никогда.

Понравилась статья? Поделитесь ей с друзьями!
Пожалуйста, оставляйте свои комментарии

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

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.