Показать сообщение отдельно

  #2  
Старый 19.10.2007, 19:15
BMaster
Познающий
Регистрация: 12.01.2006
Сообщений: 52
Провел на форуме:
297990

Репутация: 140
Отправить сообщение для BMaster с помощью ICQ
По умолчанию

2.3 Автоматизация монтирования шифрованных разделов при загрузке

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

1) Вариант не безопасный.

Вернемся к примеру:
/var - /dev/hda3
/home - /dev/hda4

Редактируем файл /etc/fstab

Код:
/dev/hda3		/var	           ext3		rw,loop=/dev/loop3,encryption=blowfish-256 0 0
/dev/hda4		/home       	ext3		rw,loop=/dev/loop4,encryption=blowfish-256 0 0
Подразумевается что /dev/hda3 и /dev/hda4 зашифрованны алгоритмом blowfish-256.
После загрузчика, как только система дойдет до монтирования разделов, для того чтобы примонтировать hda3 и hda4, необходимо будет ввести парольную фразу.
Как правило, фразу с символами различного регистра и длинной более 20 держать в голове не просто, особенно если этих фраз около 7-20. Поэтому вы должны будете каждый раз вводить ее с листочка, а соответственно кто-то может узнать вашу фразу "из-за плеча".

2) Вариант безопасный. Монтирование с помощью скомпилированной программы, которая расположена на флешке.

Создадим файл amount.cpp :

Цитата:
#include <iostream>
using namespace std;
int main() {
system("echo '12345678901234567890'|losetup -e blowfish-256 -p0 /dev/loop3 /dev/hda3");
system("mount /dev/loop3 /var");

system("echo '12345678901234567890'|losetup -e blowfish-256 -p0 /dev/loop4 /dev/hda4");
system("mount /dev/loop4 /home");

system("echo '11111111112222222222'|losetup -e blowfish-128 -p0 /dev/loop6 /dev/hda6");
system ("mount /dev/loop6 /mount/crypt_data");

system("echo '11111111112222222222'|losetup -e blowfish-128 -p0 /dev/loop1 /dev/hdb1");
system ("mount /dev/loop1 /mount/1");

system("echo '11111111113333333333'|losetup -e blowfish-128 -p0 /dev/loop2 /dev/hdb2");
system ("mount /dev/loop2 /mount/2");

system("sleep 5 && umount /dev/sda1 &");
}
И скомпилируем его:

Код:
# g++ ./amount.cpp
Получим файл a.out
Переименуем его в amount

Код:
# mv ./a.out ./amount
12345678901234567890 - парольная фраза как для hda3 так и для hda4.
12345678901111111111 - парольная фраза как для hda6 так и для hdb1.
12345678901111111111 - парольная фраза для hdb2.

Скопируем файл amount на флешку, на раздел sda1:

Код:
# cp amount /mount/f1
Теперь добавим в /etc/fstab автомонтирование флешки:

Код:
/dev/sda1		/mount/f1	auto		ro		0 0
Теперь создадим еще один файл amount, но с другим содержанием.
Отмонтируем флешку и создадим файл: amount1.cpp

Код:
# umount /mount/f1
Содержание файла amount1.cpp:

Цитата:
#include <iostream>
using namespace std;
int main() {
echo "Hi, i'am bug "
}
Скомпилируем его и получим файл amount, после чего скопируем его в /mount/f1:
Внимание! Здесь /mount/f1 всего лишь папка на винчестере.

Код:
# cp amount /mount/f1
Внимание! Здесь наверное единственно место, где могут возникнуть трудности. Я опишу изменение конфигурационного файла только для систем Gentoo и Ubuntu.
Для того чтобы сразу после монтирования всех разделов указанных в /etc/fstab (соответственно и после монтирования нашей флешки /dev/sda1 в /mount/f1), выполнить программу amount которая находится на флешке, и тем самым продолжить монтирование зашифрованных разделов:

Для Gentoo:
Отредактируем файл /etc/init.d/localmount:

Цитата:
..........
# Start dm-crypt mappings, if any
start_addon dm-crypt
/mount/f1/amount
}
Просто добавили в конец файла перед закрывающейся скобкой одну строчку.

Для Ubuntu:
Создадим в папке /etc/init.d/ файл mountcrypt

Код:
# nano -w /etc/init.d/mountcrypt
Следующего содержания:

Цитата:
#!/bin/sh
/mount/f1/amount
Сделаем его исполняемым:

Код:
# chmod +x /etc/init.d/mountcrypt
Добавим его в runlevel для выполнения сразу после localmount:

Код:
# ln -s /etc/init.d/mountcrypt /etc/rcS.d/S35mountcrypt
В случае, если мы после загрузчика и начала загрузки ядра извлекаем флешку, то вместо программы amount, которая находится на флешке и должна монтировать разделы, выполнится программа amount, которая находится на жестком диске, и соответственно монтироваться ничего не будет, появится надпись "Hi, i'am bug ", но система продолжит грузится, в итоге исход будет неудачным.

2.4 Уничтожение загрузчика

Уничтожим загрузчик на /dev/hda:

Код:
# dd if=/dev/urandom of=/dev/hda bs=446 count=1
2.5 Шифрование swap раздела

Для этого необходимо установить пакет loop-aes и в /etc/fstab подредактировать строку swap раздела:

Цитата:
/dev/hda9 none swap sw,loop=/dev/loop7,encryption=blowfish-256 0 0
где /dev/hda7 - swap раздел

3. Паранойя

Цель: установить на раздел /dev/sda2 Linux.
Для чего: чтобы восстанавливать постоянно удаляющуюся при выключении таблицу разделов на винчестере.

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

Если кто-то захочет поставить себе на флешку Gentoo, опишу как это делается.

3.1 Ставим Gentoo Linux на флешку в 1Гб

Потребуется:
Архив со stage, для моей архикектуры это: stage3-i686-2007.0.tar.bz2
Снапшот портежей: portage-20070918.tar.bz2
Исходники ядра: linux-2.6.22.tar.bz2
И разумеется линукс с компилятором, подойдет даже LiveCD.
Скачать все файлы можно с любого из зеркал gentoo, например с http://gentoo.osuosl.org
Скачаем и разместим эти файлы в /mount/opensource_files, где /mount/opensource_files - папка корневого раздела, либо точка монтирования одного из разделов, если установка протекает с LiveCD, то в эту папку необходимо примонтировать раздел жесткого диска:

Код:
# mkdir /mount
# mkdir /mount/opensource_files
# mount /dev/hda5 /mount/opensource_files
Смонтируем /dev/sda2 в /mount/f2 и начнем установку

Код:
# mkdir /mount/f2
# mount /dev/sda2 /mount/f2
# cd /mount/f2
# tar -xvjpf /mount/opensource_files/2007.0/stage3-i686-2007.0.tar.bz2
# tar -xvjf /mount/opensource_files/portage-20070918.tar.bz2 -C /mount/f2/usr
# mkdir /mount/f2/distfiles
# mount -o bind /mount/opensource_files /mount/f2/distfiles
# mount -o bind /mount/opensource_files /mount/f2/usr/src
Внимание!
# mount -o bind /mount/opensource_files /mount/f2/distfiles
# mount -o bind /mount/opensource_files /mount/f2/usr/src
Эти команды монтируют папку /mount/opensource_files в папки /mount/f2/distfiles и /mount/f2/usr/src для того, чтобы использовать место для скачки файлов и дальнейшей распаковки ядра не на флешке, а на винчестере, иначе объема флешки может не хватить.

Теперь чрутнимся, и продолжим:

Код:
# chroot /mount/f2 /bin/bash
# emerge -pvf gentoo-sources
Команда emerge -pvf gentoo-sources выдаст нам ссылки на нужные файлы, т.к. ядро уже скачено, останется скачать несколько патчей, скачаем их самостоятельно и скопируем в /mount/opensource_files.

Идем дальше:

Код:
# env-update
# source /etc/profile
# ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
# emerge -pv gentoo-sources
# emerge gentoo-sources
# cd /usr/src/linux && make menuconfig
Необходимо сконфигурировать и собрать ядро. Для того, чтобы загрузить линукс с флешки, в ядре должны быть включены следующие опции:

Цитата:
Device Drivers --->
USB support --->
<*> EHCI HCD (USB 2.0) support
<*> OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support
<*> USB Mass Storage support
Device Drivers --->
Block devices --->
<*> Low Performance USB Block driver
По желанию можно сделать ядро монолитным, т.е. все опции соберутся непосредственно в ядро, модулей не будет:

Просто отключим следующее:

Цитата:
Loadable module support --->
[ ] Enable loadable module support
В случае, если ядро монолитное, далее выполняем:

Код:
# make
# cp ./arch/i386/boot/bzImage /boot
Если не монолитное (с поддержкой модулей) то выполняем:

Код:
# make && make modules_install
# cp ./arch/i386/boot/bzImage /boot
Последние штрихи:

Редактируем /etc/fstab:

Код:
# nano -w /etc/fstab
Если убрать все комментарии, то получим:

Код:
/dev/uba2             /                    ext3            noatime         0 1
/dev/cdrom           /mnt/cdrom      audo           noauto,ro       0 0
/dev/fd0               /mnt/floppy     auto            noauto          0 0
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0
/dev/uba2 - именно так в ядре определяется наш второй раздел на флешке.

Теперь установим пароль root и выйдем из chroot среды:

Код:
# passwd
New UNIX password:
BAD PASSWORD: it does not contain enough DIFFERENT characters
Retype new UNIX password:
passwd: пароль успешно обновлён
# exit
Изменим конфиг grub, который находится на /dev/sda1
Добавим в конец следующие строки:

Цитата:
title Linux From Flash
root (hd0,1)
kernel (hd0,1)/boot/bzImage root=/dev/uba2 init=/sbin/init video=vesafb:1024x768
На этом установка Gentoo Linux на флешку завершена. За всеми подробностями, а также за послеустановочной настройкой, если вам это потребуется, обращайтесь Gentoo Handbook

А теперь самое интересное.

3.2 Имитация не рабочего винчестера

Создадим копию первых 512 байт с раздела hda:

Код:
# dd if=/dev/hda of=/mount/f2/image_hda bs=512 count=1
Копию байт разместим на флешке в файле image_hda.

В Gentoo в файл /etc/conf.d/local.stop добавляем:

Цитата:
dd if=/dev/urandom of=/dev/hda bs=512 count=1
В Ubuntu создадим в папке /etc/init.d/ файл destroy

Код:
# nano -w /etc/init.d/destroy
Следующего содержания:

Цитата:
#!/bin/sh
dd if=/dev/urandom of=/dev/hda bs=512 count=1
Сделаем его исполняемым:

Код:
# chmod +x /etc/init.d/destroy
Добавим его в runlevel для выполнения при выключении:

Код:
# ln -s /etc/init.d/destroy /etc/rc6.d/K03destroy
Т.е. при выключении первые 512 байт будут забиваться рандомом. И соответственно таблица разделов от 446 до 512 байт тоже. Определить где начинается какой раздел, да еще если половина из них зашифрована, будет практически невозможно. И всегда с гордостью можно заявить, что винчестер не рабочий, он был отфортирован, были удалены разделы...

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

Код:
# dd if=/image_hda of=/dev/hda
# reboot
А после грузить с флешки основную систему.

Отмонтируем все разделы с которыми работали:

Код:
# mount /mount/opensource_files /mount/f2/distfiles
# mount /mount/opensource_files /mount/f2/usr/src
# umount /dev/sda1
# umount /dev/sda2
В случае, если какой-то из разделов откажется отмонтироваться, вычисляем процесс которым он занят, и убиваем его:

Код:
# fuser -u -m /dev/sda1
# kill PID
На этом все.

p.s. Заранее извиняюсь за ошибки, неточности, очепятки. За потерю данных, при выполнении действий описанных в этой статье, ответственности не несу.
p.p.s. Спасибо за найденную ошибку, разумеется count=1, исправил. http://www.linux.org.ru/jump-message.jsp?msgid=2215881&cid=2216553

© BMaster

Последний раз редактировалось BMaster; 21.10.2007 в 13:04..