Как зашифровать файлы в Linux с помощью cryptsetup

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

В данной статье я расскажу как создать зашифрованный файл-контейнер размером 1Гб с помощью утилиты cryptsetup. Файл-контейнер будет работать как виртуальный диск и хранить в себе все секретные файлы в зашифрованном виде. В статье я использовал систему Ubuntu 14.02, но данное руководство будет работать и в других семействах Linux.

Поскольку данные будут шифроваться на уровне разделов, то нам нужно будет смонтировать наш файл-контейнер как виртуальное устройство (loop device). Таким образом, cryptsetup будет уже работать не с файлом, а устройством, как будто это полноценный жесткий диск или флешка.

Однако, перед тем как воспользоваться шифрованием данных, вы должны оценить все “За” и “Против”. Во-первых, при шифровании всегда будет дополнительная нагрузка на процессор. Поэтому перед тем как шифровать большой объем данных, рекомендуется опробовать схему на небольших файлах.

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

Установка cryptsetup

Хотя системные механизмы шифрования уже встроены в дистрибутив и установлены по умолчанию, некоторые утилиты нужно установить отдельно. Поэтому установим пакет cryptsetup:
sudo apt-get update
sudo apt-get install cryptsetup

Создание пустого файла-контейнера

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

Воспользуемся командой dd, которая заполнит пустой файл test.img нулями, используя виртуальное устройство /dev/zero.
dd if=/dev/zero of=test.img bs=1M count=1024

Также можно заполнить файл случайными числами. Эта операция займет гораздо больше времени, но такой подход более надежен:
dd if=/dev/random of=test.img bs=1M count=1024

Инициализация LUKS раздела

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

Создадим LUKS раздел в нашем файле-контейнере:
sudo cryptsetup -y luksFormat test.img

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

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

После того как LUKS контейнер инициализирован, вы можете проверить файл командой:
file test.img
где вы увидите, что test.img это зашифрованный LUKS файл:
test.img: LUKS encrypted file, ver 1 [aes, xts-plain64, sha1] UUID: c7e8d17b-c218-4947-8e40-4081e2533228

Теперь, когда файл-контейнер создан, мы можем открыть его с помощью команды:
sudo cryptsetup luksOpen test.img volume1

где volume1 это имя раздела виртуального устройства LUKS, полный путь к которому /dev/mapper/volume1. Вместо volume1 вы можете задать любое удобное для вас имя.

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

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

После того, как мы создали LUKS контейнер и открыли его как устройство, мы можем работать с ним как любым другим устройством в системе.

Для начала нужно отформатировать и создать файловую систему на нашем устройстве. Вы можете выбрать любую файловую систему. В данной статье мы отформатируем устройство файловой системой ext4:
mkfs.ext4 -j /dev/mapper/volume1

Теперь мы отформатировали наш LUKS контейнер. Как в случае и с любым другим устройством, после форматирования, нам нужно смонтировать наше устройство. Создадим директорию для монтирования:
sudo mkdir /mnt/decrypted

После чего монтируем командой:
sudo mount /dev/mapper/volume1 /mnt/decrypted

Теперь мы можем перейти в директорию с расшифрованными файлами и посмотреть содержимое:
cd /mnt/decrypted
ls

В результате вы должны увидеть единственную директорию lost+found. Теперь мы можем скопировать все наши секретные файлы в смонтированный контейнер, которые будут автоматически зашифрованы:
cp -r ~/Documents/* /mnt/decrypted/

Размонтирование файловой системы и закрытие LUKS контейнера

После того, как мы закончили работать с секретными файлами в контейнере, нужно размонтировать файловую систему:
cd
sudo umount /mnt/decrypted

Однако после размонтирования директории /mnt/decrypted, виртуальное устройство /dev/mapper/volume1 все еще присутствует в системе:
ls /dev/mapper/volume1

Чтобы полностью закрыть volume1 воспользуемся командой:
cryptsetup luksClose volume1

Краткая инструкция

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

1. Открываем LUKS файл
sudo cryptsetup luksOpen test.img volume1

2. Монтируем виртуальное устройство контейнера
sudo mount /dev/mapper/volume1 /mnt/decrypted

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

3. Размонтируем файловую систему
sudo umount /mnt/decrypted

4. Закрываем устройство LUKS
sudo cryptsetup luksClose volume1

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

Похожие записи: