Создание шифрованных дисков в Linux
АрхивСистемаКак установить Linux из дистрибутива Ubuntu Edgy Eft на полностью шифрованные разделы жёсткого диска с целью защиты от кражи конфиденциальных данных.
В наши дни шифрование всех данных на компьютере уже не является проявлением паранойи, а в некоторых случаях становится и вовсе необходимостью. Например, это очень актуально в случае использования ноутбуков. Едва ли не ежемесячно проскакивают новости о похищениях ноутбуков с конфиденциальной информацией. Если бы данные на таких ноутбуках хранились в зашифрованном виде, утрата компьютеров не имела бы столь широкого резонанса.
Другой наглядный пример, с которым столкнулся автор статьи, - это проблема сдачи ноутбука в гарантийный сервисный центр. Многие сервис-центры принимают ноутбуки на ремонт только в полной комплектации, и нельзя вынуть жесткий диск перед сдачей устройства мастерам. И тут уж остается уповать только на ответственность ремонтников.
Однажды мне вернули ноутбук с обнулёнными паролями всех учетных записей, в том числе и учетной записи администратора. Зачем это понадобилось сервис-инженерам, остается только догадываться. С тех пор я стараюсь всю важную информацию держать в зашифрованном виде. Просто на случай утери ноутбука или его ремонта.
Даже на стационарных компьютерах шифрование имеет смысл. В моей практике был случай, когда в офис проникли обыкновенные воры и утащили системный блок главного бухгалтера со всеми финансовыми базами, в которых наверняка был компромат на не совсем "белый" бизнес фирмы.
В данной статье я расскажу, как установить Linux из дистрибутива Ubuntu Edgy Eft (6.10) на полностью шифрованные разделы жёсткого диска. Данная технология подходит для любого дистрибутива, различия будут состоять только в том, как установить необходимый для работы софт и как сформировать образ RAM-диска initrd. В Ubuntu это делается просто установкой соответствующих пакетов и исполнением готовых скриптов. В других дистрибутивах возможны какие-то трудности, но они, я думаю, легко преодолимы.
Идея состоит в установке системы на один шифрованный раздел жёсткого диска, внутри которого с помощью технологии LVM (Linux Volume Management) "нарезаны" разделы для корневой файловой системы (/), домашних каталогов (/home), раздела подкачки (swap) и др. по желанию. При этом загрузочный раздел /boot с файлами ядер остается незашифрованным - специфика, никуда не денешься.
Операция состоит из следующих этапов:
- установка минимальной системы на первый нешифрованный раздел
- обновление системы, установка необходимого софта (внимание: на этом этапе необходим доступ в интернет, который вам придется настраивать самостоятельно)
- создание шифрованных разделов
- создание загрузочных скриптов, для монтирования шифрованного раздела на этапе загрузки системы
- перенос системы с первого раздела на шифрованные области диска
- оформление первого раздела как загрузочного во вновь получившейся системе (/boot)
- подготовка менеджера загрузки Grub к загрузке новой системы с шифрованными разделами
Скрипты загрузки были взяты с сайта Ubuntu Wiki. Отличия от данного пошагового руководства заключаются лишь в методе разбивки диска и указании некоторых особенностей, связанных с другим методом разбивки диска.
Первоначальная установка
Для того чтобы сэкономить место на первом разделе, который так и останется нешифрованным, лучше всего взять установочный диск типа "Сервер". Для его установки достаточно всего 600 Мб дискового пространства. Если вы решили устанавливать версию "Десктоп", то для первого раздела потребуется порядка трех гигабайтов. Скачать образ диска "Сервер" (файл ubuntu-6.10-server-i386.iso) можно с FTP-сервера ftp.chg.ru/pub/Linux/ubuntu/releases/edgy.
Далее предполагается, что установка производится на чистый жёсткий диск с интерфейсом SATA, определяющийся в системе как /dev/sda.
Итак, во время установки создаём новые Primary-разделы:
/dev/sda1 - 600 Мб (файловая система Ext3, точка монтирования '/')
/dev/sda2 - Вся остальная область диска (файловая система на выбор, точки монтирования нет)
Устанавливаем систему на первый раздел. Второй раздел целиком будет тем шифрованным пространством, внутри которого и будут размещены все остальные разделы будущей системы. Вся процедура займёт менее десяти минут, и после перезагрузки мы получим наш сервер на разделе /dev/sda1.
Установка необходимого софта
Загружаем нашу новую систему и настраиваем сеть и выход в интернет. Этот шаг, к сожалению, необходим, и выполнить его вы должны самостоятельно.
После того как соединение с интернетом установлено, необходимо обновить систему до актуального состояния.
В Ubuntu активно используется sudo, а так как все дальнейшие действия должны выполняться от имени пользователя root, чтобы не мучиться, можно просто на время "стать рутом" или, иначе говоря, администратором системы:
$ sudo su
Password:
Далее запускаем редактор nano для редактирования файла /etc/apt/sources.list:
# nano /etc/apt/sources.list
С его помощью нужно раскомментировать строки, указывающие на источники пакетов universe и multiverse:
deb http://archive.ubuntu.com/ubuntu/ edgy universe
deb http://us.archive.ubuntu.com/ubuntu/ edgy-backports main restricted universe multiverse
Если сомневаетесь - раскомментируйте все предложенные источники. Не забудьте закомментировать источник CD-ROM, с которого вы ставили систему, он будет первым:
#deb cdrom:[Ubuntu-Server 6.10 _Edgy Eft_ - Release i386 (20061025.1)]/ edgy main restricted
Далее обновляем систему:
# apt-get update
# apt-get dist-upgrade
Тут же можно сменить и ядро:
# apt-get install linux-386
Устанавливаем необходимые для дальнейшей работы пакеты (здесь я еще поставил пакет mc ради редактора mcedit - у каждого свои вкусы):
# apt-get install cryptsetup hashalot initramfs-tools
Система готова к следующему этапу.
Создание шифрованных разделов
Создание шифрованных разделов делится на следующие шаги:
- создание нового раздела на жестком диске
- создание на его основе шифрованного раздела
- инициализация LVM и "нарезка" необходимых разделов в шифрованном пространстве
Для начала загрузим в ядро необходимые для работы модули:
# modprobe dm_crypt
# modprobe aes_i586
# modprobe sha256
Проверим раздел, предназначенный для шифрованного пространства, на наличие поврежденных блоков и попутно заполним его псевдослучайными данными:
# /sbin/badblocks -c 10240 -s -w -t random -v /dev/sda2
Для особо секретных дисков можно заполнить пространство случайным "мусором":
# dd if=/dev/urandom of=/dev/sda2
Но для бытового применения всего этого, как правило, можно не делать, к тому же выполнение операции для больших дисков длится слишком долго.
Теперь создадим шифрованный раздел на основе /dev/sda2:
# cryptsetup -verify-passphrase -verbose -hash=sha256 -cipher=aes-cbc-essiv:sha256 -key-size=256 luksFormat /dev/sda2
# cryptsetup luksOpen /dev/sda2 pvcrypt
Следуйте указаниям на экране. Первая команда попросит вас два раза ввести пароль для шифрованного раздела (внимание: пароль должен вводиться в английской раскладке клавиатуры!). Вторая команда "отображает" содержимое шифрованного раздела в устройство /dev/mapper/pvcrypt. Нешифрованные данные (cleartext) будут отображены как раздел виртуального диска /dev/mapper/pvcrypt, в то время как физически они будут лежать в зашифрованном виде на /dev/sda2. Шифрование/дешифрование будет производиться ядром "на лету" с помощью драйвера device mapper (модуль ядра dm_crypt) и алгоритма AES (модуль ядра aes_i586).
Как показывает практика, такое прозрачное шифрование практически не сказывается на скорости работы с диском. Файлы копируются со скоростью до 30 Мб/с, как и в случае отсутствия шифрования.
Чтобы всё окончательно стало ясно, рекомендую прочитать man cryptsetup.
Далее необходимо инициализировать этот отображенный раздел в системе LVM и создать необходимые для будущей системы разделы:
# pvcreate /dev/mapper/pvcrypt
Physical volume "/dev/mapper/pvcrypt" successfully created
# vgcreate vgcrypt /dev/mapper/pvcrypt
Volume group "vgcrypt" successfully created
# lvcreate -n lvroot -L 10G vgcrypt
Logical volume "lvroot" created
# lvcreate -n lvswap -L 1G vgcrypt |
Logical volume "lvswap" created
# lvcreate -n lvhome -l 95G vgcrypt
Logical volume "lvhome" created
Таким образом мы создали для будущей системы три раздела:
/dev/mapper/vgcrypt-lvroot 10Gb /
/dev/mapper/vgcrypt-lvswap 1Gb swap
/dev/mapper/vgcrypt-lvhome 95Gb /home
Далее создадим файловые системы на вновь созданных разделах. Я использовал reiserfs, можно использовать ext3. Использовать xfs крайне не рекомендую, так как она теряет файлы при резких перезагрузках.
# mkfs.reiserfs /dev/mapper/vgcrypt-lvroot
# mkfs.reiserfs /dev/mapper/vgcrypt-lvhome
# mkswap /dev/mapper/vgcrypt-lvswap
Разделы для будущей системы готовы.
Создание образа initrd
Для тех, кто не знаком с процедурой загрузки ядра Linux, я немного поясню, в чём суть. Первоначально ядро в качестве файловой системы загружает образ виртуального диска (RAM-диск) в котором содержатся необходимые драйверы и скрипты для загрузки основной файловой системы.
Этот образ /boot/initrd.img-2.6.17-10-server уже создан для ядра установленной системы. Нам необходимо его чуть-чуть переделать.
Добавляем в файл /etc/kernel-img.conf строчку
ramdisk = /usr/sbin/mkinitramfs
Далее в файле /etc/initramfs-tools/modules перечисляем модули, которые необходимо загрузить для дальнейшей работы с шифрованным разделом (модули будут загружены в ядро в самом начале загрузки системы):
dm_mod
dm_crypt
sha256
aes_i586
Создаем файл /etc/initramfs-tools/hooks/pvcrypt следующего содержания (этот скрипт будет исполнен во время создания образа initrd):
#!/bin/sh
PREREQ=""
prereqs() { echo "$PREREQ" }
case $1 in
prereqs)
prereqs
exit 0
;;
esac
if [ ! -x /sbin/cryptsetup ]; then exit 0 fi
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/bin/chvt /bin
copy_exec /sbin/cryptsetup /sbin
Создаём файл /etc/initramfs-tools/scripts/local-top/pvcrypt следующего содержания (этот скрипт тоже будет исполняться во время загрузки системы):
#!/bin/sh
PREREQ="udev"
prereqs() { echo "$PREREQ" }
case $1 in
prereqs)
prereqs
exit 0
;;
esac
modprobe -Qb dm_crypt
modprobe -Qb aes_i586
modprobe -Qb sha256
if grep -q splash /proc/cmdline;
then
/bin/chvt 1
fi
echo "Cryptsetup operation."
/sbin/cryptsetup luksOpen /dev/sda2 pvcrypt
if grep -q splash /proc/cmdline;
then
/sbin/usplash -c & sleep 1
fi
/dev/sda2 при запуске команды /sbin/cryptsetup указывает на шифрованный раздел, который мы создали ранее (он может назваться и по другому, всё зависит от особенностей вашей системы), а pvcrypt на имя виртуального устройства в каталоге /dev/mapper/, на которое будет отображено расшифрованное (cleartext) содержимое шифрованного раздела.
Сделаем созданные нами скрипты исполняемыми:
#chmod +x /etc/initramfs-tools/hooks/pvcrypt
#chmod +x /etc/initramfs-tools/scripts/local-top/pvcrypt
И обновим образ RAM-диска initrd командой:
# update-initramfs -u ALL
Теперь настало время следующего этапа - тестирование.
Пробная перезагрузка
Перезагрузите систему, чтобы убедиться, что образ initrd (который был только что создан) сделан правильно и скрипты исполняются.
На этапе загрузки, в самом начале, система запросит у вас пароль к шифрованному разделу. После того как пароль будет введен, и система загрузится, проверьте, доступны ли разделы LVM:
# ls -al /dev/mapper/
total 0
drwxr-xr-x 2 root root 180 2007-02-06 13:10 .
drwxr-xr-x 16 root root 13240 2007-02-06 13:10 ..
crw-rw-- 1 root root 10, 63 2007-02-06 13:09 control
brw-rw-- 1 root disk 254, 0 2007-02-06 13:09 pvcrypt
brw-rw-- 1 root disk 254, 4 2007-02-06 13:10 sda1
brw-rw-- 1 root disk 254, 5 2007-02-06 13:10 sda2
brw-rw-- 1 root disk 254, 3 2007-02-06 13:09 vgcrypt-lvhome
brw-rw-- 1 root disk 254, 1 2007-02-06 13:09 vgcrypt-lvroot
brw-rw-- 1 root disk 254, 2 2007-02-06 13:09 vgcrypt-lvswap
Перенос системы на шифрованные разделы
Теперь нам надо перенести систему с первого раздела на шифрованные области.
Для этого созданные шифрованные разделы (LVM) надо смонтировать и скопировать на них файлы с первого раздела.
# mkdir /mnt/root
# mount /dev/mapper/vgcrypt-lvroot /mnt/root
# mkdir /mnt/root/home
# mount /dev/mapper/vgcrypt-lvhome /mnt/root/home
# cp -ax / /mnt/root
# cp -rp /dev/* /mnt/root/dev/
# rm -rf /mnt/root/boot/*
# mount /dev/sda1 /mnt/root/boot/
Фактически в каталоге /mnt/root/ у нас теперь смонтированы все разделы новой, будущей системы. Все дальнейшие работы мы будем проводить именно в нём.
Подготовка к рестарту системы
После того как система перенесена на шифрованные разделы, первый раздел /dev/sda1 для новой системы будет загрузочным каталогом /boot.
Сперва нам необходимо отредактировать файл /mnt/root/etc/fstab (не забываем, что мы уже перенесли систему на новые разделы и нам уже необходимо редактировать файлы будущей системы). В нашем случае он может выглядеть следующим образом:
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
usbfs /proc/bus/usb usbfs devmode=0666 0 0
/dev/sda1 /boot ext3 defaults 0 0
/dev/mapper/vgcrypt-lvroot / reiserfs defaults 0 0
/dev/mapper/vgcrypt-lvhome /home reiserfs defaults 0 0
/dev/mapper/vgcrypt-lvswap none swap sw 0 0
Так как раздел /dev/sda1 становится каталогом /boot новой системы, но в данный момент времени он является корневым /, то необходимо скопировать все файлы из /boot в корневой каталог:
# cp -r /boot/* /
Я понимаю, что это создаст файловую "свалку", но с другой стороны, у нас всегда будет под рукой первоначальная система, которая может быть загружена без использования шифрованных разделов, например, для восстановления рухнувшей системы.
Теперь подготовим менеджер загрузки Grub.
Отредактируем файл /mnt/boot/grub/menu.lst так, чтобы в списке вариантов загрузки, первыми строчками были:
title Ubuntu, kernel 2.6.17-10-server Default
root (hd0,0)
kernel /vmlinuz-2.6.17-10-server
root=/dev/mapper/vgcrypt-lvroot ro quiet splash
initrd /initrd.img-2.6.17-10-server
quiet
savedefault
boot
Здесь ключевой строчкой является параметр root=/dev/mapper/vgcrypt-lvroot, указывающий ядру, что корневым каталогом (root) в системе будет раздел /dev/mapper/vgcrypt-lvroot.
Не забывайте, что vmlinuz-2.6.17-10-server - файл ядра, которое будет загружаться.
Посмотреть версию текущего загруженного ядра можно командой:
# uname -r
2.6.17-10-server
По аналогии можно (и нужно) добавить другие варианты загрузки, в том числе, как вариант, загрузку с первого раздела, на котором еще осталась копия первоначально установленной системы. Эту операцию читателям предлагаем выполнить самостоятельно.
В том же файле menu.lst еще необходимо найти строчку:
# kopt=root=/dev/sda1 ro
и поменять ее на:
# kopt=root=/dev/mapper/vgcrypt-lvroot ro
Внимание: эта строка должна остаться закомментированной!
Теперь при установке в систему новых ядер автоматически исполняемая команда update-grub будет назначать правильный параметр root= ядра.
Выполним команду:
# grub-install -root-directory=/mnt/root/ /dev/sda
Система готова к перезагрузке, после которой она будет полностью размещена на шифрованных разделах.
Послесловие
Как вы могли заметить, каталог /boot так и остался незашифрованным. Это значит, что ваш компьютер все еще доступен для атаки. Злоумышленник может подменить загрузочные скрипты таким образом, что ваш пароль после ввода будет сохранен в отдельном файле.
Тут я могу дать только один совет: пользуйтесь tripwire или подобными программами. И не забывайте проверять целостность загрузочного раздела. Не мешает также позаботиться о сохранении данных разбивки LVM-разделов, чтобы в случае сбоя можно было попытаться восстановить данные.
Если боитесь забыть пароль, стоит создать специальный дополнительный ключ для расшифровки раздела.
Делается это так:
$ sudo dd if=/dev/random of=/path-to/keyfile bs=1 count=256
$ sudo cryptsetup luksAddKey /dev/sda2 /path-to/keyfile
Теперь можно сохранить keyfile, например, на USB-драйве, и даже если вы забудете пароль, информацию можно будет расшифровать с помощью этого ключевого файла. Однако наличие такого дополнительного ключа повышает риск того, что он однажды достанется злоумышленнику. Выбирать вам.
Шифрование в Windows
В Windows полное шифрование дисков возможно выполнить только с помощью стороннего софта. Примером такого софта является SafeGuard Easy.
Можно зашифровать отдельные папки и файлы и штатными средствами, но при этом необходимо предпринять меры по сохранению ключей шифрования на отдельный носитель, так как при "падении" системы получить доступ к зашифрованным папкам и файлам без восстановления ключей будет уже невозможно. Процедура резервного копирования ключей шифрования, к сожалению, выходит за рамки этой статьи.