Дополнительные скрипты монтирования для контейнеров DM-Crypt
Скрипт для удобного создания / подключения контейнеров dm-crypt через sudo и создания шифрованных файлов подкачки.
Используйте одну команду вместо трёх, с меньшим риском ошибок. Монтируйте ваши крипто-контейнеры под LiveCD в один простой шаг. Скрипт делает проверки на опасность действий.
0). Программы cryptsetup, sed, basename, realpath, losetup, dd, mkfs*, shred, touch и bash должны быть (обычно стоят по умолчанию)
На ряде систем cryptsetup нужно поставить вручную (например Ubuntu 18 минимальная):
apt-get install cryptsetup-bin
Дополнительно можно установить утилиту sudo и пакеты поддержки других файловых систем (btrfs, xfs, ntfs, exfat, reiserfs).
1). Скачайте требуемый скрипт на локальную систему, например в /opt (запускать его можно откуда угодно), разрешите исполнение:
cd /opt
wget https://github.com/Aminuxer/DM-Crypt-Helper-Scripts/raw/master/_dmc.sh
chmod +x _dmc.sh
Вместо wget можно использовать curl или fetch.
2). Рекомендуемый шаг. Использование dm-crypt требует высоких прав доступа (root). Создайте правило sudo для запуска скрипта от непривилегированного пользователя user1:
# vi /etc/sudoers.d/myscripts-example
user1 ALL=(root) NOPASSWD: /opt/_dmc.sh
Без этого шага (например в livecd типа knoppix) управление контейнерами будет требовать root-прав.
3). Запуск скрипта через sudo:
$ sudo /opt/_dmc.sh
При запуске без параметров показывается подсказка:
Usage: ./_dmc.sh <Path to Dm-Crypt container> [start|stop|create|make_loops] [Mount point] [cipher]
Example: ./_dmc.sh ~/mysecrets.bin create - make new in file
./_dmc.sh /dev/md0 create - on RAID
./_dmc.sh ~/mysecrets.bin - switch
./_dmc.sh ~/mysecrets.bin stop - force stop
create - make new container. Existing file don't touch for safety
make_loops - create new loop-devices in /dev
Можно создать контейнер в новом файле или на неиспользуемом блочном устройстве (физическом диске, разделе, LVM-томе или массиве RAID). Скрипт не трогает существующие файлы или смонтированные/используемые устройства при вызове метода create. Также делаются проверки, что используемое устройство типа /dev/(md*|sd*|mapper|lvm*) не смонтированы и не содержат структур RAID / LVM / ZFS.
В этом случае вы увидите сообщения типа "file /var/tmp/fs1.bin exist, usage existing files denied.", "Device mounted" или "Device in RAID / LVM / ZFS".
Запустите скрипт с указанием полного пути и имени нового файла-контейнера и следуйте диалогу:
Контейнер в обычном файле :
$ sudo /opt/_dmc.sh /var/tmp/fs1.bin create
На 9-м разделе физического диска sdg:
$ sudo /opt/_dmc.sh /dev/sdg9 create
На свободном логическом томе LVM (LV):
$ sudo /opt/_dmc.sh /dev/mapper/free-LVM-LogicalVolume create
----- CREATE NEW CryptoContainer ---------------------
You start to CREATE dm-crypt container. Continue (Yes/No)? Yes
OK, continue...
Enter internal volume label for new container: MyNewContainer1
Enter volume size (1048576, 1024K, 100M, 2G): 42M
Supported filesystems on your machine:
------------------------------------------
btrfs ext2 ext3 ext4 fat
msdos ntfs vfat xfs
------------------------------------------
Enter filesystem type (from list above): ext4
Fast fill container
0+0 records in
0+0 records out
0 bytes copied, 7.7594e-05 s, 0.0 kB/s
Enter passphrase for /dev/loop2: EnterYouStrongUberMegaPaSsW0rD~PhRAZe+Here
Shreding [42M] space on [/var/tmp/fs1.bin] ... (please wait)
Formatting cryptocontainer...
mke2fs 1.44.6 (5-Mar-2019)
Creating filesystem with 43008 1k blocks and 10752 inodes
Filesystem UUID: 340138b4-b630-47c2-852c-bf57d3d7ca99
Superblock backups stored on blocks:
8193, 24577, 40961
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
Label :: [fs1.bin] ; /var/tmp/fs1.bin --> /run/media/MyNewContainer1 ; [on /dev/loop2], SIZE: [42M]
----- New CryptoContainer mounted succesfully ! ---------
Для физических устройств вводить размер не надо - скрипт сам его определит. После этого ваш контейнер сразу будет смонтирован и готов к использованию.
Запустите скрипт с полным путём к контейнеру и указанием метода start:
$ sudo /opt/_dmc.sh /var/tmp/fs1.bin start
Корректное подключение выглядит вот так:
----- Mount CryptoContainer [/var/tmp/fs1.bin] ---------------------
Cipher options: aes-xts-essiv:sha256 --hash sha512 --key-size 512
Enter passphrase for /dev/loop3: EnterYouStrongUberMegaPaSsW0rD~PhRAZe+Here
Command successful.
FS in container: ext4
Label :: [fs1.bin] ; /var/tmp/fs1.bin --> /run/media/MyNewContainer1 ; [on /dev/loop3]
----- Mount CryptoContainer Complete ! ---------
Парольную фразу надо вводить "одной строкой", без опечаток, ошибок или попыток редактирования. Вводимые символы не отображаются. Любые ошибки в парольной фразе будут приводить к ошибкам монтирования.
Запустите скрипт с полным путём к контейнеру и указанием метода stop:
$ sudo /opt/_dmc.sh /var/tmp/fs1.bin stop
Корректное отключение выглядит вот так:
----- Unmount CryptoContainer [/var/tmp/fs1.bin] --------------------
losetup: /dev/loop1
Check mount-point [/run/media/MyNewContainer1] and try remove empty dir
!! Remove mount-point /run/media/MyNewContainer1 !!
removed directory '/run/media/MyNewContainer1'
----- Unmount CryptoContainer Complete ! ---------
Если из внутренней ФС контейнера будет открыт любой файл во внешних программах, скрипт остановится с сообщением об ошибке размонтирования. Закройте все открытые с контейнера файлы и попробуйте снова.
-
Что случится, если я запущу команду
$ sudo /opt/_dmc.sh /var/tmp/fs1.bin
- только с путём к уже существующему файлу ?- Скрипт постарается определить текущее состояние и выполнит предполагаемое действие. Подключенный контейнер будет отключён, отключенный - попробует подключить через запрос парольной фразы.
-
Могу я напрямую использовать блочные устройства или разделы типа /dev/sdh или /dev/sdg2 вместо файлов ?
- Да. Но скрипт разрешает это делать только на отключённых устройствах, не включённых в RAID / LVM / ZFS. Работа по смонтированным устройствам деструктивна и заблочена во избежание потери данных. В любом случае, всё под вашу ответственность; Я проверил этот сценарий в Fedora и Ubuntu, всё работает нормально.
-
Что за метод make_loops ?
- Этот метод для некоторых старых Live-систем, где петельные блочные устройства не создавались при загрузке. Использует утилиту mknod. Может быть полезен, если вы подключаете очень много контейнеров.
-
Скрипт может испортить мой обычный файл, если я попробую его подключить ? например _dmc.sh dsc0001.jpg ?
- Нет. Вы не сможете придумать пароль, который конвертнёт вашу фотку в образ файловой системы с помощью AES =) Это фантастика. Скрипт не сможет найти файловую систему и откатит все изменения. Файл не будет затронут. Но вы должны делать бэкапы в любом случае =].
-
Как подключить контейнер по другому пути, например, куда-то под /tmp/..., /home/... или ещё куда ?
- Используйте третий параметр:
$ sudo /opt/_dmc.sh /var/tmp/fs1.bin start /tmp/mountpoint
- Используйте третий параметр:
-
Какие файловые системы можно использовать ?
- Для размещения самого контейнера - любые. Проверьте ограничения на максимальный размер и символы в имени файла (актуально только для старых систем MS типа FAT).
- Для ФС внутри контейнера - все стандартные, умеющие метки и установленные у вас - ext*, fat*, ntfs, btrfs, xfs, reiser
- Другие ФС могут быть добавлены в будущем, в зависимости от многих причин.
-
У меня контейнер без метки тома. Насколько это важно ?
- Не важно. Контейнер с ФС без метки будет смонтирован в путь типа
/run/media/Disk_NoLABEL__fs1.bin
при старте. Подключите контейнер, посмотрите имя устройства с помощьюdf
и смените метку ддя /dev/mapper/fs1.bin с помощьюe2label
или подобной утилиты. Некоторые ФС сперва потребуется отмонтировать. Испольуйте umount, меняйте метку, потом _dmc.sh ... stop Метка применится при следующем подключении.
- Не важно. Контейнер с ФС без метки будет смонтирован в путь типа
-
Можно монтировать несколько разных копий одного и того же контейнера ?
- Только аккуратно; Используйте различный точки монтирования:
./_dmc.sh /tmp/copy1/disk.dmc start /tmp/mounpoint1
./_dmc.sh /tmp/copy2/disk.dmc start /tmp/mounpoint2
С версии 2021-10-26 скрипт предотвращает монтирование одного и того же файла в несколько loop-устройств. С версии 2021-11-12 поддерживается монтирований копий одного и того же контейнера. При простом монтировании без указания точки монтирования каталоги будут подменяться (не рекомендую так делать).
- Только аккуратно; Используйте различный точки монтирования:
-
Могу я делать fsck и иные сервисные процедуры над файловой системой в контейнере ?
- Да. Подключите контейнер с правильным паролем скриптом _dmc.sh. Посмотрите имя устройства с помощью команды
df
илиmount
. Отмонтируйте ФС с помощью командыumount
(НЕ скриптом !!). Запустите fsck на /dev/mapper/<virtual.device.name> Окончательно отключите контейнер вызовом скрипта script с параметром stop.
- Да. Подключите контейнер с правильным паролем скриптом _dmc.sh. Посмотрите имя устройства с помощью команды
-
Что за четвёртый параметр - Cipher ?
- Если у вас есть другие или старые контейнеры dm-crypt, использующие другие шифры, вы можете использовать этот параметр для их подключения.
Синтаксис такой же, как у параметра
-c
для cryptsetup.
- Если у вас есть другие или старые контейнеры dm-crypt, использующие другие шифры, вы можете использовать этот параметр для их подключения.
Синтаксис такой же, как у параметра
-
Можно ли обновлять скрипт до новой версии ?
- Да. Отключите все контейнеры, сделайте бэкап и скачайте скрипт поверх старого. Если не менялся метод шифрования - всё должно работать. В ином случае, используйте четвёртый парамтер (CIPHER) для указания типа шифра. Если вы обновили скрипт, а контейнеры уже были подключены - ничего страшного, просто сделайте umount вручную.
-
Почему используется набор aes-xts-essiv:sha256 --hash sha512 --key-size 512 ?
- Этот метод пригоден для полнодискового шифрования, стоек ко многим атакам и поддерживается почти во всех Linux-дистрибутивах. Также шифры AES имеют аппаратное ускорение на современных процессорах - это важно для больштих контенйеров (например, для хранения образов виртуальных машин)
- Для более глубокого понимания требуется более глбокое изучение криптографии: https://wikipedia.org/wiki/Disk_encryption_theory
Дисковое шифрование одна из сложнейших задач криптографии - слишком много ньюансов надо решать.
-
Как посмотреть список поддерживаемых шифров ?
- Используйте команды
cryptsetup benchmark
иcryptsetup --help
- Детальнее тут: https://unix.stackexchange.com/questions/354787/list-available-methods-of-encryption-for-luks
- Используйте команды
-
Могу я изменить размер контейнера, сменить пароль или метод шифрования ?
- Этим скриптом - нет. Можете создать новый контейнер и скопировать файлы с помощью
cp
/mc
/rsync
. Ресайз контейнера возможен, но пока делается руками с помощью dd / cryptsetup resize / resizefs.
Чтобы это провернуть на существующем контейнере, вы должны хорошо понимать, как работает dm-crypt, петлевые устройства, блочные устройства и файловые системы в Linux. Будьте крайне аккуратны; Сделайте бэкапы ДО начала работ; Прочитайте документацию:
- https://wiki.gentoo.org/wiki/Dm-crypt
- https://geekpeek.net/resize-filesystem-fdisk-resize2fs/
- https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption
Проверьте результат и сделайте ещё один бэкап;
- Этим скриптом - нет. Можете создать новый контейнер и скопировать файлы с помощью
-
Что насчёт шифрованной подкачки ?
- Аналогично контейнерам, но используйте скрипт _swap.sh, парольная фраза будет случайной при каждом старте, точка монтирования не нужна, первые 512 байт не используются.
- Это древний скрипт, и в нём нет многих проверок. Используйте аккуратно.
-
Могу я использовать несколько ключей / пользователей ?
- Нет. Этот скрипт работает с обычным dm-crypt. Используйте LUKS для более сложных случаев.
-
Могу я разместить один контейнер в другом контейнере ? Это отрицаемое шифрование ?
- Вы можете поместить контейнер в другой контейнер (как и любой обычный файл), но это тестировалось не так плотно.
Как минимум, вы должны использовать различные имена файлов для контейнеров и различные метки внутренних файловых систем.
Это НЕ отрицаемое шифрование. Отрицаемое шифрование требует более сложного софта типа TrueCrypt или использования стеганографических утилит типа
steghide
- Вы можете поместить контейнер в другой контейнер (как и любой обычный файл), но это тестировалось не так плотно.
Как минимум, вы должны использовать различные имена файлов для контейнеров и различные метки внутренних файловых систем.
Это НЕ отрицаемое шифрование. Отрицаемое шифрование требует более сложного софта типа TrueCrypt или использования стеганографических утилит типа
-
Могу я разместить скрипты или контейнеры на съёмных устройствах ?
- Без проблем. Но вам возможно потребуются root-права (а применять правила sudo для съёмных дисков опасно), запускать скрипт в виде параметра к bash (ФС без атрибута исполнимости +x), скорость работы может быть меньше. Этот скрипт работает в таких Live-системах, как Knoppix, при запуске с раздела KNOPPIX-DATA.
-
Как переместить мои ключи PGP / SSH, биткоин-кошельки / генератор TOTP / приватные документы внутрь контейнера ?
- Убедитесь, что вы как следует запомнили парольную фразу. Дважды проверьте; Проверьте, что у вас есть БЭКАПЫ. Если вы забудете пароль, его почти невозможно восстановить; Брутфорс (взлом паролей перебором) dm-crypt весьма сложен.
- Создайте подкаталоги в контейнере и СКОПИРУЙТЕ ценные данные в файловую систему контейнера.
- Зачистите ценные данные с помощью
shred
на исходных нешифрованных томах; Обычноеrm
или удаление по кнопкам Del/F8 уязвимо для форензики и утилит восстановления данных. Для диcков SSD, удалите зачищенные shred-ом файлы и запустите процедуру TRIM командойfstrim
. - Создайте символические ссылки такого вида:
ln -s /media/MyNewContainer1/SSH/id_rsa ~/.ssh/id_rsa
(~/.ssh/id_rsa -> /media/MyNewContainer1/SSH/id_rsa) - Переместите ваши ценные приложения типа генератора TOTP (https://github.com/Aminuxer/Other-nix-Scripts/blob/master/totp.py) в подкаталог внутри контейнера.
-
Насколько большим / маленьким может быть криптоконтейнер dm-crypt ?
- Почти любым, но зависит от файловых систем. Я создавал мелкие контейнеры на 100 Кб с fat или ext2 внутри; Большие контейнеры на 200-300 Gb c ext4 / xfs тоже без проблем - если ваше оборудование исправно, проблем не наблюдалось. С версии 2021-10-30 в диалоге создания добавлены большие размерности - KMGTPEZY =) Я рекомендую хранить внутри контейнеров только реально критичные данные, чтобы размер контейнера был удобен для обслуживания / переноса / бэкапов / восстановления / архивирования; P.S. Архивирование считается плохой идеей с точки зрения криптографии; Но в большинстве случаев доступность и целостность предпочтительнее.
-
Могу я использовать этот скрипт на макинтоше с MacOS ?
- Нет. MacOS использует другие утилиты типа
hdiutil
и более древние версии coreutils. Теоретически возможно, но мне это не интересно. Вы может форкнуть репозиторий.
- Нет. MacOS использует другие утилиты типа