Введение В настоящее время исходный код практически любой операционный системы содержит миллионы строк. В связи с этим анализировать и корректировать операционные системы затруднительно. Должного уровня безопасности операционной системы достигают путем её «наращивания», доработки, разработки дополнительных системных модулей и программного обеспечения. Из-за этого ядро операционной системы остается не закрытым от внешних угроз, уязвимым. Операционная система – совокупность управляющих программ, которые связывают устройства вычислительной системы и прикладные программы, а также позволяют управлять устройствами и вычислительными процессами, распределяя в том числе и ресурсы между ними. Основные идеи, определяющие функциональность операционных систем, были сформулированы в 1950–1960 гг. В перечень таких идей входили: многозадачность, разделение полномочий, файловые системы и т. д. При дальнейшем развитии и эволюции операционных систем на первый план вышла необходимость быстродействия системы, а также удобство работы пользователя. Безопасность операционной системы не была такой же актуальной, как в настоящее время. Но после того как операционные системы стали тесно взаимодействовать друг с другом, появилась сеть, в том числе и Интернет, оказалось, что они не готовы к решению вопросов безопасности. Более того, данные вопросы не решены даже в настоящее время, несмотря на быстрые темпы развития информационных технологий – дополнительные сервисы и программное обеспечение, такое как антивирусы и брандмауэры, не справляются. Очевидно, что вопросами безопасности информации должна заниматься сама операционная система, а не дополнительное программное обеспечение. Таким образом, возникает задача: сделать операционные системы максимально безопасными, стабильными и открытыми для пользователя. К решению данной задачи можно подойти с разных сторон. Надстройка существующих операционных систем. Именно этот способ предпочитают разработчики всех современных операционных систем. Суть данного метода заключается в том, что готовое ядро операционной системы не меняется. Все необходимые функции добавляются в операционную систему в виде дополнительных модулей, дополнительного программного обеспечения, драйверов, системного программного обеспечения и просто прикладных программ. Пример данной идеологии – антивирусы и брандмауэры. Однако в таком подходе невозможно проконтролировать все нюансы доступа к операционной системе через её ядро – оно остается незащищенным. Изменение существующих ядер операционных систем. При использовании данного способа возникает вопрос – насколько глубоко необходимо производить изменения в операционной системе: изменению будет подвержен интерфейс ядра, взаимодействующий с системным программным обеспечением, или разработчик реализует более глубокие изменения – изменения в средствах аппаратной поддержки ядра. При этом необходимо учесть – чем глобальнее и глубже будет перестройка, тем более неожиданный результат может получить разработчик. Перестройка ядра – сложная задача, т. к. существующие ядра операционных систем отшлифованы десятилетиями эксплуатации. При внесении изменений в операционные системы, выпуски новых версий операционных систем, их ядра не меняются – они переходят из одной версии в другую. Таким образом, корректировка ядра – практически невыполнимая задача. Формирование новой идеологии ядра операционной системы с опорой на принципы безопасности. Существенный недостаток данного метода заключается в том, что путь эволюции ядра операционной системы придется пройти заново. Однако только принципиальный переход на новую платформу обеспечит изначально наиболее безопасное построение операционной системы. В настоящее время производители операционных систем, разработчики используют в основном первый метод – метод настройки операционной системы. Некоторые пытаются внести корректировки в существующие операционные системы. Однако оба эти метода, несмотря на то, что они используются уже более двух десятков лет, не принесли ещё никаких видимых результатов – проблема так и остается актуальной. На основании этого можно сделать вывод, что методы надстройки и перестройки операционной системы не дают решения поставленной выше задачи. Таким образом, остается только один путь – путь формирования новой идеологии ядра операционной системы и разработки операционной системы на основе сформированной идеологии. Ядро операционной системы Операционная система обладает функциональной сложностью. Для изучения структуры операционной системы её делят на отдельные модули, в зависимости от возложенных на них функций. Часть этих модулей включается в ядро операционной системы, а часть находится вне ядра. Ядро – это программа, обеспечивающая взаимосвязь аппаратной части автоматизированной системы со всем остальным системным и прикладным программным обеспечением. Ядро функционирует в отдельной области памяти (пространство ядра). Всё остальное программное обеспечение использует пользовательское пространство, а всем процессам, протекающим в пользовательском пространстве, доступ в пространство ядра закрыт. Однако процессы внутри пространства ядра тесно взаимосвязаны, и ошибка в любой из компонент может повлечь за собой крах всей системы в целом. Всю операционную систему можно рассматривать как систему, состоящую из трех иерархических уровней: аппаратная часть, ядро и системное программное обеспечение. Ядро также можно разложить на слои (рис. 1). Структура ядра условна – многие модули могут быть вынесены за пределы ядра. В зависимости от того, какое количество функций возложено на ядро, можно выделить две идеологии построения архитектуры операционных систем – монолитную и микроядерную. Монолитное ядро операционной системы содержит максимальное количество модулей. Для большинства современных операционных систем характерна именно эта архитектура, благодаря чему они достигают максимального быстродействия. Микроядерная архитектура позволяет создать наиболее стабильные системы. Принцип архитектуры: на ядро возлагаются только самые необходимые функции. Все остальные модули ядра функционируют в пользовательском пространстве в виде драйверов. Это минимизирует количество системных ошибок. Операционных систем на микроядерной архитектуре не так уж много. Одна из самых знаменитых из них – MINIX, существующая с 1987 г. Рис. 1. Многослойная структура ядра Именно операционная система MINIX 3 выбрана нами в качестве объекта для модельного построения экспериментов путем анализа существующих операционных систем. Основные достоинства MINIX 3: – открытый исходный код; – малый объем исходного кода; – микроядерная архитектура ядра; – наличие печатных материалов, содержащих подробное её описание; – минимальный объем сервиса, что позволяет перестраивать её по принципам информационной безопасности наиболее эффективно. Операционная система MINIX 3 Данная операционная система имеет самое маленькое микроядро в мире (около 3 тысяч строк). В него включены только самые необходимые элементы: средства запуска, обработчик прерываний, планировщик задач, средства останова процессов, механизмы межпроцессорного взаимодействия, а также сервис часов [1]. Структура операционной системы MINIX 3 показана на рис. 2. Рис. 2. Структура MINIX 3 MINIX 3 имеет четырехуровневую структуру [2]. Ядро находится на нижнем уровне и осуществляет обработку и управление состояниями готовности, выполнения и блокировки, а также обрабатывает все сообщения, передаваемые между процессами, и проверяет их на наличие ошибок. В нижнем модуле содержатся ещё два модуля, которые функционируют подобно драйверам устройств. Таймерное задание – это драйвер ввода-вывода, который взаимодействует с аппаратным обеспечением и генерирует тактовые сигналы. Одна из главных функций первого уровня – предоставление вышестоящим драйверам и серверам набора вызовов ядра, с помощью которых осуществляется чтение и запись портов ввода-вывода, копирование данных между адресными пространствами и т. д. Реализация вызовов ядра возложена на системное задание. Планирование таймерного задания и системного задания осуществляется раздельно, а сами процессы имеют собственные стеки вызовов. Большая часть ядра и системы написана на языке С, а некоторые небольшие фрагменты, где ядру необходимо непосредственное низкоуровневое взаимодействие с аппаратным обеспечением, – на языке Ассемблер. Три уровня, находящиеся над ядром, могут рассматриваться как один, поскольку ядро взаимодействует с ними одинаково. Уровни ограничены командами пользовательского режима, а ядро планирует запуск каждого из них. Уровни не имеют прямого доступа к портам ввода-вывода, и, более того, ни один из них не способен обращаться к памяти за пределами выделенного ему сегмента. Уровни 2, 3 и 4 различаются привилегиями. Самые широкие привилегии имеет уровень 2, более ограниченные – уровень 3. Уровень 4 привилегий не имеет. Например, драйверы устройств, находящиеся на уровне 2, могут без ограничения требовать, чтобы системное задание выполнило чтение или запись данных в порты ввода-вывода. Драйвер необходим каждому типу устройств. Драйверы устройств могут выполнять и другие вызовы ядра. Третий уровень включает серверы – процессы, предоставляющие полезные услуги пользовательским процессам. Два сервера являются обязательными – менеджер процессов (выполняет все системные вызовы MINIX 3) и файловая система (выполняет все файловые системные запросы). Уровень 4 содержит все пользовательские процессы: оболочки, редакторы, компиляторы и творения самого пользователя. Для того чтобы включить в систему дополнительный сервер, её не требует перекомпилировать. Серверы могут быть установлены в любое время – как при запуске системы, так и позднее. Каждый драйвер и каждый сервер являются отдельными процессами в пользовательском пространстве, аналогично обычным пользовательским приложениям. В результате ошибки в драйверах или сервисах не смогут обрушить всю систему. В MINIX 3 существует также сервер реинкарнаций. Это процесс, который выступает в качестве родительского по отношению ко всем процессам драйверного и сервисного слоев. Если какой-либо процесс в данных слоях останавливается, то сервер реинкарнаций запускает его снова. Если процесс ведет себя некорректно, то сервер реинкарнаций способен самостоятельно остановить его и запустить снова. Таким образом, благодаря серверу реинкарнаций, операционная система становится прозрачной для пользователя, а также обладает свойством самовосстановления. Опираясь на сказанное выше, можно утвержать, что операционная система MINIX 3 является хорошей площадкой для реализации новой идеологии операционной системы. Принципы безопасности операционной системы Прежде чем приступать к разработке архитектуры безопасной операционной системы, необходимо сформулировать принципы безопасности, которым данная операционная система должна соответствовать. 1. Иерархическая структура операционной системы: вся операционная система разбивается на отдельные модули, в зависимости от их функциональности. При этом обмен информацией может происходить только между соседними слоями, т. е. ожидать атаку можно только от соседнего слоя. Это создает многоэшелонированную оборонную систему операционной системы. Разбиение на слои должно производиться системно, с опорой на функциональность задач, которые будут решаться независимо на каждом слое. 2. Контроль и аудит всех действий пользователя: любые действия, бездействия или попытки действия пользователя должны фиксироваться и анализироваться с точки зрения целей информационной безопасности. В дальнейшем, на основе результатов анализа, могут предприниматься определенные действия. Кроме того, контроль может быть активным, когда операционная система сама инициирует внутренние проверки с точки зрения безопасности информации. 3. Резервирование состояний процессов ядра: любой процесс должен иметь резервную копию своего состояния. В критических ситуациях любой из процессов должен будет восстанавливаться из резервной копии. Кроме того, при любом обоснованном подозрении на нарушение информационной безопасности также должно происходить восстановление из резервной копии. Для выполнения данного принципа необходимы разработка и создание системы копирования модулей. 4. Использование принципов объектно-ориентированного программирования: в частности изолированность объектов (инкапсуляция). Это один из трех базовых принципов объектно-ориентированного программирования. Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя. Более того, поля класса не должны быть доступны извне, а доступ к ним должен осуществляется с помощью методов доступа. Данный принцип полностью аналогичен по своей сути основным принципам организации систем безопасности доступа. Базовая конструкция компьютера состоит из следующих четырех основных компонентов управления, которые в обязательном порядке должны быть включены в операционную систему. 1. Процессор и система управления. Работа без данного компонента невозможна, т. к. именно с помощью процессора и системы управления проиходит исполнение машинных инструкций. 2. Оперативная память. Данный компонент необходим процессору для выолнения его команд, т. к. в нем временно харнятся данные и команды. 3. Устройства ввода-вывода (монитор и клавиатура). Без данного компонента будет невозможна работа пользователя. 4. Шина. С помощью шины данные компьютера передаются между другими компонентами, следовательно, функционирование системы без шины невозможно. 5. Постоянная память (жесткий диск). Компонент необходим для хранения самой операционной системы. Основной принцип выбора базовых элементов: компьютер не сможет адекватно функционировать, если хотя бы одно из этих устройств будет отсутствовать. Для применения принципов объектно-ориентированного программирования необходимо создать классы для основных функций системы. Таким образом, в системе должно быть создано шесть основных классов для обеспечения работы основных компонентов компьютера: 1. Класс запуска системы. При загрузке операционной системы зачастую создается несколько процессов. Некоторые из них являются приоритетными, т. е. процессами, взаимодействующими с пользователями и выполняющими для них определенную работу. Другие процессы являются фоновыми: они не связаны с определенными полльзователями, однако имеют определенное функциональное назначение. Методами класса запуска системы должны также запускаться данные приоритеные и фоновые процессы, необходимые для работоспособности системы. 2. Класс управления задачами – класс, который возьмет на себя функции управления задачами и файлами системы: структуризация, именование, использование, защита и реализация, а также доступ к ним. 3. Класс управления ресурсами. 4. Процесс ввода-вывода. Методы класса должны давать устройствам ввода-вывода команды, перехватывать прерывания и обрабатывать ошибки. 5. Управление памятью. Методы класса должны взять на себя функции менеджера памяти и следить за тем, какая память используется в данный момент, а какая свободна. При необходимости они должны выделять память процессам и по их завершении освобождать ресурсы; управлять обменом данными между оперативной памятью и диском, если она слишком мала для того, чтобы вместить все процессы; 6. Класс безопасности операционной системы. На данный класс возлагается задача обеспечения принципов информационной безопасности. Заключение Таким образом, нами рассмотрена одна из актуальных современных проблем использования информационных технологий: проблема защиты изолированной информационной (программной) среды (в рамках рабочей станции, локальной сети, сервера). В настоящее время, несмотря на быстрые темпы развития информационных технологий, данная проблема обострилась, в частности ввиду массированного и повсеместного проникновения глобальных сетей в системы обработки данных. В ходе исследований были проанализированы возможные подходы к решению данной проблемы; обоснована необходимость кардинальной перестройки операционной системы, организованной прежде всего на основе принципов обеспечения информационной безопасности; сформулирована необходимость объектно-ориентированного подхода к формированию операционной системы и её ядра; описаны шесть базовых классов, которые должны входить в ядро; описана операционная система MINIX 3, на базе которой предполагается создание защищенной операционной системы с помощью перечисленных принципов. Безусловно, данный список необходимо расширить, что будет предметом дальнейших исследований.