Загрузка ОС Linux: этапы, иерархия процессов, значение для ИБ

Этапы загрузки операционной системы Linux

Этапы загрузки Linux можно разделить на несколько шагов:
Общая схема процесса загрузки Linux
Первые шаги зависят не от операционной системы, а от аппаратного обеспечения — материнской платы и её прошивки. Другими словами, до инициализации ядра наш компьютер ещё ничего не знает об операционной системе, с которой ему предстоит работать, поэтому описанные процессы характерны для загрузки любой ОС.

POST-проверка

Компьютер включается и выполняется POST (сокр. от Power-On Self-Test — «самотестирование при включении») для проверки работоспособности системного оборудования. POST выполняется программами, входящими в используемую прошивку на материнской плате (микропрограмму). Такими типами прошивок являются BIOS (Basic Input/Output System) или (U)EFI (Unified Extensible Firmware Interface). Думаю, вам хорошо знакомы подобные интерфейсы, где можно задать приоритет загрузки устройств, настроить параметры аппаратного обеспечения компьютера, посмотреть данные прошивки или восстановить заданные по умолчанию значения параметров компьютера:
Главное меню BIOS
Интерфейс специальной оболочки UEFI BIOS Utility
BIOS/UEFI инициализируются первыми и после POST-проверки выполняют поиск загрузочного устройства для запуска операционной системы. Так, в меню загрузки вы можете выбрать загружаемую операционную систему. Например, если на вашем компьютере установлено несколько дистрибутивов Linux или других операционных систем, вы можете добавить их в меню загрузки.
Меню загрузки. В качестве предустановленных ОС — Windows и Linux (Ubuntu)

Первый этап загрузки (MBR или GPT)

После проведения теста POST прошивка обращается к жёсткому диску или твердотельному накопителю. В случае BIOS ему нужны первые 512 байт (первый сектор загрузочного диска), именно там находится главная загрузочная запись — MBR (Master Boot Record), это загрузчик первого этапа. Основная задача MBR — это «переход» в тот раздел диска, с которого необходимо выполнять дальнейший код загрузки операционной системы.

Таблица разделов в MBR имеет крайне малый размер, поэтому разметить накопители объёмом более 2 терабайт нельзя. К тому же она использует устаревшую адресацию, с цилиндрами, головками и секторами жёсткого диска, поэтому сейчас всё чаще вместо MBR можно встретить более современную технологию — GPT (Guided Partition Table), которая идёт в связке с UEFI. 

Интерфейс расширяемой прошивки EFI (позднее унифицированный UEFI) — это разработка Intel. Он был создан потому, что BIOS имеет ряд недостатков, к которым относятся: 
1
Медленная загрузка. BIOS работает в 16-битном реальном режиме процессора, а поиск загрузочного устройства происходит последовательно, что увеличивает время загрузки.
2
Нет варианта безопасной загрузки. BIOS не поддерживает Secure Boot, что делает систему уязвимой к атакам на загрузчик, например, руткитам. UEFI поддерживает Secure Boot, проверяя цифровые подписи загрузчика и ядра, что защищает от вредоносного кода.
В случае с UEFI ситуация схожая: сначала выполняются функции системной конфигурации, так же как и BIOS. После проверки устройств UEFI может самостоятельно обратиться к таблице разделов GPT, где её интересует EFI-раздел. В разделе /boot/efi обязательно должна быть папка EFI, в ней находится загрузчик по умолчанию, например grubx64. efi, как на скриншоте ниже: 
Содержимое каталога /boot/efi/EFI/ubuntu
Итого имеем: традиционный метод BIOS-MBR или более современный UEFI-GPT. В MBR или GPT — расположение загрузчика второго этапа. После обнаружения загрузчика управление передаётся на него.
  • Важно!
    На компьютерах с UEFI поддержка MBR никуда не делась, но для переключения между структурами разделов вам придётся активировать определённый режим в зависимости от производителя материнской платы. Это нужно для совместимости со старыми операционными системами. 

Второй этап загрузки (GRUB)

Загрузчик — программа, которая запускается прошивкой. Задача загрузчика второго этапа состоит в том, чтобы найти ядро системы и загрузить его в память. В зависимости от того, что используется: BIOS или UEFI, выбор загрузчика отличается.

Большинство дистрибутивов Linux используют в качестве загрузчика GRUB (GRand Unified Bootloader), где есть простое меню, в котором вы можете выбрать опции загрузки.
Выбор ядра в меню загрузчика GRUB
GRUB существует в версиях как для BIOS, так и для UEFI. Конфигурационными файлами загрузчика GRUB обычно являются файлы /boot/grub/grub.conf или, например, /boot/efi/EFI/fedora/grub.cfg. Как только загрузчик находит ядро, он загружает его в оперативную память и передаёт ему дальнейшее управление.
На самом деле, загрузчиков существует большое количество, и у каждого из них есть свои функциональные особенности и возможности, в частности поддержка определённой файловой системы. Например, раньше в дистрибутивах Linux использовался преимущественно мультизагрузчик LILO (LInux LOader), но на сегодняшний день GRUB почти полностью вытеснил его.

Иерархия процессов при загрузке Linux

Инициализация и запуск ядра

Linux — это ядро, а значит, сердце операционной системы. Ядро находится в каталоге /boot (о структуре каталогов мы ещё поговорим, буквально в следующей главе) и отвечает за взаимодействие между основными компонентами компьютера и операционной системой. Сам файл имеет название vmlinuz. «vm» в начале говорит о том, что ядро будет размещено в виртуальной памяти. А «z» на конце означает, что ядро запаковано в архив, поэтому первое, что оно сделает, как только получит контроль, — это произведёт свою самораспаковку. В процессе запуска ядра настраивается оборудование, запускается менеджер памяти, происходит монтирование образа корневой файловой системы и запускается процесс инициализации системы. 
Файлы ядра Linux
Перед монтированием корневой файловой системы (/) загружается initramfs (или initrd — Initial RAM Disk). Это временная корневая файловая система в оперативной памяти, содержащая драйверы и утилиты, необходимые для загрузки. А после подготовки реальной файловой системы initramfs передаёт управление главному процессу.

Инициализация главного процесса (init или systemd)

Ядро загрузилось и работает, но этого недостаточно для работы с операционной системой, взаимодействовать с ней на прикладном уровне ещё нельзя. Для того чтобы можно было что-то сделать в Linux, управление получает главный процесс инициализации, который приводит к запуску всех необходимых служб и программ, в том числе для управления клавишами или работы с графической оболочкой, а значит, является прародителем всех процессов в системе и имеет идентификационный номер (PID, Process ID), равный 1.

Важно понимать, что системы инициализации могут отличаться. Рядовому пользователю они безразличны и интересны лишь тем, кто добавляет свои службы и утилиты в тот или иной дистрибутив Linux. Для нас же система инициализации говорит об основном родительском процессе, его положении в иерархии. Так, в более устаревшей системе инициализации Sysvinit (SysV) главным процессом является процесс init, а в системе инициализации systemd — одноимённый процесс systemd.
И конечно же, помним про концепцию «Всё есть файл»: так, большая часть файлов systemd представлена конфигурационными файлами, ссылающимися на конкретные утилиты и сервисы.
Основные файлы systemd для управления сервисами, устройствами и другими компонентами ОС
Отдельным преимуществом systemd является так называемый супервизор. Он следит за тем, чтобы все критически важные службы работали. Если какой-то службы не хватает, то он сразу же запустит её снова. Его также применяют для поддержания работы серверов.

Запуск пользовательского окружения в Linux

Система инициализации, помимо всего прочего, запускает для каждого виртуального терминала программу для управления им и запроса учётных данных для последующей аутентификации. Предоставленные входные данные проверяются по файлам /etc/passwd и /etc/shadow.

Виртуальные терминалы Linux: отличия tty- от pts-устройств

  • tty (Teletype) — исторически это физические устройства, подключённые к компьютеру. Сейчас это виртуальные консоли, доступные через Ctrl + Alt + F1… F6. Пример: /dev/tty1 — первая виртуальная консоль, полноэкранный сеанс;
  • pts (Pseudo Terminal Slave) — это псевдотерминалы, т. е. эмулируемые именно программным обеспечением. Используются для эмуляции терминала в SSH-сессиях, утилит типа screen или Tmux. Выглядит схожим образом, через файл устройства: /dev/pts/0 — первый псевдотерминал, /dev/pts/1 — второй и так далее.
pts — это, по сути, эмуляция терминала для графических программ и удалённых сессий, а tty — «настоящие» терминалы (локальные или виртуальные консоли).
После успешной авторизации выводится содержимое файла /etc/motd (message of the day, сообщение дня).

Обычно motd используют, чтобы напомнить пользователям о правилах работы или политиках работы. Но иногда им пользуются и злоумышленники: добавив всего несколько строк в этот файл, они обеспечивают себе устойчивое закрепление на скомпрометированной машине, ведь содержимое motd автоматически выполняется при каждом входе пользователя. Кроме того, motd может служить и другим целям атакующих. Например, в одной из кампаний операторы программы-вымогателя Monti модифицировали этот файл, разместив в нём сообщение с требованием выкупа.

Хотя эти два примера демонстрируют разные сценарии эксплуатации, в обоих случаях важно понимать, какие угрозы в себе могут нести определённые системные механизмы и что конкретно нужно исправлять при «зачистке» системы.
Прежде чем вывести строку приглашения для ввода команд, сразу после запуска командная оболочка исполняет файл настроек пользовательской сессии. 

Теперь наша система готова к работе.
Итоги
Загрузка системы происходит так:
Аппаратная инициализация (BIOS-MBR или UEFI-GPT) → Загрузчик второго уровня (GRUB) → Инициализация и загрузка ядра Linux → Запуск системы инициализации (init или systemd) → Запуск пользовательского окружения.

Так как в процессе на каждом из этапов используются определённые системные файлы, понимание каждого элемента поможет нам не только понимать взаимодействие компонентов, но и использовать это в дальнейшем при анализе данных со скомпрометированной системы. Это особенно полезно при поиске попыток злоумышленника замаскировать свою активность под системную.

Курс Linux Incident Response & Security в Inseca

Практический курс по выявлению, анализу и реагированию на киберугрозы в GNU/Linux-системах за 9 недель. Научитесь выявлять признаки компрометации, работать с файловыми артефактами, памятью и контейнерами, а также проводить расследования инцидентов и выстраивать защиту. Подходит специалистам с опытом в ИТ/ИБ от 1 года, желающим прокачать свои навыки в реагировании на инциденты в Linux-средах. Аналитикам SOC, чтобы узнать, как работают реальные атаки и уметь их выявлять, а также приоритезировать события. ИТ-администраторам, для понимания, что и в какой последовательности делать при столкновении с инцидентом и руководителям ИТ-отделов, перед которыми стоит задача внедрить лучшие практики по мере построения/модернизации Linux-инфраструктуры
Начните бесплатно
В демоверсии узнаете больше о курсе, сможете пройти несколько уроков и убедиться, что он вам точно подходит
Другие статьи
Поиск по открытым источникам данных.