Шифрование 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 или без него), или
Чтобы сделать это вторым способом, вы можете проверить проект 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 не может сделать, проверено мной:
- Загрузка с использованием диска Super Grub 2
- Введите «c», чтобы перейти в командную строку
- Введите команды для монтирования зашифрованного раздела, который я хочу
- insmod luks
- cryptomount (hd0, #) // где # представляет зашифрованный раздел
- Введите ключевую фразу и введите несколько команд
- multiboot (crypto0) /grub/i386-pc/core.img
- ботинок
Это загрузит еще один Grub2, который находится внутри зашифрованного раздела, злая сумасшедшая атака здесь не имеет места … Я загружаюсь с компакт-диска (только для чтения), а затем монтирует зашифрованный раздел (а не кодовую фразу, что-нибудь!), затем загрузка изнутри зашифрованного раздела и загрузка Grub2 со своим меню и т. д.
Предупреждение: Grub2 версии 2.02 ~ beta2 не может сделать то же самое, поскольку имеет некоторые ошибки (которые, по-видимому, исправлены на Grub2 версии 2.02 ~ beta3), связанные с командой cryptomount …
beta2 ошибки, о которых я говорю, являются:
- На самом деле он не монтирует зашифрованный раздел, поэтому он не позволяет вам получить доступ (crypto0) / *
- Если существует более одного зашифрованного раздела, использование cryptomount -a требует только одной кодовой фразы
- После запуска cryptomount один раз он запускается снова, ничего не делает
на бета-версии 3:
- Он действительно монтирует зашифрованный раздел и позволяет вам получать доступ к файлам через (crypto0) / * или (crypto1) / * и т. Д., Если более одного установленного одновременно
- Он запрашивает каждую кодовую фразу (по одному за зашифрованный раздел)
- Это позволяет вам запускать его столько раз, сколько вам нужно, вы можете установить один, затем другой и т. Д.
Боковое примечание: я не понял, как их размонтировать, кроме перезагрузки или загрузки другого или одного загрузочного загрузчика 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/sda2LUKS синтаксис
Вышеуказанные действия можно выполнить в соответствии со стандартом 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