Шифрование диска в linux debian. Шифрование жесткого диска в Linux. Шифрование при помощи модуля loop-aes

Шифрование домашнего каталога обеспечивает надежную защиту данных, хранящихся на жёстком диске или ином носителе. Шифрование особенно актуально на переносных ПК, на компьютерах с множественным доступом, а также в любых других условиях. Шифрование домашнего каталога предлагается при установке Linux Mint.

Основная загвоздка при полном шифровании домашнего каталога состоит в том, что необходимо «вынести» каталог с зашифрованными данными за пределы точки монтирования.

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

Не шифровать SWAP при шифрованном домашнем каталоге – потенциально опасно, так как там могут оказаться данные из шифрованных файлов в открытом виде – весь смысл шифрования теряется. Начиная с 14-ой версти Linux Mint, при установке есть возможность выбрать вариант шифрования всего диска. Этот вариант наиболее подходит для сохранения персональных данных на переносных устройствах (у которых, как правило, только один пользователь).

1.3 Шифрование в gnome – Seahorse

В Linux Mint есть встроенная утилита «Пароли и ключи» или же Seahorse. Используя её возможности пользователь может оперировать всеми ключами, паролями, а также сертификатами которые имеются в данной ОС.

По сути Seahorse – это приложение для GNOME (GNOME – свободная среда рабочего стола для Unix-подобных операционных систем), являющееся фронтэндом к GnuPG (свободная программа для шифрования информации и создания электронных цифровых подписей) и предназначенное для управления ключами шифрования и паролями. Пришел на замену GNOME Keyring, которого полностью заменил в GNOME 2.22, хотя был анонсирован еще в GNOME 2.18. Позволяет производить все операции которые ранее необходимо делать в командной строке и объединяя их под едиными интерфесом:

    управлять безопасностью своей рабочей среды и ключами OpenPGP и SSH;

    шифровать, расшировывать и проверять файлы и текст;

    добавлять и проверять цифровые подписи к документам;

    синхронизировать ключи с ключевыми серверами;

    создавать и публиковать ключи;

    резервировать ключевую информацию;

    добавлять к изображениями в любом поддерживаемом GDK как OpenGPG photo ID;

1.4 TrueCrypt

TrueCrypt обладает достаточно удобным графическим интерфейсом, но, к сожалению, разработчики жестко зашили в код интеграцию с файловым менеджером Nautilus.

Для шифрования данных можно использовать разные методы.

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

Создание зашифрованных разделов/файлов

Создание файл ключа:

truecrypt -create-keyfile /home/user/test/file , где file – название файла-ключа.

Создание контейнера, в данном случае раздела:

sudo truecrypt -k /home/user/test/file -c /dev/sda9

Вместо раздела /dev/sda9 вполне можно указать и файл, например /home/user/test/cryptofile, но в этом случае необходимо будет указать его размер, это делается параметром -size=5G до параметра -c. В указанном примере создастся файл cryptofile размером 5 Гбайт. Иногда TrueCrypt принимает размер только в байтах, для 5 Гбайт можно или высчитать значение заранее и указать -size=5368709120, или же записать следующим образом: -size=`echo 1024^3*5 | bc`.

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

При создании будет предложен выбор типа контейнера (нормальный / скрытый), файловой системы (FAT, ext2/3/4 или без ФС), в данном примере был выбран режим без использования ФС. Также будет предложен выбор алгоритма шифрования (например, AES), а так же hash-алгоритм (например, SHA-1) для шифрования потоков данных.

TrueCrypt используется для шифрования данных налету, то есть можно, подмонтировав контейнер, работать с находящимися в нём файлами как обычно (открывать/редактировать/закрывать/создавать/удалять), что очень удобно.

Шифрованный раздел/файл был создан. Теперь, если необходимо его внутреннюю файловую систему (далее ФС) отформатировать под нужную, следует сделать следующее.

Выбрать необходимый раздел используя Truecrypt:

truecrypt -k /home/user/test/file /dev/sda9

По умолчанию будет задействован созданный Truecrypt девайс /dev/mapper/truecrypt0. По обращению к этому девайсу, можно менять, например ФС в шифрованном контейнере. В данном случае это нужно сделать.

sudo mkfs.ext4 -v /dev/mapper/truecrypt0

Этим самым была сделана ФС ext4 внутри данного шифрованного контейнера.

Далее, так как данный контейнер уже «прикреплён» к девайсу /dev/mapper/truecrypt0, то осталось его просто примонтировать к какой-нибудь директории. Эта директория для монтирования должна уже существовать в системе.

sudo mount /dev/mapper/truecrypt0 /mnt/crypto , где /mnt/crypto – директория, к которой примонтирован шифрованный контейнер.

truecrypt -d

Теперь без знания файла-ключа и пароля никто не сможет прочесть спрятанную информацию.

В данной статье я попытаюсь сравнить производительность различных систем шифрования под linux. В теории, конечно, известно, какая система производительнее, и попытки посчитать производительность разных систем были (). Truecrypt даже содержит встроенный бенчмарк (который показывает, однако, производительность на RAM, его можно использовать разве что для оценки скорости разных алгоритмов шифрования). Я же сделаю несколько другое - измерю скорость файловой системы, зашифрованной разными средствами, в процентном соотношении по сравнению с обычной нешифрованной файловой системой.


Шифровать будем отдельный раздел на отдельном HDD, не содержащий корневую файловую систему, алгоритмом, использующимся по-умолчанию в каждом конкретном случае. Как обычный пользователь, я не разбираюсь в нюансах стандартов шифрования (например, чем отличается хэширование RIPEMD-160 от Whirpool, какой из этих режимов быстрее, какой способствует более высокой защите), поэтому просто положимся на то, что производители каждого программного продукта выбрали достаточно криптостойкие параметры по-умолчанию. Может, это и не совсем корректно, т. к. производительность различных алгоритмов шифрования неодинакова. При желании, конечно можно сменить тип шифрования, но я не уверен, что во всех тестируемых продуктах существует абсолютно идентичный набор алгоритмов. Тестировать будем:

3) eCryptfs - система, по умолчанию предлагаемая пользователям Ubuntu для шифрования домашних каталогов, поэтому и включена в данный тест. Работает поверх уже существующей ФС. Шифрует каждый файл отдельно, поэтому всем видны права, даты изменения, количество зашифрованных файлов; по-умолчанию также видны имена файлов, хотя и существует опция для их шифрования. Самое малофункциональное средство из представленных.

4) EncFS - примерный аналог eCryptfs, но использует FUSE.

Итак, для тестов выделена отдельная машина довольно преклонного возраста в следующей конфигурации: ЦП - Intel Celeron 2000Mhz, ОЗУ - 512 Mb DDR PC2700, системный HDD - WD Caviar SE 5400 RPM 80Gb, тестовый HDD - WD Caviar SE 7200 RPM 80Gb.
ОС - Ubuntu 12.04 LTS, версии всего ПО актуальные для репозиториев этой ОС на момент написания статьи (Truecrypt 7.1a-linux-x86 не из репозиториев).

Тестировать будем дефолтную для большинства дистрибутивов файловую систему ext4. Для тестирования производительности будем использовать утилиту iozone3 и написанный «на коленке» shell-скрипт для измерения процентной разницы в тестах.

Скрипт для подсчёта. Особое внимание чистоте кода не уделялось, единственным критерием при написании было наличие правильного результата.

#!/bin/sh gendifffile () { #процедура генерирует файл, который удобно анализировать. Во-первых, обрезаются #не подлежащие анализу строки; во-вторых, в каждой строке обрезаются первых два числа, обозначающие #размер файла и размер записи соответственно; в-третьих, весь файл выводится построчно - #один результат теста на одну строку cat $1 | while read LINE ; do echo $LINE| grep "^[[:space:]]*[[:digit:]]" | awk "{for (i=3;i<=NF;i++) {print $i}}" done >> $2 } getline () { #процедура выводит строку номер $2 файла $1 head -n $2 "$1" | tail -n 1 } compare () { #процедура сравнивает построчно файлы $1 и $2, вычисляя процентную разницу каждой пары тестов #затем вычисляется среднее арифметическое значение, на сколько процентов быстрее или медленнее #файл, содержащий первую группу тестов, файла, содержащего вторую группу P=0 MAX=0 L1=`cat "$1" | wc -l` #количество тестов в файле L2=`cat "$2" | wc -l` if [ $L1 -ne $L2 ]; then #если файлы содержат разное количество тестов, то сравнивать их мы не будем echo error return fi STEP=$(($L1*5/100)) J=0 for I in `seq 1 $L1`; do J=$(($J+1)) if [ $J -eq $STEP ]; then J=0 echo "$((100*$I/$L1))% завершено ($I из $L1)" fi A=`getline "$1" $I` B=`getline "$2" $I` if [ `echo $A \> $B|bc -l` -eq 1 ]; then D=`echo "100-($B*100/$A)"|bc -l` if [ `echo $D \> $MAX| bc -l` -eq "1" ]; then MAX=$D sleep 5 fi else D=`echo "100-($A*100/$B)"|bc -l` if [ `echo $D \> $MAX| bc -l` -eq "1" ]; then MAX=$D sleep 5 fi D="-$D" #если значение имеет знак "-", значит, данный тест был выполнен быстрее #во втором файле, а не в первом fi P=`echo "$P+$D"| bc -l` done P=`echo $P/$L1| bc -l` #вычислим среднее арифметическое echo PERCENT=$P MAX_PERCENT=$MAX } genaverage () { #процедура генерации подготовленного к анализу файла, каждой строкой которого является #среднее арифметическое соответствующих строк всех файлов отчётов, лежащих в анализируемой директории AVG=`mktemp` F=`ls "$1"|wc -l` #количество файлов с отчётами в заданной директории #при условии, что там хранятся только такие файлы и больше ничего другого #проверять корректность данного допущения мы не будем if [ ! -d "$1" -o $F -lt 2 ]; then echo error >/dev/stderr #в этой процедуре будем выводить все сообщения в stderr, т.к. #stdout подставляется в другую процедуру rm -f $AVG exit fi TMP=`mktemp` find "$1" -type f| while read FILE; do #для каждого файла отчёта iozone, лежащего в заданной директории I=`mktemp` #сгенерируем временный файл, подготовленный для анализа gendifffile "$FILE" "$I" #имена всех таких файлов запишем в "TMP" построчно echo "$I">>$TMP done L=`cat \`getline "$TMP" 1\`|wc -l` cat "$TMP"| while read LINE; do #немного проверок не помешает L1=`cat "$LINE"| wc -l` #все ли файлы содержат одинаковое количество тестов if [ $L -ne $L1 ]; then echo error >/dev/stderr exit fi done STEP=$(($L*5/100)) J=0 for I in `seq 1 $L`; do J=$(($J+1)) if [ $J -eq $STEP ]; then J=0 echo "$((100*$I/$L))% завершено ($I из $L)" >/dev/stderr fi SUMFILE=`mktemp` #таким образом я получаю значение переменной SUM из вложенного цикла SUM=0 cat "$TMP"| while read LINE; do SUM=$((`getline "$LINE" $I`+$SUM)) echo $SUM > "$SUMFILE" done echo `tail -n 1 "$SUMFILE"`/$F|bc -l >> $AVG #получаем среднее арифметическое #и запишем его в соответствующее место #файла AVG rm -f "$SUMFILE" done cat "$TMP"| while read LINE; do #удалим временныe файлы rm -f "$LINE" done rm -f "$TMP" echo $AVG } printf %b "\\033-chainmode-ivmode[:ivopts]> [<#opt_params> ]

Шаг 02: Рассматриваем LUKS

Как мы уже видели на предыдущем шаге, приложение dm-crypt может самостоятельно шифровать / расшифровывать данные. Но у него есть несколько недостатков - если приложением dm-crypt пользоваться непосредственно, то оно не будет создавать на диске метаданные, и это может стать серьезной проблемой в случае, если вы хотите обеспечить совместимость между различными дистрибутивами Linux. Кроме того, приложение dm-crypt не поддерживает использование несколько ключей, тогда как в реальных ситуация очень важно пользоваться несколькими ключами.

Именно по этим причинам на свет появилась методика LUKS (Linux Unified Key Setup — Унифицированная настройка ключей в Linux). LUKS является в Linux стандартом шифрования жестких дисков и стандартизация позволяет обеспечить совместимость различных дистрибутивов. Также поддерживается использование нескольких ключей и парольных фраз. В рамках такой стандартизации к зашифрованным данным добавляется заголовок LUKS и в этом заголовке присутствует вся информация, необходимая для настройки. Когда есть такой заголовок с данными, то пользователи могут легко перейти на любой другой дистрибутив. Сейчас в проекте dm-crypt рекомендуется использовать LUKS в качестве предпочтительного способа настройки шифрования диска. Давайте рассмотрим, как установить утилиту cryptsetup и как ее использовать для создания томов на основе LUKS.

Шаг 03: Установка

Функциональные возможности уровня ядра, которые применяются в dm-crypt, уже есть во всех дистрибутивах Linux; нам нужно к ним только интерфейс. Мы будем пользоваться утилитой cryptsetup, с помощью которой можно создавать тома с использованием dm-crypt, стандарта LUKS, а также старого и доброго приложения TrueCrypt. Для того, чтобы установить cryptsetup на дистрибутивах Debian / Ubuntu, вы можете воспользоваться следующими командами:

$ sudo apt-get update $ sudo apt-get install cryptsetup

Первая команда синхронизирует индексные файлы ракета с содержимым их репозиториев: она получает информацию о последних версиях всех доступных пакетов. Вторая команда загрузит и установит на ваш компьютер пакет cryptsetup. Если вы используете дистрибутив RHEL/Fedora/CentOS, то для установки утилиты cryptsetup вы можете воспользоваться командой yum.

$ yum install cryptsetup-luks

Шаг 04: Создание целевого файла

Теперь, когда утилита cryptsetup успешно установлена, мы должны создать целевой файл, в котором будет храниться контейнер LUKS. Хотя есть много способов создания такого файла, при его создании необходимо выполнить ряд условий:

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

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

$ dd if=/dev/random of=/home/nitish/basefile bs=1M count=128

В результате в каталоге /home/nitish будет создан файл с именем basefile, имеющий размер в 128 МБ. Однако, учтите, что на выполнение этой команды может потребоваться достаточно большое время; в системе, которой пользовался наш эксперт, на это потребовался час времени.

Шаг 05: Создаем dm-crypt LUKS

После того, как вы создали целевой файл, в этом файле необходимо создать раздел LUKS. Этот раздел служит в качестве основного слоя, на базе которого строится все шифрование данных. Кроме этого, в заголовке этого раздела (LUKS header) содержится вся информация, требуемая для совместимости с другими устройствами. Чтобы создать раздел LUKS применяется команда cryptsetup:

$ cryptsetup -y luksFormat /home/nitish/basefile

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

$ file basefile

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

Шаг 06: Создаем и монтируем файловую систему

Контейнер LUKS, который мы создали на предыдущем шаге, теперь доступен в виде файла. В нашем примере, это /home/nitish/basefile. Утилита cryptsetup позволяет открывать контейнер LUKS как независимое устройство. Чтобы сделать это, сначала отобразите файл контейнера на имя устройства, а затем смонтируйте устройство. Команда, осуществляющая отображение, выглядит следующим образом:

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

Шаг 07: Файловая система - продолжение

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

$ mkfs.ext4 -j /dev/mapper/volume1

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

$ mkdir /mnt/files

Теперь выполняем монтирование:

Для перекрестной проверки воспользуйтесь командой df –h - вы в конце списка смонтированные устройств увидите устройство "/dev/mapper/volume1". Видно, что заголовок LUKS уже занимает в устройстве уже некоторое место.

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

Шаг 08: Использование шифруемого диска

Мы выполнили несколько шагов для того, чтобы достичь этого результата, и если вам не очень понятно, как все это работает, вы, скорее всего, запутаетесь в том, что нужно сделать только один раз (требуется для установки), и в том, что нужно делать регулярно при использовании шифрования. Давайте рассмотрим следующий сценарий: вы успешно выполнили все описанные выше шаги, а затем выключили компьютер. На следующий день, когда вы запускаете ваш компьютер, вы не в состоянии найти смонтированное устройство - куда оно делось? Чтобы со всем этим разобраться, нужно иметь в виду, что после запуска системы нужно смонтировать контейнер LUKS, а перед остановкой компьютера - размонтировать.

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

Откройте файл LUKS (т.е. /home/nitish/basefile) и введите пароль. Команда выглядит следующим образом:

$ cryptsetup luksOpen /home/nitish/basefile volume1

После того, как файл будет открыт, смонтируйте его (если он не монтируется автоматически):

$ mount /dev/mapper/volume1 /mnt/files

Теперь вы можете использовать смонтированное устройство как обычный диск и читать с него или записывать на него данные.

После того, как все сделаете, размонтируйте устройство следующим образом:

$ umount /mnt/files

После успешного размонтирования, закройте файл LUKS:

$ cryptsetup luksClose volume1

Шаг 09: Резервное копирование

Большинство потерь данных, хранящихся в контейнере LUKS, связаны с повреждением заголовка LUKS или слотов с ключами. Кроме того, что даже из-за случайной перезаписи в память заголовка могут быть повреждены заголовки LUKS, в реальных условиях также возможен полный выход жесткого диска из строя. Лучший способ защититься от таких проблем — это резервное копирование. Давайте посмотрим, какие доступны варианты резервного копирования.

Чтобы создать резервную копию файла заголовка LUKS, укажите в команде параметр luksHeaderBackup:

$ sudo cryptsetup luksHeaderBackup /home/nitish/basefile --header-backup-file /home/nitish/backupfile

Или, если вы хотите восстановить файл из резервной копии, то укажите в команде параметр luksHeaderRestore:

$ sudo cryptsetup luksHeaderRestore /home/ nitish/basefile --header-backup-file /home/nitish/backupfile

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

$ sudo cryptsetup -v isLuks /home/nitish/basefile

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

$ cat /home/nitish/basefile > basefile.img

Шаг 10: Различные настройки

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

Чтобы сделать дамп заголовка LUKS, в команде cryptsetup есть параметр luksDump. Он позволит вам сделать снимок файла заголовка LUKS того устройства, которое вы используете. Пример команды выглядит следующим образом:

$ cryptsetup luksDump /home/nitish/basefile

В начале данной статьи мы упоминали о том, что LUKS поддерживает работу с несколькими ключами. Давайте сейчас это увидим в действии, добавив новый слот ключа (прим.пер.: слот ключа — место под ключ ):

$ cryptsetup luksAddKey --Key-slot 1 /home/nitish/basefile

Эта команда добавляет ключ к слоту ключа с номером 1, но только после того, как вы введете текущий пароль (ключ, присутствующий в слоте ключа 0). Всего есть восемь слотов ключей, и вы можете расшифровывать данные с использованием любого ключа. Если вы после того, как добавили второй ключ, сделаете дамп заголовка, вы увидите, что второй слот ключа занят.

Вы можете удалить слоты с ключами следующим образом:

$ cryptsetup luksRemoveKey /home/nitish/basefile

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

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

UPD: Поскольку этот пост был готов ещё месяц назад, тогда я даже не мог представить настолько странную и неожиданную смерть проекта . Ну да, возможно, он ещё не совсем помер , посмотрим… Тем не менее, в этом тексте я решил оставить все ссылки на TrueCrypt как есть.

Что такое «правдоподобное отрицание»?

Вы можете найти весьма длинное и подробное описание этого понятия в Википедии: http://en.wikipedia.org/wiki/Plausible_deniability . Если коротко, это значит, что вы можете обладать чем-то (или могли сделать что-то), наличие чего не может быть никем заподозрено или доказано (если в этом не признаться самостоятельно, конечно). И впоследствии вы можете отрицать наличие (или факт совершения) этого чего-то, если кто-то захочет вас обвинить, поскольку (повторюсь) этот факт недоказуем. Ну например, если ребёнок пнул под зад своего маленького брата, и брат пошёл искать справедливости у родителей, что в этом случае произойдёт?

Ну… Как бы ничего не произойдёт. Потому что этот чувак будет отнекиваться, а родители, формально говоря, не смогут его поймать за руку (поскольку, во-первых, тупо нет свидетелей, а во-вторых, младший братец может вести свою грязную игру). Таким образом, никого не накажут. Ну или накажут обоих на всякий пожарный. Это как раз был пример использования возможности правдоподобного отрицания ребёнком, склонным к агрессии. Но мы-то с вами, безусловно, белые и пушистые, и будем использовать скрытые контейнеры исключительно в целях защиты своих персональных данных от плохих парней. Так ведь? Безусловно, «что такое „хорошо”, и что такое „плохо”» - это отдельный вопрос… Однако, ближе к делу.

Общая идея реализации

Предположим, мы хотим сохранить некие важные данные внутри зашифрованного файла. В общем случае мы будем использовать какую-то программу криптозащиты, которая будет делать за нас всю грязную работу. Возможно, мы захотим работать с зашифрованным файлом как с виртуальным диском, и это значительно сужает число потенциальных кандидатов. Однако, есть одно «но». Практически все подобные программы работают с файлом как с одним куском зашифрованных данных. Поясню: у пользователя обычно есть один пароль (и, быть может, несколько «запасных») для всех данных внутри контейнера. Это означает наличие как минимум одного слабого звена: пароля на контейнер. Я не хочу упоминать о том, что пароль должен быть криптографически надёжным, поскольку это прописная истина. Я имею в виду, что если пользователь по какой-то причине сдаст этот пароль (например, под давлением), все данные будут прочитаны. И этот факт мне кажется печальным и совершенно неправильным…

Хотя вообще-то надежда есть. :) Например, существует такая программа, как , которая является достаточно умной. Пользователь может создать в одном файле два контейнера: один «подставной» с некоторым количеством «запрещённых», но относительно безопасных файлов, а другой - настоящий, с данными, которые не должны засветиться ни в коем случае. Таким образом, TrueCrypt запрашивает два разных пароля, когда пользователь хочет создать подобный «двойной» контейнер. При работе пользователь вводит только один пароль для «настоящей» части и работает с ней. В том случае, если под давлением внешних обстоятельств пользователь вынужден раскрыть содержимое контейнера третьим лицам, он просто вводит другой пароль, и TrueCrypt открывает «фальшивку». Я подчёркиваю (и это действительно важно), что не существует возможности доказать наличие скрытой части, если исследователь не знает соответствующего пароля.

А теперь давайте быстренько разберёмся, как работает это барахло… На самом деле всё очень просто. Софт делит файл-контейнер на две (вообще говоря, неравные) части. Первая часть, которая может быть относительно небольшой, содержит специально подготовленные данные; вторая - настоящие. Соответственно, программа должна уметь работать с двумя различными заголовками (конфигурациями) для двух разных частей, а также уметь выбирать, какую часть расшифровывать в зависимости от введённого пользователем пароля. А это, надо сказать, не самая тривиальная часть работы. Ну просто потому, что «официально» должна быть видна только одна, «фальшивая», конфигурация: если у контейнера есть стандартный заголовок, это должен быть только «фальшивый» заголовок; если параметры контейнера хранятся в отдельном конфиге, этот конфиг должен позволять расшифровать только «фальшивую» часть. И после расшифровки «фальшивой» части не должно появиться ни одного намёка на наличие реальной. Они должны быть абсолютно независимыми. Более того, когда открыта «фальшивая» часть, софт должен показывать полную ёмкость крипто-контейнера, даже в том случае, когда объём этой части намного меньше.

Так что там про LUKS-то?

Ну тут у нас есть хорошие новости и… эм… ещё боле хорошие новости.

Хорошие новости заключаются в том, что cryptsetup умеет расшифровывать и монтировать тома, созданные TrueCrypt"ом. Только для чтения, впрочем, но это ерунда. Поскольку есть новости и получше. А именно, мы можем создавать «скрытые» контейнеры исключительно средствами cryptsetup "а. Более того, эта утилита позволяет создать любое количество «скрытых» частей. Естественно, в разумных пределах. И вот каким образом это можно сделать.

Но перед тем, как продолжить,

ОГРОМНОЕ ЖИРНОЕ СТРАШНОЕ ПРЕДУПРЕЖДЕНИЕ!!!

  • Всё, что описано ниже, может стать причиной необратимой потери данных.
  • В вашей стране может быть запрещено использование сильной криптографии, так что вас могут посадить не за реальную информацию, а просто за наличие крипто-контейнера, который найдут на вашем винте.
  • Криптография может защитить ваши данные, однако она не защитит вас от пыток. Скрытый контейнер может помочь сохранить ценную информацию, но вы не сможете отрицать его наличие в случае предательства или доноса.
  • Ребята, которых заинтересовали ваши зашифрованные данные, могут оказаться не настолько тупыми, как вы ожидали. Даже если они не смогут доказать наличие скрытой части контейнера, они вполне могут запереть вас в одной камере с матёрыми уголовниками, и через пару суток вы вспомните все пароли ко всем скрытым данным.
  • Если у вас есть близкие люди (девушка/парень, родственники, друзья), они точно так же могут стать мишенью для жёсткого прессинга. И это наверняка поможет значительно быстрее вспомнить вообще всё, включая то, чего вы даже и не знали.

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

Так вот, man cryptsetup способен рассказать нам множество интересных подробностей о параметрах командной строки этой утилиты. Ну например, давайте глянем на опцию --header :

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

Ещё одна весьма полезная опция - это --align-payload , которая позволяет расположить настоящие данные по определённому смещению относительно начала тома:

И это тоже классно, потому что теперь мы свободно можем сдвигать наши данные в любую часть тома. Идею улавливаете, да?

  1. Инициализируем том для шифрования: полностью перезаписываем его случайными данными.
  2. Делаем «официальный» зашифрованный том и скидываем на него немножко заражённого вареза, спираченного музла, прона полезных свободных программ, записей вашей любительской рок-группы, фильмов про любовь и т.п., в общем, того, за что вам дадут не больше двух лет условно.
  3. Используя указанные выше эзотерические опции cryptsetup "а, создаём скрытый том (внутри «официального») и выносим его заголовок на внешний носитель. Здесь вы можете хранить по-настоящему опасную информацию (типа ваших детсадовских фоток или планов по завоеванию мира).

Собственно, народ, это всё. Никакой магии. Естественно, нельзя забивать «официальный» шифрованный диск под завязку по той простой причине, что часть его пространства отдана под скрытый контейнер. И, как я уже сказал в начале, вы можете, если хотите, создать несколько скрытых дисков, следуя той же логике.

Вот… А если вам всё же нужны подробности, то специально для вас -

Пошаговое руководство

Внимание!

Следующие ниже команды приведут к уничтожению ваших данных, если выполнить их, не включая мозги. Утерянную информацию невозможно будет восстановить, поскольку утилиты типа dd работают на низком уровне (то есть, ниже уровня файловой системы). Поэтому невозможно будет откатить изменения или отменить их действие, даже если вы прервёте выполнение сразу же после запуска.

Короче, не делайте этого, если не можете придумать осмысленного объяснения тому, как каждый шаг соотносится с вашими целями. И сделайте бэкап. Сейчас же.

Итак, предположим, у нас есть некое устройство с несколькими разделами. Пусть это будет, например, /dev/sdb. И пусть /dev/sdb1 будет относительно небольшим (8ГБ) разделом, предназначенным для шифрования. Мы разделим его 5 к 3, где 5-гиговая часть будет «официальной», а 3-гиговая - скрытой. Положим также, что ключ для зашифрованного диска мы будем держать в /etc/keys, а заголовок скрытого контейнера, соответственно, на внешнем USB-накопителе, который смонтируем в /media/user/ExtUSBStick. Я полагаю, вы уже в курсе, какие разрешения нужно выставить на хранилище ключей, как настроить encfs/ecryptfs для безопасного хранения конфиденциальных данных на небезопасных устройствах, а также о том, что реальные секретные ключи имеет смысл скопировать и хранить в нескольких территориально разделённых сейфах.

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

    Инициализация устройства /dev/sdb1:

    Dd if=/dev/urandom of=/dev/sdb1 bs=16M

    Делаем ключ для шифрованного тома. 512 битов (64 байтов) для наших целей выше крыши:

    Dd if=/dev/urandom bs=64 count=1 >/etc/keys/secret.key 2>/dev/null

    Шифруем том, используя только что созданный ключик:

    Cryptsetup luksFormat /dev/sdb1 /etc/keys/secret.key

    Открываем шифрованное устройство и настраиваем маппинг в secretdata:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key \ /dev/sdb1 secretdata

    Создаём на зашифрованном томе файловую систему (напр., btrfs):

    Mkfs.btrfs -L SecretData /dev/mapper/secretdata

    … и монтирум её:

    Mount /dev/mapper/secretdata /var/secretdata/

    Памятуя о 5-гиговом ограничении, устанавливае квоту для подтомов:

    Btrfs quota enable /var/secretdata/

    Поскольку квоты btrfs действуют только для подтомов, давайте создадим одну такую штуку:

    Brfs subvolume create /var/secretdata/workingvolume

    … и применим к нему указанную квоту (обратите внимание, что подтома btrfs могут быть смонтированы как обычные файловые системы, так что, возможно, впоследствии вам будет удобнеее монтировать именно этот подтом вместо всей фс):

    Btrfs qgroup limit 5G /var/secretdata/workingvolume

    Заполняем его какими-то данными:

    Debootstrap --variant=buildd testing /var/secretdata/workingvolume

    Ну и всё, теперь об этой части можно забыть:

    Umount /var/secretdata cryptsetup luksClose secretdata

    Сейчас создадим «рыбу» для заголовка и напихаем в неё случайного мусора:

    Dd if=/dev/urandom of=/media/user/ExtUSBStick/hidden.head bs=4M count=1

    А вот теперь наступает тот самый момент, когда начинается настоящая магия. (Что? Я сказал, что никакой магии нет? Значит я наврал.) Мы используем тот же самый секретный ключ, однако, не целиком, а только половину (со смещения в 32 байта). Тем не менее, оставшиеся 256 случайных бит вполне способны стать хорошим ключом. Затем мы отделим заголовок и положим его на флэшку. И наконец, мы скажем cryptsetup "у, что хотим сместить наш скрытый контейнер на 5ГБ (т.е. на 10485760 512-байтных блоков) относительно начала тома:

    Cryptsetup --keyfile-offset 32 --header /media/user/ExtUSBStick/hidden.head \ --align-payload 10485760 luksFormat /dev/sdb1 /etc/keys/secret.key

    Да-да, всё настолько просто. Теперь откроем новое зашифрованное устройство:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key --keyfile-offset 32 \ --header /media/user/ExtUSBStick/hidden.head /dev/sdb1 realsecretdata

    Накатим любую фс, какую захотим:

    Mkfs.btrfs /dev/mapper/realsecretdata

Полезные ссылки

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

  • Disk encryption , общая информация по шифрованию дисков: https://wiki.archlinux.org/index.php/Disk_encryption
  • Отрицаемое шифрование , концепция несколько более узкая, нежели «правдоподобное отрицание», относящаяся только к области криптографии: https://ru.wikipedia.org/wiki/Отрицаемое_шифрование
  • TrueCrypt