Шифрование linux. Шифрование жесткого диска в Linux. Проверить файловую систему luks

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

    : - Русский

    Активная разработка страницы завершена

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

    Шифрование данных в Debian

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

    Шифрование при помощи cryptsetup

    Установим необходимые компоненты:

    # apt-get install cryptsetup

    Стандартный синтаксис

    /dev/sda2 . Введем команду:

    # cryptsetup create sda2_crypt /dev/sda2

    Данная команда создаст шифрованное подключение к нашему диску. В каталоге /dev/mapper появится новое устройство с запрошенным нами именем: /dev/mapper/sda2_crypt , обращаясь к которому мы используем шифрованный доступ к диску. В случае с LUKS имя будет /dev/mapper/sda2_crypt

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

    # dd if=/dev/sda2 of=/dev/mapper/sda2_crypt

    Если же создается новый диск на пустом разделе, то можно отформатировать его:

    # mkfs.ext3 /dev/mapper/sda2_crypt

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

    # mount /dev/mapper/sda2_crypt /path/to/mount/point

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

    # fsck.ext3 /dev/mapper/sda2_crypt

    И даже расшифровать обратно, если мы больше не хотим использовать шифрование:

    # dd if=/dev/mapper/sda2_crypt of=/dev/sda2

    LUKS синтаксис

    Вышеуказанные действия можно выполнить в соответствии со стандартом LUKS

    Инициализируем раздел:

    cryptsetup luksFormat /dev/sda2

    Подключаем в систему:

    cryptsetup luksOpen /dev/sda2 sda2_crypt

    Форматируем:

    mkfs.ext4 -v -L DATA /dev/mapper/sda2_crypt

    Монтируем:

    mount /dev/mapper/sda2_crypt /mnt/data

    Раздел можно вручную отключить о системы

    cryptsetup luksClose sda2_crypt

    Подключение при запуске

    Для этой цели используется файл crypttab .

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

    nano /etc/crypttab # имя mapper устройство ключ параметры/опции # При стандартном синтаксисе sda2_crypt /dev/sda2 none aes-cbc-plain:sha256 # и\или под стандарту LUKS sda2_crypt /dev/sda2 none luks

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

    Если хотим монтировать вручную, то добавляем опцию noauto в поле "параметры/опции".

    Подключение шифрованного раздела вручную по данным из /etc/crypttab

    cryptdisks_start msda2_crypt

    И отключение с заранее отмонтированной фс.

    cryptdisks_stop sda2_crypt

    Для автоматического монтирования фс на подключённом зашифрованном разделе добавляем строку в /etc/fstab

    /dev/mapper/sda2_crypt /mnt/data ext4 defaults 0 0

    Работа с ключами в LUKS

    Раздел LUKS поддерживает 8 различных ключей, каждый из которых помещается в свой слот.

    Cмотрим список используемых ключей

    cryptsetup luksDump /dev/sda2

    В LUKS могут использоваться 2 вида ключей – ключевые фразы и файлы.

    Можно добавить ключевую фразу

    cryptsetup luksAddKey /dev/sda2

    Можно добавить ключевой файл (2048 bit) и выставить права доступа к нему.

    dd if=/dev/urandom of=/root/ext2.key bs=512 count=4 cryptsetup luksAddKey /dev/sda2 /root/ext2.key chmod 400 /root/sda2.key cryptsetup -d /root/sda2.key luksOpen /dev/sda2 sda2_crypt

    Для подключения при запуске по ключу правим /etc/crypttab

    nano /etc/crypttab sda2_crypt /dev/sda2 /root/sda2.key luks

    Можно удалить ключевую фразу или ключ из раздела

    cryptsetup luksKillSlot /dev/sda2 1

    Аварийное монтирование в "чужом" дистрибутиве

    От проблем никто не застрахован и иногда нужно получить доступ к зашифрованному разделу из аварийного LiveCD диска.

    Загружаемся, подключаем раздел в систему и монтируем фс:

    cryptsetup luksOpen /dev/sda2 sda2_crypt mount -t ext4 /dev/mapper/sda2_crypt /mnt/backup

    После работы отмонтируем фс и отключим зашифрованный раздел от системы

    umount /mnt/backup cryptsetup luksClose sda2_crypt

    Сообщения об ошибках при выключении

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

    stopping early crypto disks... failed

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

    Аналогичная ситуация складыватеся и при использовании программного RAID содержащего корневой раздел. 8)

    Шифрование при помощи модуля loop-aes

    Шифрование раздела винчестера, флешки с помощью пароля

    В данном howto описан метод шифрования AES256 , другие методы можно применять аналогично (заменив название метода на соответствующее). Нам понадобятся следующие пакеты:

    # apt-get install loop-aes-utils loop-aes-modules-`uname -r`

    Примечание : если Вы используете ядро для которого в репозитарии нет нужного loop-aes-modules, Вы можете установить модули следующими командами:

    # apt-get install module-assistant loop-aes-source # module-assistant a-i loop-aes

    Начальный этап

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

    Выберем раздел диска (или флешки) который мы хотим зашифровать, например это будет /dev/sda2 . Введем команду:

    # losetup -e AES256 -T /dev/loop0 /dev/sda2

    После выполнения данной команды, все обращения к девайсу /dev/loop0 будут шифроваться и в шифрованном виде перенаправляться в девайс /dev/sda2 . Теперь мы имеем одновременно шифрованный и нешифрованный каналы к устройству хранения данных. Шифруются данные при помощи пароля который вы указали при выполнении losetup.

    Теперь мы можем например отформатировать девайс:

    # mkfs.ext3 /dev/loop0

    Можем смонтировать его:

    # mount /dev/loop0 /path/to/mount

    можем отключить шифрование:

    # losetup -d /dev/loop0

    и самое главное, можем зашифровать раздел без потери данных :

    # dd if=/dev/sda2 of=/dev/loop0

    а так же расшифровать, если решаем что шифрование не наш метод:

    # dd if=/dev/loop0 of=/dev/sda2

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

    # fsck.ext3 /dev/loop0

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

    Повседневное использование

    Если у Вас уже была запись о разделе /dev/sda2 в Вашем /etc/fstab , то Вам нужно просто добавить опции, а если не было то прописать примерно следующее:

    /dev/sda2 /path/to/mount ext3 loop,encryption=AES256 0 0

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

    Если Вы не хотите чтобы процесс загрузки прерывался запросом пароля, то можно добавить опции noauto ,user в запись /etc/fstab :

    /dev/sda2 /path/to/mount ext3 loop,encryption=AES256,noauto,user 0 0

    Разумеется можно монтировать вручную (или из скрипта):

    # mount /dev/sda2 /path/to/mount -o loop,encryption=AES256

    Монтирование нескольких файловых систем

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

    Допустим мы имеем зашифрованный раздел /dev/sda2 , который мы при каждой загрузке монтируем в каталог /mnt1 . Появился новый винчестер /dev/sdb1 и мы хотим чтобы он автоматически монтировался в каталог mnt2 при монтировании первого. Можно конечно создать общую систему на чем-то вроде LVM , однако можно и более простым путем пойти:

    прописываем в fstab примерно следующую строку:

    /dev/sda2 /mnt1 ext3 noatime,exec,loop,encryption=AES256 0 0 /dev/sdb1 /mnt2 ext3 noatime,exec,loop,encryption=AES256,cleartextkey=/mnt1/key.txt 0 0

    Система при загрузке монтирует точки в том же порядке, который описан в fstab , таким образом, если первый раздел не будет смонтирован, то ключ для монтирования второго раздела останется недоступным и второй раздел так же не будет смонтирован.

    Пароль хранится в виде plain/text это конечно не очень красиво, но он хранится на зашифрованном разделе (который можно и отмонтировать). Можно вместо этого использовать gpg -ключ, однако много безопасности это не добавит (если уж смогут спереть ключ, то большой разницы какой этот ключ не будет), вариант шифрования с gpg -ключом описан в man losetup , здесь я лишь приведу пример записи в fstab :

    /dev/sda2 /mnt1 ext3 noatime,exec,loop,encryption=AES256 0 0 /dev/sdb1 /mnt2 ext3 noatime,exec,loop,encryption=AES256,gpgkey=/mnt1/key.gpg 0 0

    Примечания

    Дополнительную информацию о поддерживаемых алгоритмах шифрования смотри в man losetup , там же можно посмотреть описание других опций программы losetup .

    Если у Вас возникнут проблемы при установке модулей AES, то читайте документацию идущую с пакетом loop-aes-source .

    GRUB и шифрованный корневой диск

    При установке корневого раздела на зашифрованный диск GRUB может в главном меню показывать кракозябры. Это происходит из-за недоступности стандартного шрифта /usr/share/grub/unicode.pf2. Копируем шрифт

    cp /usr/share/grub/unicode.pf2 /boot/grub/

    Указываем настройку

    nano /etc/default/grub GRUB_FONT=/boot/grub/unicode.pf2

    Применяем настройку:

    update-grub