При использовании зашифрованного раздела с конфиденциальной информацией,
злоумышленник, имеющий физический доступ к компьютеру, может воспользоваться
методом холодной перезагрузки
(https://www.opennet.ru/opennews/art.shtml?num=17035) для получения ключей
шифрования. Метод основан на способности оперативной памяти (DRAM) какое-то
время сохранять информацию после отключения питания и отсутствия импульсов
регенерации ее содержимого (при температуре -50 градусов данные сохраняются
более 10 минут). После холодной перезагрузки или переключении чипа памяти на
другое устройство память не обнуляется и данные старой рабочей сессии можно
проанализировать. Особенно актуальная проблема для ноутбуков, которые часто не
выключаются и лишь переводятся в ждущий режим, при котором ОЗУ не
обесточивается. В простейшем случае, восстановить ключ из памяти можно
используя утилиту msramdmp (http://www.mcgrewsecurity.com/tools/msramdmp/),
перезагрузившись в LiveCD (например, можно использовать msramdmp_cd.iso).
В рамках проекта TRESOR (http://www1.informatik.uni-erlangen.de/tresor)
подготовлены патчи для ядра Linux с реализацией модуля шифрования AES, который
сохраняет ключи в отладочных регистрах процессора и обрабатывает все операции
шифрования непосредственно в CPU, без копирования ключей в ОЗУ. TRESOR может
использоваться на любых процессорах с поддержкой SSE2. При использовании
64-разрядных CPU с поддержкой набора инструкций AES-NI, например, Intel Core
i5 или Core-i7, поддерживается работа с ключами AES 128, 192 и 256 без потери
производительности. При запуске на 32-разрядных CPU с поддержкой инструкций
SSE2, скорость выполнения шифрования примерно в 6 раз ниже, чем базовая
реализация AES для ядра Linux. При этом можно использовать только ключи длиной
128 бит.
Собираем ядро с патчем TRESOR.
Загружаем ядро 2.6.36 с http://kernel.org и распаковываем его в директорию /usr/src/linux-2.6.36.
Применяем патч (http://www1.informatik.uni-erlangen.de/tresor):
cd /usr/src/
patch --directory /usr/src/linux-2.6.36 -p1 < tresor-patch-2.6.36
Запускаем menuconfig и настраиваем параметры ядра, не забыв включить TRESOR
(Cryptographic API -> AES cipher algorithms (TRESOR)).
Собираем ядро. Ниже пример сборки и установки пакета для Debian GNU/Linux:
cd /usr/src/linux-2.6.36
make-kpkg kernel_image --initrd --revision tresor1
cd /usr/src
dpkg -i linux-image-2.6.36-tresor1.deb
update-initramfs -c -k 2.6.36
Запускаем систему
Перезагружаемся, выбрав ядро с патчами TRESOR.
В ответ на приглашение TRESOR "Enter password" вводим пароль и подтверждаем валидность хэша:
Enter password > ********
Confirm key hash > 51 b7 fd ... 58 ac Correct (yes/no) > yes
Пароль может содержать от 8 до 53 символов. Возможности поменять пароль после
загрузки нет, поэтому к вводу пароля нужно отнестись внимательно иначе
потребуется лишний раз перезагружать систему. Выводимый хэш не является ключом
шифрования, а просто выводится для того чтобы можно было дополнительно
проверить правильность задания пароля.
После того как система загрузится можно попытаться перевести её в ждущий режим
и проверить работу TRESOR:
echo mem > /sys/power/state
После возвращения из спящего режима должно быть выведено приглашение для ввода
пароля, такое же как после загрузки системы. Для проверки, что повторно
введенный пароль верен в памяти сохраняется необратимый проверочный хэш,
который позволяет удостовериться в правильности ввода, но не дает возможности
восстановить содержимое пароля и ключа шифрования. Проверка пароля необходима,
так как неправильно введенный пароль может привести к повреждению данных в уже
примонтированном зашифрованном разделе. Так как пароль вводится в консоли при
активном графическом режиме возможно потребуется ввести пароль вслепую.
Настройка шифрования
Устанавливаем утилиты для работы с dm-crypt:
apt-get install cryptsetup
Если ядро собрано с поддержкой LKM, убедимся, что загружен модуль ядра dm_mod:
modprobe dm_mod
В качестве демонстрации настроим два варианта шифрования: отдельного раздела на
USB-накопителе и виртуального шифрованного раздела внутри файла.
Настройка зашифрованного дискового раздела
Зашифруем раздел /dev/sdb1:
cryptsetup create tresor /dev/sdb1 --cipher tresor --key-size 128
> Enter passphrase: указываем произвольный пароль
Размер ключа для 64-разрядных процессоров с поддержкой AES-NI может быть 128,
192 и 256. Для остальных CPU - только 128.
Форматируем созданный шифрованный раздел:
mkfs.ext2 /dev/mapper/tresor
Монтируем раздел:
mount /dev/mapper/tresor /media/tresor
все операции записи и чтения в /media/tresor производятся с использованием шифрования.
Отмонтируем раздел и выгружаем шифрованное устройство:
umount /media/tresor
cryptsetup remove tresor
Настройка зашифрованного контейнера (шифрованный раздел внутри файла)
Создаем пустой файл-контейнер container.img, размером 1 Гб:
dd if=/dev/zero bs=1M count=1024 of=container.img
Прикрепляем контейнер к псевдоустройству через loop-интерфейс:
losetup /dev/loop0 container.img
Повторяем действия, описанные выше для шифрованных дисковых разделов, но
используя в качестве имени устройства /dev/loop0
При отмонтировании, для отсоединения контейнера от loop-устройства дополнительно выполняем:
losetup -d /dev/loop0
|