Установка Linux и шифрование ее и всего содержимого жесткого диска.

Нам понадобятся:
1. Дистрибьютив Linux. Я здесь и далее использовал Slackware 14.2
2. Live CD Linux, я использовал Puppy Rus Slacko,

Идея в том, чтоб наша ОС и данные находились на надежно зашифрованных разделах, на жестком диске внешне не должно быть никакой разбивки, а система загружалась без ввода парольной фразы или ключа.
Как это можно реализовать
Загрузчик системы и ключ доступа будут храниться на небольшом(<50Mb) разделе флешки, при включении загрузчик разблокирует доступ к шифрованному винту, загружает ядро, далее происходит обычная загрузка системы.

Я не стал использовать LVM, а вместо LUKS выбрал клон truecrypt’а — tcplay

Этап #1. Разбиение диска на разделы

Итак, первым делом создаем нужные разделы на диске. Я сделал это в графической оболочке Puppy Rus с помощью имеющегося на диске gparted, но ничего не мешает вам сделать это с помощью другой программы.

Этап #2.
Подготовка загрузочной флешки.

Действуем как в вышеупомянутой статье – разбиваем флешку на 2 раздела, первый большой и видимый из Windows и других ОС, второй маленький – с загрузчиком операционной системы и ключами, отформатированный в Ext2. В статье рекомендуется сделать его приблизительно 50 Мб, и для загрузчика GRUB, ядра, хранения начальных настроек этого хватит. Я же сделал второй раздел побольше (1Гб) и перенес на него дополнительно Live дистрибутив Puppy Linux (чтоб в процессе настроек не грузиться с CD или другой флэшки).

Этап #3.
Установка загрузчика GRUB

Необходимо извлечь загрузочные флешки с которых ставили ОС, и/или с которых загружали Puppy Slacko, если таковые были использованы, и вставить нашу размеченную подготовленную загрузочную флешку.

Я воспользовался графической утилитой установки GRUB c LiveCD Puppy Slacko, доступ к которой можно получить из главного меню Puppy Slacko (оно по-умолчанию там же где и «Пуск» у Windows) «Система» — «Настройка загрузчика GRUB»
1. В первом диалоговом окне выбираем способ установки simple
2. Во втором предлагается выбрать разрешение экрана при загрузке, я выбрал standart, ибо для Slackware потом все равно необходимо перенастроить параметры разрешения экрана при загрузке в конфиге GRUB.
3. В следующем окне необходимо указать местоположение директории boot, это второй раздел нашей флешки, который у меня называется sdb2, соответственно указывается устройство /dev/sdb2
4. В следующем окне выбираем запись загрузчика в MBR
5. В следующем окне вводим устройство, в MBR которого будет записан загрузчик, в данном случае это наша флешка, которая обозначена как /dev/sdb (у меня)

Этап #4.
Правим конфиг GRUB
Открываем в любом удобном текстовом редакторе файл menu.lst на нашей флешке (у меня /mnt/sdb2), удаляем все строки и вносим следующие:
Если вы загрузились в графической оболочке Puppy Slacko файл по-умолчанию откроется в Geany

# GRUB configuration file '/boot/grub/menu.lst'.
# generated by 'grubconfig'.

# Start GRUB global section
timeout 30
color light-gray/blue black/light-gray
# End GRUB global section

Строки начинающиеся с # — комментарии, и нужны только для удобства
timeout 30 – время, которое загрузочное меню будет ожидать выбора пользователя. По прошествии этого времени (в секундах) будет загружена первая в списке ОС (см. далее)
color […] – установка цвета загрузочного меню (подробнее см. руководство по GRUB)

Этап #5.
Установка дистрибутива Puppy Slacko на флешку. Его можно пропустить, если вы решили загружать Live дистрибьютив с другой флешки, CD, или используете иной Live дистрибьютив.

Во втором разделе флешки создаем каталог slacko и копируем туда 3 файла с Live CD:
vmlinuz
initrd.gz
puppy_slacko_x.x.sfs
(где вместо x.x – версия дистрибьютива, у меня puppy_slacko_5.5.sfs)

Правим конфиг GRUB
После внесенных ранее строк добавляем:

# Puppy Slacko config begins
  title Slacko Puppy Linux
  root (hd0,1)
  kernel /slacko/vmlinuz ro vga=normal
  initrd /slacko/initrd.gz
# Puppy Slacko  config ends

Проверка
Перезагружаем компьютер, заходим в BIOS, и выставляем первым загрузочным устройством нашу флешку. Если все сделано правильно, то компьютер загрузится и на экране отобразится загрузочное меню GRUB с единственным пока пунктом. При его выборе клавишей Enter или по прошествии 30 секунд начнется загрузка Puppy Slacko.

Этап #6
Установка основной ОС.
Устанавливаем и настраиваем ОС по своему вкусу. Я на этом этапе просто произвел чистую установку ОС с CD-диска, но не стал это делать полностью автоматически, а подключил ранее созданный раздел swap и назначил точки монтирования для корня и директории /home, примонтировав их соответственно в первый и второй раздел, которые были созданы на диске.

Далее в процессе установки необходимо отказаться от настройки системного загрузчика, мы не будем грузиться с жесткого диска, после чего выбрать завершающие настройки, установить root-пароль и т.д. В завершающих настройках я выбрал IP-forwarding (сейчас он не нужен, но понадобится в дальнейшем), автоконфигурацию SSH.

Этап #7
Загрузка установленной ОС.

Загружаемся с Live CD Puppy Slacko (либо иного), либо с флешки, если вы установили на нее Puppy Linux, выбрав единственный пока пункт Slacko Puppy Linux.

1. Создаем на ext2 разделе флешки каталог, например, slackboot
2. Заходим на жесткий диск компьютера в раздел, на который была установлена система, и копируем содержимое директории boot в этот каталог на загрузочной флешке

2. Правим конфиг GRUB.
Добавляем после строк
# End GRUB global section
следующие строки:

# Linux bootable partition config begins
  title Slackware 14.2
  root (hd0,1)
  kernel /slackboot/vmlinuz root=/dev/sda1 ro video=VGA-1:640x480@75
# Linux bootable partition config ends

3. Сохраняем файл и перезагружаемся в основную ОС.

4. Теперь ее можно предварительно сконфигурировать как вам угодно, только сильно не увлекайтесь :).
Я, например, создал простого пользователя и переопределил уровень инициализации системы, исправив inittab, дабы при загрузке не запускался ненужный мне x-server, настроил ssh.
Отступление. Пояснение строк конфигурации GRUB.
title – это наименование пункта в загрузочном меню, после title и пробела можно вводить любые латинские символы.
root (hd0,1) – указывает загрузчику GRUB где находятся его файлы. Первая цифра обозначает номер жесткого диска (с ноля), в той последовательности, определяемой BIOS (зависит от конкретной машины), второе число – номер раздела на жестком диске (с ноля). На нашей флешке это второй раздел (1).
kernel – определяет, где находится ядро, а далее ему передаются параметры. В нашем случае устройство, на котором расположен корневой раздел (root=/dev/sdb1), то, что корневая файловая система в процессе загрузки монтируется в режиме «только чтение» (ro) и установка видеорежима при загрузке.

Этап #8
Установка необходимых программ.

Необходимо установить src2pkg с помошью installpkg
Далее необходимо скачать исходники tcplay
В каталоге со скаченным архивом выполняем src2pkg -C tc-play-2.0.tar.gz, и после завершения процесса получаем пакет slackware, который устанавливаем с помошью installpkg

Итак, первая часть подготовки системы к шифрованию завершена, и вроде бы все готово –осталось только пошифровать разделы, но нет. Вместе с разделами же будет зашифрована и программа шифрования, программа инициализации ОС init, ее конфиг /etc/inittab и прочие важные компоненты системы. Что же делать? Необходимо как-то загрузить программу шифрования до того, как придет время ОС инициализироваться. И в этом поможет initrd.
Initrd расшифровывается как «initial ramdisk» (начальный виртуальный диск). Начальный виртуальный диск, это очень маленькая файловая система Linux, которая загружается в оперативную память и монтируется в качестве загрузчика ядра, перед монтированием основной корневой файловой системы.
Кратко об initrd можно прочесть здесь

Этап #9.
Создание минимально работающего initrd

В Slackware инструменты для создания initrd устанавливаются из коробки. Смотрите статью.

1. Я воспользовался скриптом mkinitrd, который запустил со следующими параметрами:

mkinitrd -c -k 4.4.14-smp -m ext2 -L

где – очистить временный каталог с файловой системой initrd
-k 4.4.14-smp – указание скрипту mkinitrd версии ядра (ее можно узнать командой uname -r)
-m ext2 — указание скрипту mkinitrd подгрузить модуль ядра для файловой системы ext2
-L – добавить в образ initrd поддержку томов LVM. Вообще, я тома LVM не использую, и в принципе все работает и без их поддержки, но так лучше. Без нее при подключении разделов расшифрованного тома выходят warning’и, плюс если ее указать, автоматически добавится библиотека libdevmapper.so.2 нужная для работы tcplay.
Важно! Если не указать модуль ядра для файловой системы, то диск, на котором расположена директория / не сможет быть примонтирован, соответственно при загрузке мы получим kernel panic
Важно! Если требуется добавить несколько модулей (например, для поддержки нескольких файловых систем или блочных устройств loop), то нужно перечислить их через двоеточие, например:

mkinitrd -c -k 3.7.1-smp -m ext2:loop -L

Кстати, поддержка блочных устройств loop потребуется, если вы захотите из initrd обращаться не только к зашифрованному жесткому диску, но и к шифрованным файлам-контейнерам truecrypt/tcplay

2. Примонтируем второй раздел нашей загрузочной флешки, выполнив в командной строке:
создание точки (каталога) монтирования (если ранее не создан)
mkdir /mnt/sdb2
команду монтирования
mount -t ext2 /dev/sdb2 /mnt/sdb2

3. Копируем созданный образ initrd.gz из каталога /boot на флешку в каталог с ядром нашей ОС. В моем случае это /mnt/sdb2/slackboot

4. Правим конфигурацию GRUB, создаем там дополнительный пункт меню для тестирования нашего образа initrd.

# Linux bootable partition (test) config begins
  title Slackware Test Initrd
  root (hd0,1)
  kernel /slackboot/vmlinuz root=/dev/sda1 ro video=VGA-1:640x480@75
  initrd /slackboot/initrd.gz
# Linux bootable partition (test) config ends

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

Этап #10
Добавление своего скрипта в initrd и его запуск.
Заходим в ранее созданный программой mkinitrd каталог /boot/initrd-tree и создаем в нем файл с любым именем, например myinit, в файл добавляем следующие строки:
#!/bin/ash
echo "Hello, world!"
/bin/sh

Первая строка, как и во всех скриптах linux указание на используемый командный интерпретатор. Обычного, самого часто употребляемого интерпретатора bash в образе initrd может и не быть, какой интерпретатор предпочтителен для вашей версии initrd можно подсмотреть в файле /boot/initrd-tree/init
Скрипт, да это и понятно из его содержания, не делает ничего особенного – выводит сообщение "Hello, world!" и запускает командный интерпретатор sh (который должен находиться в /boot/initrd-tree/bin) либо там должна быть ссылка sh на, в моем случае, утилиту bisybox.
bisybox — набор UNIX-утилит командной строки, используется в качестве основного интерфейса во встраиваемых операционных системах (и в образах initrd даже для не встраиваемых систем – пр. авт.) Преимуществами этого приложения являются малый размер и низкие требования к аппаратуре. Оно представляет собой единый файл (это позволяет сэкономить дисковое пространство).

Теперь сохраним скрипт и установим для него права доступа – на чтение, запись и исполнение для владельца (root) и на исполнение для других. Правильные права тоже можно подсмотреть, установив их как у файла /boot/initrd-tree/init

Далее, редактируем файл /boot/initrd-tree/init Конечно, можно вписывать команды прямо в нем, но в него я решил добавить только команду запуска нашего скрипта, а необходимые нам команды будем писать уже в нем, так аккуратнее, проще и читабельнее.

Находим в файле /boot/initrd-tree/init строку, после которой происходит инициализация основной системы, и перед ней вставляем запуск нашего скрипта.

В моем случае я прописал запуск скрипта перед комментарием
# Switch to real root partition

[…]  
/myinit
  # Switch to real root partition
[…]

Сохраняем скрипт init, выходим из директории /boot/initrd-tree/, удаляем из директории /boot ранее созданный initrd.gz и запускаем mkinitrd без параметров, далее примонтируем нашу загрузочную флешку, заменяем файл /mnt/sdb2/absolute/initrd.gz на пересозданный initrd.gz, перезагружаем компьютер и выбираем созданный на этапе 12 пункт для тестирования initrd.gz

Если все сделано правильно, то в конце загрузки будет выведено сообщение «Hello, world!» и приглашение оболочки

/#

Поздравляю! Мы загрузились с помощью образа initrd до загрузки основной ОС.
Для продолжения загрузки надо ввести exit и нажать enter. Управление будет передано программе init из основной ОС и основная ОС загрузится.

One Response to Установка Linux и шифрование ее и всего содержимого жесткого диска.

  1. Pingback: Домашний сервер на базе Slackware Linux | Персональный блог Толика Панкова

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*