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

Вид материалаДокументы

Содержание


2. Постановка задачи
3. Фильтр системных вызовов, протоколирование, активный аудит
4. Интегральное квотирование ресурсов
5. Управление средствами защиты с пользовательского уровня с помощью модульных средств авторизации
Л и т е р а т у р а
Подобный материал:
УДК 004.45


ДОПОЛНИТЕЛЬНЫЕ МЕХАНИЗМЫ ОБЕСПЕЧЕНИЯ БЕЗОПАСНОСТИ В ЯДРЕ ОС LINUX: ФИЛЬТР СИСТЕМНЫХ ВЫЗОВОВ, ПРОТОКОЛИРОВАНИЕ СИСТЕМНЫХ ВЫЗОВОВ, КВОТИРОВАНИЕ РЕСУРСОВ НА УРОВНЕ ПОЛЬЗОВАТЕЛЯ1


С.А. Ахманов, Д.А. Надежкин, Д.А. Раевский


МГУ им. М.В. Ломоносова, Институт Механики, Москва, Россия


На примере OC Linux приводится ряд типичных уязвимостей современных операционных систем. Рассматриваются разработанные и протестированные механизмы защиты – фильтр системных вызовов, позволяющий создать дополнительный эшелон защиты и ограничить роль пользователя в системе на уровне ядра; выборочное протоколирование системных вызовов на уровне ядра и его применение в задаче активного аудита; интегральное квотирование ресурсов как один из способов защиты от атак типа “отказ в обслуживании”. Анализируются архитектура данных механизмов, сферы их применения, результаты тестов производительности, а также средства комплексного управления ими с пользовательского уровня посредством модульных средств авторизации.

1. Введение


В качестве основы для данных разработок была выбрана ОС Linux [1,2]. Данный выбор представляется оптимальным. В качестве аргументов в пользу такой точки зрения можно привести благоприятную лицензию (свободное распространение с исходными текстами, простота внесения модификаций), динамичность развития (благодаря большому количеству разработчиков), а также значительное число уже заложенных механизмов безопасности, часть из которых традиционна для Unix-систем, часть – специфична для Linux.

Проведенный анализ существующих в ОС на основе ядра Linux механизмов защиты выявил их недостатки с точки зрения обеспечения безопасности в распределенных высокопроизводительных системах.

Для устранения выявленных недостатков и усиления безопасности были предложены несколько механизмов защиты уровня ядра ОС, разработаны и протестированы заплатки (patches) для ядра Linux утилиты пользовательского уровня для управления ими. Их применение возможно как независимо (в систему можно внедрить один из описанных механизмов), так и в комплексе.

2. Постановка задачи


В соответствии с руководящими документами по информационной безопасности ("Общие Критерии Оценки Безопасности Информационных Технологий" [3], [4]) механизмы безопасности должны закладываться в систему на этапе проектирования. В существующих системах механизмов безопасности недостаточно, так как на этапе их проектирования, как правило, не учитывается специфика решаемой задачи; кроме того, не в полной мере учтен потенциал возможных злоумышленников (особенно это верно в системах, подключенных к сети Интернет) — только эшелонированная оборона в состоянии обеспечить безопасность.

Таким образом, возникает задача усиления безопасности ОС на базе ядра Linux. Задача естественным образом распадается на две части. Первая часть заключается в анализе недостатков в существующих механизмах обеспечения безопасности и выработке рекомендаций по устранению этих недостатков. Вторая часть заключается в программной реализации рекомендаций. Задачей настоящей работы являлась разработка и реализация следующих механизмов.

Фильтром системных вызовов мы называем набор программных средств (на уровне ядра и на пользовательском уровне), позволяющий системному администратору выборочно блокировать системные вызовы. Применение фильтров различных типов позволяет обеспечить защиту системы от ряда атак, для которых применение других средств защиты либо затруднительно, либо вообще невозможно. Наиболее важной составляющей архитектуры фильтра является хранение и применение правил фильтрации на уровне ядра, что существенно сказывается на производительности системы. В противном случае падение производительности системы в целом настолько велико, что ее применение в высокопроизводительных распределенных вычислениях становится нецелесообразным. Посредством фильтра администратор компьютерной системы может закрывать отдельным пользователям доступ к определенным функциям ядра, тем самым ограничивая роль пользователя в системе. Например, в некоторых случаях разумно заблокировать непривилегированным пользователям вызовы mount(), umount(), ptrace().

Аналогично правилам выборочной блокировки системных вызовов имеет смысл применять на уровне ядра правила выборочно протоколирования системных вызовов. Это также несущественно сказывается на производительности системы, но, в тоже время, является важным источником информации для администратора компьютерной системы или разработчика. Существует целый ряд событий, которые было бы важно протоколировать, но стандартные возможности ядра не позволяют это сделать. К числу таких событий отнесем обращение к ряду системных вызовов (например, open(), exec(), setuid()), которые потенциально могут привести к компрометации системы. Так, открытие файла /etc/shadow может означать, что злоумышленник получил доступ к паролям в системе. Все эти задачи могут быть решены посредством выборочно протоколирования системных вызовов.

Для ряда задач, прежде всего связанных с активным аудитом, необходимо протоколировать произвольное выбранное подмножество системных вызовов. Имеющееся для этого средство прикладного уровня strace является неудовлетворительным по следующим причинам:
  • существенное замедление работы системы;
  • невозможность протоколирования именно выбранного набора вызовов;
  • невозможность обработки программ, меняющих свой идентификатор.

Таким образом, для повышения безопасности системы необходимо реализовать дополнительные средства протоколирования.

Одной из основных угроз для современных компьютерных сетей является угроза атаки на отказ в обслуживании. Как правило, такие атаки основываются на исчерпании одного или нескольких ресурсов системы. Для предотвращения захвата слишком большого количества ресурсов одним пользователем используются механизмы квотирования, ограничивающие объем доступных для субъекта ресурсов. Это особенно актуально для высокопроизводительных распределенных систем, так как захват пользователем дополнительных ресурсов может существенно понизить производительность системы.

В ядре ОС Linux имеются продвинутые механизмы квотирования файловых ресурсов, позволяющие ограничить объем дисковых данных и количество файлов, принадлежащих пользователю. Прочие ресурсы (оперативная память, число открытых файловых дескрипторов, процессорное время, и т.п.) могут быть квотированы на основе процесса. Это неудобно – если задать слишком маленькую квоту, ключевые процессы пользователей станут неработоспособными, если задать квоту побольше – пользователь сможет захватить большой объем ресурсов, не являющихся необходимыми для нормальной работы. Выходом должно стать создание системы интегрального квотирования ресурсов, когда будут ограничиваться ресурсы на основе пользователя, а не на основе процесса.

3. Фильтр системных вызовов, протоколирование, активный аудит


В ОС Linux не существует возможности выборочной блокировки системных вызовов, а стандартное средство протоколирования (strace) не позволяет гибко формулировать правила отбора на уровне ядра, что ведет к значительному снижению производительности и на практике применение strace возможно только для отладки программ. Применение правил фильтра на уровне ядра позволило добиться практически незаметного снижения общей производительности системы (не более одного-двух процентов) и резко расширить сферу применения.

Подробное описание архитектуры и деталей реализации фильтра системных вызовов и средств протоколирования выходит за рамки настоящей публикации (подробнее эти вопросы освещены в [5], [6], [7]). Рассмотрим наиболее интересные сферы применения этих разработок и перспективы их дальнейшего развития.

Статистика нарушений режима информационной безопасности показывает необходимость дополнительного рубежа защиты, предоставляемого средствами активного аудита. Однако, современные средства активного аудита, как правило, реализуют сигнатурный подход к анализу, что обеспечивает выявление только известных атак, да и то не всех [8]. Так, атаки на переполнение буферов, представляющие существенную опасность (вспомним хотя бы известные атаки на ssh-сервер [9]), как правило не отражаются в регистрационных журналах и, соответственно, практически не отлавливаются традиционными средствами активного аудита. Неизвестные атаки также проходят незамеченными. Для решения этой проблемы разумно использовать статистические и нейросетевые анализаторы [8]. В частности, для выявления атак на переполнение буферов представляется перспективным использовать нейросетевой анализатор на базе следа системных вызовов (начала такого подхода можно найти в [10]).

Приведем типичный пример. Рассмотрим почтовый сервер, например sendmail. Демон sendmail и все его процессы-потомки выполняют вполне ограниченный круг задач. Естественно, набор и семантика системных вызовов, которые они используют, ограничены. Если, например, данный почтовый сервер будет подвержен успешной атаке типа “переполнение буфера”, ее результатом будет, скорее всего, запущенная атакующим пользовательская оболочка (shell). Допустим, атакующий попытается воспользоваться полученной оболочкой, например, будет просматривать какие-то файлы и каталоги. Набор системных вызовов, используемых процессом sendmail и его процессами-потомками, изменится.

Таким образом может быть построена система активного аудита, основанная на выборочном протоколировании системных вызовов. В данном случае достаточно предварительно собрать статистику системных вызовов в случае типичного поведения, а далее, в случае не типичного поведения, любо остановить почтовый сервер и все его процессы-потомки, либо с помощью фильтра системных вызовов запретить им все системные вызовы до вмешательства администратора. Кроме того, последующий анализ результатов протоколирования системных вызовов позволит точно найти место в исходных текстах кода почтового сервера, в котором была найдена уязвимость.

4. Интегральное квотирование ресурсов


В ядре ОС Linux (в работе рассматривались ядра версий 2.2.х, 2.4.х) реализован контроль использования и распределения ресурсов только на уровне отдельно взятого процесса (механизм rlimit, resource limits). Механизма же, позволяющего контролировать использование системных ресурсов на уровне отдельного пользователя в ядре нет.

Наличие resource limits позволяет отслеживать использование (а так же устанавливать необходимые ограничения) процессорного времени, оперативной и дисковой памяти, а так же контролировать количество создаваемых процессов, файловых дескрипторов и т.д. Но хотелось бы осуществлять наблюдение и распределение всех вышеперечисленных (и других) ресурсов на уровне пользователя (user limits), то есть суммарно по всем его задачам.

При реализации механизмов контроля ресурсов (суммарно по всем задачам пользователя) операционной системы возникает несколько вопросов, а именно:
  • какие ресурсы необходимо контролировать;
  • по какому принципу организовывать данный контроль;
  • где и в каком виде хранить необходимую информацию;
  • способы настройки и управления данной системы контроля;
  • как добавление в ядро этих механизмов скажется на производительности.

При разработке данной системы контроля были учтены все вышеперечисленные требования, и в итоге была написана заплатка (patch) для ядра Linux, добавляющая необходимую функциональность, а именно обеспечение контроля при использовании и распределении ресурсов.

Ресурсов, которые можно контролировать по всем задачам пользователя, довольно много, но пока был реализован контроль следующих из них: количество процессов пользователя, процессорное время, выделяемое суммарно всем задачам пользователя, а так же количество файловых дескрипторов, принадлежащих пользователю.

Почему были выбраны именно эти ресурсы? Количество процессов нужно строго отслеживать, так как каждый новый процесс требует памяти, процессорного времени, файловых дескрипторов и т.п. Процессорное время необходимо контролировать, чтобы его можно было разделить между всеми пользователями системы по каким-то критериям. Файловые дескрипторы были выбраны потому, что, не смотря на название, они отвечают за работу с файлам, сокетами (sockets), каналами (pipes) и др.

Общая структура разработанных механизмов контроля позволяет по необходимости добавлять поддержку других ресурсов. Управление механизмами контроля ресурсов осуществляется с помощью двух системных вызов (реализованных в заплатке для ядра), что позволяет создавать любые приложения пользовательского уровня, взаимодействующие с механизмами контроля ресурсов. Несомненным достоинством использованного в работе подхода является реализация системы контроля на уровне ядра, что обеспечивает минимальное падение производительности (по результатам проведенных тестов общее падение производительность составило не более 1,6% - 2%).

Работа в данном направлении продолжается, а именно расширение функциональности, добавление поддержки контроля новых типов ресурсов (а именно оперативная память), а так же портирование на новые версии ядра Linux.

5. Управление средствами защиты с пользовательского уровня с помощью модульных средств авторизации


Фильтр системных вызовов управляется с пользовательского уровня посредством четырех системных вызовов, позволяющих добавлять, удалять и считывать правила фильтра или протоколирования, а также устанавливать внутренний идентификатор пользователя. Начальное конфигурирование фильтра (установка идентификатора и добавления правил фильтрации и протоколирования из конфигурационного файла на уровень ядра) для конкретного пользователя наиболее удобно осуществлять при его входе в систему в процессе авторизации. Эта возможность легко встраивается в любую современную модульную систему аутентификации и авторизации. В рамках настоящей работы разработаны модули для PAM[11] и PNIAM[12], реализующие такую возможность.

Для задачи интегрального квотирования ресурсов применяется следующая схема авторизации. При регистрации нового пользователя в системе используются механизмы PNIAM[12], в которых происходит контроль пользователя, а также установка ограничений (которые считываются из конфигурационного файла /etc/ulimits.conf) на ресурсы. При исчерпании ресурсов, которые позволены пользователю, система не позволит открывать новые сеансы связи для данного пользователя, а так же создавать новые задачи.

Таким образом, применение современных модульных средств авторизации позволяет значительно упростить администрирование комплекса дополнительных механизмов безопасности ядра.

6. Заключение


В настоящем докладе на примере ОС Linux проанализированы типичные уязвимости современных операционных систем. В качестве основной задачи ставится задача усиления безопасности ОС на базе ядра Linux, состоящая из анализа недостатков в существующих механизмах обеспечения безопасности, выработке рекомендаций по устранению этих недостатков, а также программной реализации рекомендаций. Задачей настоящей работы являлась разработка следующих механизмов – фильтр системных вызовов; средства выборочного протоколирования системных вызовов на уровне ядра; система интегрального квотирования ресурсов. Были проанализированы архитектура данных механизмов, сферы их применения, результаты тестов производительности, а также средства комплексного управления ими с пользовательского уровня посредством модульных средств авторизации. Все рассмотренные разработки постоянно развиваются и портируются на новые версии ядра Linux. Основной перспективой дальнейшего развития протоколирования и фильтрации системных вызовов является разработка комплексной системы активного аудита на их базе с различными, в том числе и нейросетевыми, анализаторами. Основной перспективой дальнейшего развития системы квотирования ресурсов на основе пользователя (user limits) является поддержка других типов ресурсов, в первую очередь – оперативной памяти, что является нетривиальной задачей.

Л и т е р а т у р а




  1. Ядро ОС Linux. ссылка скрыта
  2. Популярные дистрибутивы ОС Linux. ссылка скрыта, ссылка скрыта, ссылка скрыта.
  3. "Общие Критерии Оценки Безопасности Информационных Технологий." – ссылка скрыта
  4. Проект Госстандарта РФ ГОСТ Р ИСО/МЭК 15408 "Методы и средства обеспечения безопасности. Критерии оценки безопасности информационных технологий." Части 1, 2, 3 М.: Изд-во Госстандарта России, 2002.
  5. Akhmanov S.A. System Calls Filter for OS Linux. ACS'2002.
  6. Ахманов С.А. Фильтр системных вызовов для ОС Linux. Сборник студенческих работ по программе ``СКИФ''. 2003г.
  7. ссылка скрыта
  8. Галатенко А. В., "Активный аудит". JetInfo No 8, 1999.
  9. ссылка скрыта
  10. Hofmeyr S. A., Forrest S., A. Somayaji Intrusion Detection using Sequences of System Calls , ссылка скрыта
  11. PAM – ссылка скрыта
  12. PNIAM – ссылка скрыта

1 Работа выполнена при поддержке программы «СКИФ» Союзного государства и программы фундаментальных научных исследований ОИТВС РАН "Оптимизация вычислительных архитектур под конкретные классы задач, информационная безопасность сетевых технологий"