ТРИ СТОЛПА OPENBSD
OpenBSD держится на трех столпах, причем не просто держится, а вцепилась в них мертвой хваткой:
• приверженность идеям СПО;
• качество кода;
• безопасность.
ИДЕИ СПО
Разработчики OpenBSD очень трепетно относятся к тому, каким образом лицензируется код для включения в систему. Исходный код самой системы распространяется под лицензией ISC, которая является упрощенным вариантом лицензии BSD и сводится к одному простому предложению: «Делайте с кодом все, что хотите, но не говорите, что он написан вами».
Однако в отношении стороннего софта, включенного в поставку OpenBSD, действуют жесткие правила. По сути, есть только две приемлемые для разработчиков сторонние лицензии: BSD и MIT, остальные считаются «нежелательными». По этой причине разработчики регулярно предпринимают попытки переписать известный GNU-софт, распространяемый по лицензии GPL, или найти ему замену. В свое время были переписаны многие утилиты, включая diff и grep, а знаменитый OpenBSD-шный брандмауэр PF появился как ответ на изменение политики лицензирования IPFilter. Регулярно поднимается вопрос о создании собственного C-компилятора для замены GCC, однако возможностей для этого пока нет.
Тео де Раадт никоим образом не приемлет включение бинарных блобов в ядро. По его словам, бинарный код, аудит которого нельзя провести, не вызывает доверия и может работать абсолютно непредсказуемо или содержать закладки. Поэтому нередко разработчики OpenBSD вынуждены заниматься реверс-инжинирингом проприетарных драйверов, и именно благодаря этим ребятам мы имеем открытые драйверы для многих устройств.
КАЧЕСТВО КОДА И БЕЗОПАСНОСТЬ
OpenBSD по праву считается «системой для параноиков». Такого количества включенных по умолчанию средств защиты нет больше ни в одной другой продакшен ОС. Более того, многие из средств защиты, используемых сегодня повсеместно (privilege separation, например), были либо придуманы, либо впервые внедрены разработчиками OpenBSD. Эти механизмы совершенствуются с каждым новым релизом ОС, регулярно появляются и обкатываются новые идеи.
Одна из ключевых идей OpenBSD — тотальная рандомизация всего, что только можно. Процессы всегда создаются с рандомными идентификаторами (PID), номера inode при создании файлов назначаются случайным образом,
системный вызов bind() использует случайные порты для привязки сокетов, начальные номера последовательности в TCP-соединении всегда случайны, timestamp’ы случайны. Все это сделано для того, чтобы максимально усложнить жизнь взломщику.
Вторая идея — всесторонняя борьба с атаками, направленными на срыв стека. Первая линия обороны здесь — это уже ставший стандартом принцип privilege separation, когда приложение получает необходимые ему повышенные полномочия (права root) только на короткие промежутки времени, так что взломщик приложения не сможет раздобыть права root в большинстве случаев.
Лучший пример здесь — это OpenSSH, который работает попеременно на трех «уровнях доступа»: monitor, в котором ему доступны права root, slave — когда код работает с правами специального юзера sshd, и второй вариант slave, когда OpenSSH обслуживает пользовательскую сессию и работает с его правами.
Вторая линия обороны — безопасные версии функций Libc и -fstackprotector. Когда-то, чтобы решить проблему переполнения буфера при использовании функций strcpy() и strcat(), в библиотеку Libc были введены функции strncpy() и strncat(), позволяющие ограничить размер копируемых данных и не допустить переполнения. Однако сами эти функции также оказались уязвимыми и в случае неправильного использования тоже приводили
к выходу за границы буфера. По этой причине разработчики OpenBSD реализовали собственные «правильные» версии функций под названием strlcpy() и strlcat() и перевели на их использование все компоненты ОС.
OpenBSD также была одной из первых систем с принудительной сборкой всех приложений компилятором GCC с включенной опцией ProPolice (аргумент командной строки -fstack-protector). Данный механизм слегка модифицирует код приложения перед окончательной сборкой, а именно заставляет его размещать в стеке случайный набор данных (canary) перед вызовом небезопасных функций и проверять его наличие после совершения вызова. В случае срыва стека canary будет затерт, приложение это заметит и просто завершится.
Данный метод защиты сегодня используется практически во всех ОС, включая все BSD и ведущие дистрибутивы Linux. Но разработчики OpenBSD пошли еще дальше: в дополнение к -fstack-protector они реализовали в ядре механизм, внедряющий небольшой «разрыв» случайного размера в начале стека, так что, если атакующий использует классический прием срыва стека, заставляя приложение исполнять шелл-код, находящийся в самом стеке, он потерпит неудачу, поскольку не будет знать, по какому адресу находится этот код.
Третья линия — ASLR, randomized malloc() и W^X. OpenBSD стала первой ОС с включенным по умолчанию механизмом ASLR. Последний позволяет рандомизировать адреса регионов памяти процесса (таких как стек, куча, область данных), кода и библиотечных функций. В результате выполнить некоторые типы атак, например ret2libc, стало практически невозможно. Кроме того, в OpenBSD имеется уникальный механизм рандомизации кучи путем выделения случайных регионов памяти при вызове malloc() (вместо ее простого расширения).
Еще одна уникальная для OpenBSD функция — это W^X (write or execute). Она гарантирует, что страница памяти процесса одновременно может быть либо записываемой, либо исполняемой, но не оба варианта сразу. Это обеспечивает, например, что внедренный в стек шелл-код не будет выполнен (так как стек — записываемая область памяти). На современных платформах W^X использует специальный NX-бит (No eXecute), появившийся в 64-разрядных процессорах Intel и AMD, и в этом нет ничего уникального (Linux делает то же самое), однако в OpenBSD такая защита работает даже на 32-битных процессорах i386.
В целом уровень защитных механизмов OpenBSD довольно параноидален. Дело доходит даже до того, что по умолчанию шифруется раздел подкачки, причем вовсе не для галочки. Swap-раздел разбивается на небольшие участки, каждый из которых шифруется собственным случайным ключом. Освобождение и «очистка» занятых участков происходит с помощью отзыва ключа.
Но и это еще не все. В последних релизах разработчики пошли дальше и начали выпиливать из ядра вполне полезный, но несущий проблемы с безопасностью код. Так, из версии 5.7 были убраны поддержка модулей ядра (чтобы никто не загрузил ядерный бэкдор) и виртуальная ФС /proc (чтобы никто не подсматривал за чужими процессами), а в текущем коде уже исчезла поддержка эмуляции Linux. Справедливости ради стоит отметить, что в OpenBSD данные механизмы никогда не были особо нужны и рядовой пользователь даже не заметит их отсутствия.
СОФТ
В рамках проекта OpenBSD развивается не только ОС, но и внушительное количество субпроектов. Один из таких проектов — это, конечно же, OpenSSH, но на нем мы останавливаться не будем. Также у проекта есть свой собственный SMTP-сервер (OpenSMTPD), веб-сервер (httpd), спам-фильтр (spamd) и даже
менеджер окон (cwm). В OpenBSD интегрирован PF — один из самых продвинутых брандмауэров, который был портирован во все остальные BSD-системы, OS X, iOS и QNX.
ВЫВОДЫ
Разработчики OpenBSD очень продуктивны во всем, что касается генерации идей и написания сложного кода. Именно они впервые обкатали все те идеи, что сегодня стандартны в других операционных системах, они же создали OpenSSH, без которого жизнь современного админа просто немыслима.
Однако не стоит думать, будто это все, что можно было получить от системы.
OpenBSD очень красива и действительно удобна для применения в продакшене. Здесь все на своих местах и абсолютно логично, утилиты имеют единый интерфейс, встроенные сервисы — единый простой и понятный формат конфигурации, а настраивать даже сложные конфигурации брандмауэра — приятное времяпрепровождение. Достаточно просто поставить систему и попробовать поднять на ее базе какой-то сервис, чтобы ощутить, настолько современный Linux далек от понятия простоты и удобства.
Комментарии 2