Шифрование данных в Linux. Использование шифрованной файловой системы по стандартам LUKS Общая идея реализации

  • 25.01.2022

В данной статье я попытаюсь сравнить производительность различных систем шифрования под 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, с чипом TPM или без него), или

  • нести код авторизации PBA (preboot authorization) (раздел /boot в этом случае) на съемном устройстве (например, смарт-карте или USB-накопителе).
  • Чтобы сделать это вторым способом, вы можете проверить проект Linux Full Disk Encryption (LFDE) по адресу: http://lfde.org/ , который предоставляет сценарий после установки, чтобы переместить раздел /boot на внешний USB-накопитель, зашифровав ключ с GPG и хранение его на USB тоже. Таким образом, слабая часть загрузочного пути (незашифрованный /boot раздел) всегда с вами (вы будете единственным с физическим доступом к расшифровке кода и ключу). (Примечание : этот сайт был потерян, и блог автора также исчез, однако вы можете найти старые файлы на https://github.com/mv-code/lfde , просто отметив, что последняя разработка была выполнена 6 лет назад). В качестве более легкой альтернативы вы можете установить незашифрованный загрузочный раздел на USB-накопителе при установке ОС.

    С уважением, М.В.

    Сделайте свой первый RAMdisk и / boot папку не использующим шифрование.

    Это вызовет «минимальное» ядро ​​с драйверами и поддержкой для переключения на «настоящую» корневую файловую систему, которая зашифрована.

    Прежде чем вы заявите «это взломать», помните – большинство (если не все) дистрибутивов Linux загружаются по умолчанию сегодня. Это явно позволяет вашей системе загружать и загружать корневую FS, используя модули, которые необходимо загрузить из файловой системы. (Вид проблемы с курицей и яйцом). Например, если ваша корневая файловая система была на томе аппаратного RAID-массива, и вам нужно было загрузить его драйвер, прежде чем вы сможете смонтировать корневой FS.

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

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

    У Ubuntu есть хорошая страница с инструкциями по созданию зашифрованных разделов, LMVP, папок и т. Д., Просто ваша версия вашего дистрибутива …

    Нет, я думаю, что нет.

    Вам действительно нужно шифровать / загружать? Я подозреваю, что нет. Остальная часть файловой системы может быть зашифрована обычным программным обеспечением Linux, которое находится в initramfs in / boot и запрашивает пользователя соответственно.

    Кажется, вы просите что-то, что невозможно сделать, и сравнивая его с решением Windows, которое скрывает реализацию от вас, но на самом деле делает то же самое, что делает Linux.

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

    Ответ намечен статьей. «Теперь это возможно с расширениями к загрузочному загрузчику следующего поколения GRUB2, который был исправлен, чтобы поддерживать не только« и «мы хотим установить новое изображение с поддержкой luks grub2 позже», и «Теперь мы скомпилируем источник GRUB2 с поддержкой LUKS. " Кажется, есть исправление или расширение, которое вам нужно получить и включить с GRUB2 или разветвленным источником GRUB2.

    Grub2 версии 2.02 ~ beta3 может многое сделать, что Grub2 версии 2.02 ~ beta2 не может сделать, проверено мной:

    1. Загрузка с использованием диска Super Grub 2
    2. Введите «c», чтобы перейти в командную строку
    3. Введите команды для монтирования зашифрованного раздела, который я хочу
      • insmod luks
      • cryptomount (hd0, #) // где # представляет зашифрованный раздел
    4. Введите ключевую фразу и введите несколько команд
      • multiboot (crypto0) /grub/i386-pc/core.img
      • ботинок

    Это загрузит еще один Grub2, который находится внутри зашифрованного раздела, злая сумасшедшая атака здесь не имеет места … Я загружаюсь с компакт-диска (только для чтения), а затем монтирует зашифрованный раздел (а не кодовую фразу, что-нибудь!), затем загрузка изнутри зашифрованного раздела и загрузка Grub2 со своим меню и т. д.

    Предупреждение: Grub2 версии 2.02 ~ beta2 не может сделать то же самое, поскольку имеет некоторые ошибки (которые, по-видимому, исправлены на Grub2 версии 2.02 ~ beta3), связанные с командой cryptomount …

    beta2 ошибки, о которых я говорю, являются:

    1. На самом деле он не монтирует зашифрованный раздел, поэтому он не позволяет вам получить доступ (crypto0) / *
    2. Если существует более одного зашифрованного раздела, использование cryptomount -a требует только одной кодовой фразы
    3. После запуска cryptomount один раз он запускается снова, ничего не делает

    на бета-версии 3:

    1. Он действительно монтирует зашифрованный раздел и позволяет вам получать доступ к файлам через (crypto0) / * или (crypto1) / * и т. Д., Если более одного установленного одновременно
    2. Он запрашивает каждую кодовую фразу (по одному за зашифрованный раздел)
    3. Это позволяет вам запускать его столько раз, сколько вам нужно, вы можете установить один, затем другой и т. Д.

    Боковое примечание: я не понял, как их размонтировать, кроме перезагрузки или загрузки другого или одного загрузочного загрузчика grub2 / other и т. Д.

    Надеюсь, это поможет прояснить ситуацию, и надеюсь, что версия Grub2 2.02 ~ beta3 будет интегрирована в LiveCD, поэтому мы можем установить ее без необходимости компилировать ее сами.

    PD: С диском Super Grub 2 я не вижу способа установить Grub2 версии 2.02 ~ beta3 на раздел MBR / boot и т. Д.

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

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

    Шифрование на уровне файловой системы:

    • 1. eCryptfs - это криптографическая файловая система Linux. Она хранит криптографические метаданные для каждого файла в отдельном файле, таким образом, что файлы можно копировать между компьютерами. Файл будет успешно расшифрован, если у вас есть ключ. Это решение широко используется для реализации зашифрованной домашней директории, например, в Ubuntu. Также ChromeOS прозрачно встраивает эти алгоритмы при использовании сетевых устройств для хранения данных (NAS).
    • 2. EncFS - обеспечивает шифрованную файловую систему в пространстве пользователя. Она работает без каких-либо дополнительных привилегий и использует библиотеку fuse и модуль ядра для обеспечения интерфейса файловой системы. EncFS - это свободное программное обеспечение и она распространяется под лицензией GPL.

    Блочное шифрование на уровне устройства:

    • Loop-AES - быстрая и прозрачная файловая система, а также пакет для шифрования раздела подкачки в Linux. Исходный код программы давно не изменялся. Она работает с ядрами 4.x, 3.x, 2.2, 2.0.
    • TrueCrypt - это бесплатное решение с открытым исходным кодом для шифрования диска в операционных системах Windows 7 / Vista /XP / Mac OS X, а также в Linux.
    • dm-crypt+LUKS - dm-crypt - это прозрачная подсистема для шифрования диска в ядре 2.6 и более поздних версиях. Поддерживается шифрование целых дисков, съемных носителей, разделов, томов RAID, программного обеспечения, логических томов и файлов.

    В этой инструкции мы рассмотрим шифрование жесткого диска на Linux с помощью алгоритма Linux Unified Key Setup-on-disk-format (LUKS).

    Как работает LUKS?

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

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

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

    Утилита Cryptsetup

    Утилита Cryptsetup позволят облегчить шифрование раздела Linux с помощью модуля dm-crypt. Давайте сначала ее установим.

    В Debian или Ubuntu, для этого используйте такую команду:

    apt-get install cryptsetup

    В дистрибутивах, основанных на Red Hat это будет выглядеть так:

    yum install cryptsetup-luks

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

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

    Рассмотрим основные операции, которые можно сделать с помощью этой утилиты:

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

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

    Шифрование диска Linux

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

    Создание раздела

    В этом примере мы будем шифровать раздел /dev/sda6, но вместо него вы можете использовать целый жесткий диск или просто один файл, заполненный нулями. Создаем шифрованный раздел:

    cryptsetup -y -v luksFormat /dev/sda6

    WARNING!
    ========
    This will overwrite data on /dev/sda6 irrevocably.

    Are you sure? (Type uppercase yes): YES
    Enter LUKS passphrase:
    Verify passphrase:
    Command successful.

    Эта команда выполнит инициализацию раздела, установит ключ инициализации и пароль. Указывайте такой пароль, чтобы его потом не забыть.

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

    Enter passphrase for /dev/sda6

    Теперь вы можете увидеть новое виртуальное устройство /dev/mapper/backup2 созданное с помощью команды luksFormat:

    ls -l /dev/mapper/backup2

    Чтобы посмотреть состояние устройства выполните:

    cryptsetup -v status backup2

    /dev/mapper/backup2 is active.
    type: LUKS1
    cipher: aes-cbc-essiv:sha256
    keysize: 256 bits
    device: /dev/sda6
    offset: 4096 sectors
    size: 419426304 sectors
    mode: read/write
    Command successful.

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

    cryptsetup luksDump /dev/sda6

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

    Форматирование раздела

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

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

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

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

    Когда процесс завершится мы можем отформатировать устройство в любую файловую систему. Например, отформатируем в ext4:

    mkfs.ext4 /dev/mapper/backup2

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

    Монтирование раздела

    Теперь можно примонтировать только, что созданную файловую систему:

    $ mount /dev/mapper/backup2 /backup2

    Отключение раздела

    Все работает, но как отключить устройство и защитить данные. Для этого выполните:

    cryptsetup luksClose backup2

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

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

    cryptsetup luksOpen /dev/sda6 backup2

    Теперь можем монтировать:

    mount /dev/mapper/backup2 /backup2

    Проверить файловую систему luks

    Поскольку после открытия раздела с помощью luks linux, этот раздел воспринимается системой, как и все другие, вы можете просто использовать утилиту fsck:

    sudo umount /backup2

    $ fsck -vy /dev/mapper/backup2

    $ mount /dev/mapper/backup2 /backu2

    Изменить парольную фразу luks

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

    cryptsetup luksDump /dev/sda6

    Затем создадим новый ключ:

    cryptsetup luksAddKey /dev/sda6

    Enter any passphrase:

    Enter new passphrase for key slot:
    Verify passphrase:

    И удалим старый:

    cryptsetup luksRemoveKey /dev/sda6

    Сейчас вам придется ввести еще старый пароль.

    Выводы

    Вот и все теперь вы знаете как зашифровать раздел в Linux, а также понимаете как все это работает. Кроме того, шифрование дисков в Linux по алгоритму LUKS открывает широкие возможности для полного шифрования устанавливаемой системы.

    Плюсы:

    • LUKS шифрует все блочное устройство, и поэтому очень хорошо подходит для защиты содержимого переносных устройств, таких как мобильные телефоны, съемные носители или жесткие диски ноутбуков.
    • Вы можете использовать на серверах NAS для защиты резервных копий
    • Процессоры Intel и AMD с AES-NI (Advanced Encryption Standard) имеют набор команд, которые могут ускорить процесс шифрования на основе dm-crypt в ядре Linux начиная с 2.6.32.
    • Работает в том числе и с разделом подкачки, так что ваш ноутбук может использовать функцию спящего режима, или гибернации полностью безопасно.

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


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

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

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

    В статье будет описана настройка следующих методов криптозащиты:
    dm-crypt/LUKS - создание криптоконтейнера с помощью device-mapper и CryptoAPI ядра;
    eCryptfs - шифрование на уровне файловых систем;
    EncFS - аналогично описанному выше, но не требует загрузки модулей ядра.

    DM-CRYPT/LUKS
    Существует два вида настройки dm-crypt - plain и LUKS. Отличие в том, что в случае использования LUKS в начале криптотома присутствуют метаданные, позволяющие использовать несколько ключей и изменять их. В то же время наличие подобного заголовка в некоторых случаях само по себе компрометирующе - впрочем, в большинстве подобных случаев будет компрометирующей и область с высокой степенью энтропии. Настройка plain dm-crypt с файлом ключа и парольной фразой Посмотрим, как настроить комбинацию из тома plain dm-crypt, зашифрованного с помощью ключевого файла, в свою очередь содержащегося в LUKS-контейнере. Для начала стоит определиться, как именно будут размещаться разделы. Существует три основных варианта:
    просто крипто-том;
    сперва крипто-том, затем поверх него LVM;
    сперва крипто-том, затем RAID, затем LVM.

    И всяческие комбинации. Давай попробуем второй вариант. Первым делом создадим контейнер LUKS для хранения ключевого файла, чтобы использовать этот файл вместе с ключевой фразой. В этом случае вероятность криптоанализа тома, зашифрованного с помощью plain dm-crypt, снижается:

    # dd if=/dev/zero of=/root/key.luks bs=512 count=2057

    # cryptsetup --align-payload=1 luksFormat /root/key.luks

    # cryptsetup luksOpen /root/key.luks cryptokey

    # dd if=/dev/urandom of=/dev/mapper/cryptokey

    Первая команда подготавливает файл контейнера, вторая этот контейнер создает, третья подключает, четвертая генерирует ключевую информацию. Стоит заметить, что опция –align-payload=1 нужна для того, чтобы размер метаданных LUKS составлял не 4096 512-байтовых блоков, а всего лишь 2056. Таким образом, на собственно ключевую информацию остается 512 байт.
    Затем переходим к созданию криптотома. На этом этапе по желанию можно также заполнить диск псевдослучайными данными, чтобы затруднить криптоанализ, если он будет. Затем уже можно создавать криптотом. Команда для этого выглядит следующим образом (естественно, в иных случаях идентификаторы могут отличаться, так что нужно быть внимательным):

    # cryptsetup --cipher=serpent-xts-plain64 --offset=0--key-file=/dev/mapper/cryptokey --key-size=512 open --type=plain/dev/disk/by-id/ata-VBOX_HARDDISK_VB05eadebe-f25e8d59 crypto0


    При необходимости надо повторить аналогичную команду и на других устройствах, для которых требуется шифрование. Затем создадим на криптотомах LVM и ФС на нем:

    Создадим файл /etc/initramfs-tools/hooks/cryptokeys примерно следующего содержания (служебная часть скрипта опущена):

    И файл /etc/initramfs-tools/scripts/local-top/cryptokeys (служебная часть опять
    же опущена):

    # <...>

    modprobe - b dm_crypt

    while ! (/ sbin / cryptsetup luksOpen / etc / crypto / key . luks cryptokey

    / dev / disk / by - id / ata - VBOX_HARDDISK_VB05eadebe - f25e8d59 crypto0

    && / sbin / cryptsetup plainOpen -- key - file = / dev / mapper / cryptokey

    / dev / disk / by - id / ata - VBOX_HARDDISK_VBc2414841 - cfeccde5 crypto1

    && / sbin / cryptsetup luksClose cryptokey

    ) ; do

    echo “Try again . . . ”

    done

    Эти два файла должны быть исполняемыми. Затем создаем initrd:

    # update-initramfs -u -k all -v

    При следующей перезагрузке будет запрошен пароль для LUKS-контейнера. В случае использования plain dm-crypt есть еще одна возможность - общий нижний слой, что позволяет сделать нечто наподобие скрытых томов TrueCrypt. Проще привести пример:

    # cryptsetup --cipher=serpent-xts-plain64 --offset=0--size=2097152 --shared open --type=plain/dev/disk/by-id/ata-VBOX_HARDDISK_VBcda8398f-f1f1deec crypto

    # cryptsetup --cipher=serpent-xts-plain64 --offset=2097152--size=2097152 --shared open --type=plain/dev/disk/by-id/ata-VBOX_HARDDISK_VBcda8398f-f1f1deec crypto_shared

    Размер и смещение указываются в 512-байтовых блоках.


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

    Наконец, добавляем новый ключ в систему:

    Рассмотрим и процедуру восстановления томов LUKS. Самый простой вариант, разумеется, когда есть копия заголовка. В этом случае для восстановления требуется всего одна команда:

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

    ENCFS
    Посмотрим, как настроить EncFS для автоматического монтирования при входе в систему. Для начала поставим нужные пакеты:

    При настройке в режиме эксперта будет задан ряд вопросов: тип шифра (доступны только AES и Blowfish), размер ключа, размер блока, как шифровать имена файлов - блочное шифрование (которое полностью скрывает имя файла, в том числе длину), потоковое (которое шифрует с максимально близкой длиной, что иногда удобно, если имена чересчур длинные и при использовании блочного шифра есть достаточно большая вероятность превысить максимально допустимую длину) или вовсе будет отсутствовать… В конце будет запрошен пароль, он должен совпадать с используемым для входа, в противном случае автомонтирование работать не будет.

    Следом нужно отредактировать файл /etc/security/pam_encfs.conf:

    И файл /etc/fuse.conf:

    И добавим пользователя в группу fuse:

    $ sudo usermod - a - G fuse $ USER

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

    ECRYPTFS
    Известно, что eCryptFS применяется в Ubuntu как средство по умолчанию для защиты домашних каталогов. Посмотрим, как оно работает, - создадим шифрованный каталог вручную. Установим пакеты:

    СозданиеeCryptFS

    И смонтируем ФС (при первом монтировании создаются все необходимые метаданные):

    $ sudo mount - t ecryptfs / home / rom / . secret / home / rom / secret

    Будет запрошена парольная фраза (всего один раз, повторный ввод не реализован, что выглядит не очень хорошим решением, учитывая, что она должна быть длинной), затем будет запрошен тип шифра (AES, Blowfish, 3DES, Twofish, CAST6 и CAST5), размер ключа, задан вопрос, разрешить или запретить нешифрованные файлы в каталоге с зашифрованными, шифровать ли имена файлов… и в финале спросит, действительно ли желаем подмонтировать и сохранить ли сигнатуру в определенный файл. Вопрос не настолько глупый, как может показаться сначала: в данном ПО при отсутствии сигнатуры не существует возможности отличить правильный пароль от неправильного.

    Шифрование домашнего каталога пользователя

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


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

    Посмотрим, как его восстанавливать. Предположим, что парольная фраза не записана и восстановление идет с Live CD. Подразумевается, что ФС подмонтирована. Переходим в каталог home/.ecryptfs/rom/.ecryptfs и набираем команду:

    dm-verify
    Модуль dm-verify предназначен для проверки целостности блочных устройств. Верификация ведется с помощью hash tree, где «листья» - хеш-суммы блоков, а «ветви» - хеш-суммы наборов «листьев». Таким образом, для верификации блочного устройства (будь то раздел или диск) достаточно проверить всего одну контрольную сумму.
    Этот механизм (вкупе с цифровой подписью) применяется в некоторых Android-устройствах для защиты от модификации системных разделов, а также в Google Chromium OS.

    ЗАКЛЮЧЕНИЕ
    Linux содержит действительно немало средств для криптографической защиты информации. Из трех описанных средств как минимум одно присутствует во всех современных дистрибутивах Linux. Но что же выбрать?
    dm-crypt/LUKS стоит применять в тех случаях, когда есть возможность быстро отключить зашифрованный том и когда резервные копии либо не нужны, либо засекречиваются иным путем. В этом случае данное решение более чем эффективно, особенно с учетом того, что шифровать можно каскадом произвольной вложенности и типа (например, AES-Twofish-AES), - настоящий рай
    для параноиков.
    eCryptFS подходит в тех случаях, когда нужно шифрованные данные куда-то сохранять - к примеру, в облако. Она обеспечивает довольно надежноешифрование (хотя в 128-битном варианте, используемом по умолчанию, есть возможность снижения криптостойкости на два бита) и для конечного пользователя прозрачна.
    EncFS же - старичок примерно десятилетней давности, базирующийся на еще более древних работах. К настоящему времени не рекомендован к использованию из-за потенциальных дыр в безопасности, но может применяться в качестве кросс-платформенного средства для защиты несенситивных данных в облаках.

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