воскресенье, 17 января 2010 г.

ISSP \ Домен 03. Архитектура и модель безопасности. Часть 4

В этой части рассмотрены следующие вопросы:
  • Режимы процессора и кольца защиты
  • Архитектура операционной системы
  • Домены
  • Разделение на уровни и скрытие данных
  • Эволюция терминологии
  • Виртуальные машины
  • Дополнительные устройства хранения
  • Управление устройствами ввода/вывода
  • Прерывания
Обновлено: 02.05.2010

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

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

ПРИМЕЧАНИЕ. Фактическая архитектура колец, используемая системой, диктуется процессором и операционной системой. Аппаратная микросхема (процессор) создается с учетом предоставления определенного количества колец, операционная система должна быть разработана для работы в той же структуре колец. Это одна из причин, почему операционная система, разработанная для процессоров Intel, не может работать с процессорами Alpha, например. Они имеют различные архитектуры и способы интерпретации наборов команд.
Компоненты операционной системы работают на внутреннем кольце, что дает им полный доступ к ячейкам памяти, периферийным устройствам, системным драйверам, критичным параметрам конфигурации. Поскольку это кольцо предоставляет наиболее опасный доступ к важнейшим ресурсам, оно является самым защищенным. Приложения обычно работают на кольце 3, на котором ограничен доступ к памяти, периферийным устройствам и драйверам, на этом кольце осуществляется управление доступом посредством системных вызовов и с помощью служб операционной системы. Различные кольца защиты показаны на рисунке 3-11. Типы и наборы команд, которые могут отправить процессору приложения, работающие на внешних кольцах, более ограничены по сравнению с внутренним кольцом. Если приложение пытается отправить процессору команды, которые выходят за рамки его разрешений, процессор генерирует исключение и пытается завершить работу этого приложения.

Рисунок 3-11. Более доверенные процессы работают на внутренних кольцах

Кольца защиты обеспечивают доступность, целостность и конфиденциальность необходимые многозадачной операционной системе. Наиболее часто используется архитектура с 4-мя кольцами защиты:
  • Кольцо 0: Ядро операционной системы
  • Кольцо 1: Остальные части операционной системы
  • Кольцо 2: Драйверы и утилиты ввода/вывода
  • Кольцо 3: Приложения и действия пользователей
Эти кольца защиты реализуют промежуточный слой между субъектами и объектами и используются для управления доступом при попытках субъектов получить доступ к объектам. Кольцо определяет уровень доступа к критичным ресурсам системы. Чем меньше номер кольца, тем большее привилегий у процесса, который работает в рамках этого кольца. Каждому субъекту и объекту логически присвоено число (от 0 до 3), соответствующее уровню доверия операционной системы к нему. Субъекты могут получить доступ только к объектам в рамках того же кольца, на котором находятся они сами, либо в рамках внешнего по отношению к ним кольца, но они не могут напрямую взаимодействовать с объектами на внутренних по отношению к ним кольцах. Так, например, субъекты на кольце 3 могут получить прямой доступ только к объектам на том же кольце 3, а субъекты на кольце 1 могут получить прямой доступ к объектам на кольцах 1, 2 и 3. Если приложению требуется доступ к компонентам на других кольцах, к которым ему не разрешен прямой доступ, оно отправляет соответствующий запрос операционной системе для выполнения необходимых задач. Для этого используются системные вызовы, позволяющие приложению выполнить команды, недоступные в реальном режиме. Запрос передается системным службам операционной системы, которые работают на более привилегированном уровне и могут выполнять более критичные функции.

Когда операционная система выполняет команды процессов, находящихся на кольцах 0 и 1, она работает в защищенном режиме. Когда операционная система выполняет команды приложений и процессов на кольце 3, она работает в реальном режиме. Реальный режим предоставляет гораздо более ограниченную среду для работы приложения, что, в свою очередь, защищает систему от неправильного поведения программ.
ПРИМЕЧАНИЕ. Многие современные операционные системы не используют второе кольцо защиты.
Резюмируем вкратце информацию о кольцах защиты. Операционная система должна работать в рамках структуры и границ, предоставленных процессором. Процессор предоставляет операционной системе кольца защиты, пронумерованные от 0 до 3. Операционная система логически распределяет процессы по различным кольцам, основываясь на уровне своего доверия к этим процессам. Т.к. ядро операционной системы является самым надежным и доверенным компонентом, оно и его процессы размещаются на кольце 0. Остальные процессы операционной системе размещаются на кольце 1, а все пользовательские приложения размещаются на кольце 3.

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

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


Операционная система может быть разработана с использованием различных типов архитектуры. Архитектура – это платформа, которая определяет размещение и взаимодействие служб и функций операционной системы. В этом разделе рассматриваются монолитная, многоуровневая и клиент/серверная архитектуры.

Монолитную архитектуру операционной системы (monolithic operating system architecture) обычно называют «большим беспорядком», ей явно не хватает структуры. Операционная система состоит в основном из различных процедур, бессистемно вызывающих друг друга. Системы этого типа имеют только один уровень безопасности, модули кода в них могут вызывать друг друга по мере необходимости. Взаимодействие между модулями не структурировано и не управляется как в многоуровневой архитектуре, скрытие данных не предусмотрено. Примером монолитной операционной системы является MS-DOS.

Многоуровневая архитектура операционной системы (layered operating system architecture) разделяет функциональность системы на иерархические уровни. Первой операционной системой, которая использовала многоуровневую архитектуру, была система ТНЕ (Technische Hogeschool Eindhoven). ТНЕ имела 5 уровней функциональности. Уровень 0 управлял доступом к процессору и обеспечивал многопрограммность; уровень 1 выполнял управление памятью; уровень 2 обеспечивал межпроцессное взаимодействие; уровень 3 был связан с устройствами ввода/вывода; а на уровне 4 работали приложения. Уровень 5 был пользовательским уровнем и не реализовывался напрямую THE. Процессы на различных уровнях имеют интерфейсы для использования процессами, находящимися на уровень выше или ниже них.

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

Монолитная операционная система имеет только один уровень безопасности. В многоуровневой системе каждый уровень должен обеспечивать свою собственную безопасность и управление доступом. Если один уровень управляет безопасностью всех других уровней, то этот уровень имеет слишком много информации (и доступа) обо всех объектах на всех уровнях, что является прямым нарушением концепции скрытия данных. Разделение программного обеспечения и его кода на модули повышает уровень предоставляемых системой гарантий, т.к. компрометация одного модуля не означает появления уязвимости для всех остальных модулей. Примерами многоуровневых систем являются THE, VAX/VMS, Multics, Unix (хотя THE и Multics больше не используются).

Другим подходом к проектированию системы является клиент/серверная архитектура (client/server architecture), в которой те части программного обеспечения и функции, которые ранее размещались в монолитном ядре, теперь находятся на более высоких уровнях операционной системы. Функции операционной системы делятся на несколько различных процессов, которые выполняются в реальном, а не в защищенном режиме.

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

ПРИМЕЧАНИЕ. Не путайте клиент/серверную архитектуру операционной системы с клиент/серверной сетевой архитектурой, которая традиционно ассоциируется с понятием "клиент/сервер". В сети, приложение работает в клиент/серверной модели для использования распределенных вычислительных возможностей. При этом клиентская часть программного обеспечения устанавливается на рабочих станциях, а серверная часть, как правило, на сервер базы данных и/или сервер приложения.

Домен (domain) – это набор объектов, к которым могут обращаться субъекты. Доменом могут быть все ресурсы, к которым могут обращаться пользователи; все файлы, доступные программам; сегменты памяти, доступные процессам; службы и процессы, доступные приложению. Субъекту необходим доступ к объектам (ресурсов) для выполнения своих задач, и именно домен определяет, какие объекты доступны этому субъекту, а к каким доступ не предоставляется.

ПРИМЕЧАНИЕ. Помните, что поток – это часть процесса. Когда генерируется поток, он использует тот же домен (ресурсы), что и породивший его процесс.
Эти домены должны быть идентифицированы, разделены и надлежащим образом реализованы. Операционная система и процессор могут работать в защищенном, либо реальном режиме. Даже это разделение режимов, связанных с кольцами защиты, обусловлено необходимостью определения различных доменов. Когда команды процесса выполняются в защищенном режиме, этот процесс работает в очень широком домене (имеет доступ к большому числу ресурсов) и поэтому может выполнять больше различных действий. Работая в защищенном режиме, процесс операционной системы может получить прямой доступ к сегментам памяти, переносить данные из незащищенного домена в защищенный домен, напрямую взаимодействовать с аппаратными устройствами. Приложение, работающее в реальном режиме, не может напрямую обращаться к памяти и аппаратным устройствам, оно имеет существенно более ограниченный объем доступных ресурсов и возможных действий. Приложению предоставляется доступ только к выделенным для него сегментам памяти, причем этот доступ предоставляется не напрямую и строго контролируется.

Процессу, находящемуся в привилегированном домене, при выполнении своих команд и обработке своих данных нужна уверенность в том, что на его среду не могут оказать негативного воздействия программы из других доменов. Это называется доменом выполнения (execution domain). Поскольку процесс в привилегированном домене имеет доступ к критичным ресурсам системы, его среда должна быть защищена от вредоносного программного кода и неожиданных действий, исходящих от программ в других доменах. Одни системы могут разделять только пользовательские и привилегированные области, тогда как другие имеют более сложную архитектуру, содержащую до десяти доменов выполнения.

Домены выполнения напрямую связаны с кольцами защиты, на которых находятся субъекты и объекты. Чем ниже номер кольца защиты, тем выше его привилегии и тем шире его домен. Эта концепция проиллюстрирована на Рисунке 3-12.

Рисунок 3-12. Чем выше уровень доверия, тем большее количество ресурсов доступно (т.е. более широкий домен)

Хотя теоретически существует три основных типа архитектуры операционных систем, термины разделение на уровни (layering) и скрытие данных (data hiding) часто используют, когда речь идет о механизмах защиты операционных систем, в т.ч. в отношении операционных систем с клиент/серверной архитектурой, поскольку они также используют технологии разделения на уровни и скрытия данных для собственной защиты.

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

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

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

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


Хотя теоретически монолитная, многоуровневая и клиент/серверная архитектуры описывают то, как построена операционная система, эти термины накладываются друг на друга при описании построения ядра. В реальной жизни и на экзамене CISSP, когда вы видите термин «монолитная система», в действительности это означает, что весь код ядра работает в защищенном режиме. Сбивает с толку то, что платформу такой операционной системы называют монолитной (monolithic framework), и есть отдельный термин, относящийся только к ядру – монолитное ядро (monolithic kernel), однако в настоящее время эти термины объединены. Таким образом, если сегодня используется термин «монолитная система», он относится к тому, как построено ядро.
ПРИМЕЧАНИЕ. Помните, что режим ядра (kernel mode), защищенный режим (protected mode), привилегированный режим (privileged mode), режим супервизора (supervisory mode) – все это означает одно и то же.
Использование монолитного ядра означает, что вся работа ядра выполняется в защищенном режиме на кольце 0, как показано на Рисунке 3-13. Windows NT, 2000 и Vista являются всем известными монолитными системами, поскольку все их службы, реализующие функциональность операционной системы, выполняются в режиме ядра. Это создает угрозу безопасности, потому что если происходит проблема с одним из процессов внутри ядра, это может повлиять на все ядро. Это также означает, что большой объем кода работает в защищенном режиме, соответственно больше кода может быть использовано злоумышленниками для получения высокого уровня контроля над системой. Это означает, что создать безопасную монолитную систему очень сложно, и тем более сложно гарантировать ее безопасность.

Рисунок 3-13. Подсистемы выполняют запросы клиентских процессов

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

Таким образом, большинство современных наиболее распространенных операционных систем в основном используют кольца 0 и 3 архитектуры колец защиты.

Все ядро и драйверы устройств выполняются на кольце 0, а все пользовательские приложения – на кольце 3. Поскольку драйверы работают в защищенном режиме, крайне важно, чтобы они были правильно написаны и не могли быть использованы злоумышленниками каким-либо образом. Поскольку большинство драйверов устройств предоставляются третьими сторонами (собственно производителями этих устройств), нет гарантий, что они действительно были разработаны надлежащим образом и безопасны. Именно поэтому Microsoft установила очень жесткие требования к драйверам в операционной системе Windows Vista. Сторонние поставщики должны теперь при разработке драйверов учитывать гораздо более строгие критерии, чтобы их драйверы могли быть загружены в операционную систему.


Если вы работали с компьютерами 10-15 лет назад, вы помните компьютерные игры тех лет, имеющие простейшую компьютерную графику, не похожую на графику современных игр. В те времена игры были 16-битными и написаны они были для работы в 16-битной среде MS-DOS. Когда операционные системы Windows перешли с 16 на 32 бита, в 32-битных операционных системах была обеспечена поддержка обратной совместимости, чтобы можно было продолжать работать с 16-битными приложениями. Это реализовывалось путем создания виртуальных машин (virtual machine), на которых запускались 16-битные приложения (в т.ч. игры).

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

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

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

Таким образом вы можете на одном компьютере запустить несколько различных операционных систем одновременно (например, Windows 2000, Linux, Unix и Windows 2008). Представьте себе дом с несколькими комнатами. Каждая операционная система получает свою отдельную комнату, но все они совместно используют одни и те же ресурсы, которые обеспечивает дом – фундамент, электричество, вода, крыша и т.д. Операционной системе, которая «живет» в отдельной комнате, не нужно знать о других операционных системах и взаимодействовать с ними, чтобы использовать ресурсы дома.  То же самое относится к компьютеру: каждая операционная система совместно с другими использует ресурсы, предоставляемые физической системой (такие как память, процессор, шины и т.п.). Они «живут» и работают в своей отдельной «комнате», являющейся гостевой виртуальной машиной. Физический компьютер являюется основной (host) системой.

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

Виртуализация также применяется и в качестве механизма безопасности. В качестве примера можно привести Java Virtual Machine (JVM), которая используется любым современным веб-браузером. JVM создает виртуальные машины (называемые песочницами (sandbox)), выполняющие java-апплеты. Это является защитным механизмом, поскольку песочница держит апплет внутри себя и не позволяет ему взаимодействовать напрямую с операционной системой и файлами. Действия, которые апплет пытается выполнить, проверяются JVM на предмет их безопасности. Если JVM решает, что действия безопасны, она выполняет запрос самостоятельно от имени апплета.
ПРИМЕЧАНИЕ. На сегодняшний день уже были написаны вредоносные программы, которые могут выходить за рамки песочницы, чтобы выполнять свои действия без контроля со стороны JVM. Эти способы компрометации, а также Java и JVM будут рассмотрены более подробно в Домене 09.
Приведенный ниже список преимуществ использования виртуализации взят со страницы www.kernelthread.com/publications/virtualization. Он написан достаточно давно, но он актуален и по сей день, и его достаточно для сдачи экзамена CISSP.

  • Виртуальные машины могут использоваться для объединения нагрузки от нескольких серверов на меньшем количестве физических машин, может быть даже на одной машине (консолидация серверов). Выгодами при этом являются: снижение затрат на физическое оборудование, среду, управление и администрирование серверной инфраструктуры.
  • Необходимость запуска унаследованных приложений также может быть реализована с использованием виртуальных машин. Унаследованное приложение может просто не работать на новом оборудовании и/или в новой операционной системе. Но даже если оно заработает, то в случае, если оно является серверным, для него возможно потребуется выделить отдельный сервер. Было бы выгоднее объединить все такие приложения на одном сервере. Это может быть очень трудно реализовать без использования виртуализации, поскольку такие приложения обычно не поддерживают сосуществование с другими приложениями в одной среде выполнения.
  • Виртуальные машины могут использоваться для обеспечения безопасных, изолированных «песочниц» (sandboxes) для запуска недоверенных приложений. Можно даже создавать такие среды выполнения динамически, «на лету», например, по мере того, как вы скачиваете что-то из Интернета и запускаете это. Виртуализация – важная концепция создания безопасных вычислительных платформ.
  • Виртуальные машины могут использоваться для создания операционных систем или сред выполнения с ограниченными ресурсами, для проверки правильной работы планировщика и менеджеров ресурсов. Это особенно важно при создании операционных систем, поддерживающих функциональность QoS (качество сервиса).
  • Виртуальные машины могут предоставить иллюзию оборудования или конфигурации оборудования, которого вы реально не имеете (такого как устройства SCSI или несколько процессоров). Виртуализация также может использоваться для эмуляции сети независимых компьютеров.
  • Виртуальные машины могут использоваться для одновременного запуска нескольких операционных систем, в частности, более старых версий или полностью других систем, из них можно формировать системы для «горячего резерва». Некоторые унаследованные системы может быть сложно или вообще невозможно запустить на современном физическом оборудовании.
  • Виртуальные машины могут использоваться в качестве мощных средств отладки и мониторинга производительности. При этом вы можете отлаживать операционную систему без потери производительности или реализуя более сложные сценарии отладки.
  • Виртуальные машины могут изолировать то, что на них запущено, и не позволять сбоям и ошибкам работающего на них программного обеспечения влиять на работу основной системы. Вы можете умышленно вызвать ошибки в таком программном обеспечении, чтобы проанализировать его последующее поведение.
  • Виртуальные машины – прекрасный инструмент для исследований и академических экспериментов. Поскольку они обеспечивают изоляцию, они более безопасны для такой работы. Они полностью инкапсулируют состояние запущенной системы, причем вы можете сохранить состояние системы, исследовать его, изменить, загрузить снова и т.д.
  • Виртуализация может упростить и повысить управляемость таких задач, как миграция систем, резервирование и восстановление.
  • Виртуализация аппаратных средств популярна для совместного хостинга. Многие из приведенных выше преимуществ делают такой хостинг безопасным, эффективным по стоимости и привлекательным в целом.
Ссылки по теме: 

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

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

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

Любые портативные носители информации могут стать причиной нарушения безопасности. Особенно много проблем вызывают различные флеш-накопители, телефоны и плееры, которые могут хранить десятки гигабайт информации и при этом их крайне просто подключить практически к любому компьютеру через USB-порт. Первым шагом в предотвращении этой угрозы является обновление существующей политики безопасности (или внедрение новых политик), чтобы учесть новые технологии. Даже сотовые телефоны могут быть подключены к компьютеру для передачи данных, звука, изображений и видео, что может выходить за границы старой политики безопасности. Должны учитываться проблемы безопасности и уязвимости таких технологий, как Bluetooth, FireWire, Blackberry и т.д.


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

Устройства ввода/вывода обычно делят на блочные и символьные. Блочные устройства работают с блоками данных фиксированного размера. Каждый блок имеет собственный уникальный адрес (пример – любой дисковый накопитель). Символьные устройства (например, принтер, сетевая карта или мышь) работают с потоками символов неопределенного размера. Эти данные не адресуются.

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

Операционная система нуждается в том, чтобы использование и освобождение устройств и ресурсов компьютера происходило правильным образом. Различные операционные системы работают с устройствами и ресурсами по-разному. Например, считается, что Windows NT является более стабильной и безопасной средой обработки данных, чем Windows 9x, поскольку приложения в Windows NT не могут выполнять прямые запросы к аппаратным устройствам. Windows NT и Windows 2000 используют гораздо более управляемые методы доступа к устройствам, чем Windows 9x. Эти методы помогают защитить систему от плохо написанного кода, неправильно использующего и/или неправильно освобождающего ресурсы. Такой уровень защиты позволяет обеспечить целостность и доступность ресурсов.


Когда устройство ввода/вывода завершает задачу, оно должно проинформировать процессор, что необходимые данные уже в памяти и доступны для обработки. Для этого контроллер устройства отсылает по шине специальный сигнал (прерывание), который отслеживается контроллером прерываний. Если процессор занят, а прерывание устройства не имеет более высокого приоритета, чем уже выполняющаяся работа, то устройство ожидает, когда процессор освободится. Контроллер прерываний отправляет сообщение процессору, говоря ему, что устройство требует внимания. Операционная система имеет таблицу (называемую вектором прерывания) всех подключенных устройств ввода/вывода. Процессор сравнивает полученный номер со значениями в векторе прерывания и, таким образом, он узнает, какое именно устройство требует его внимания. Таблица содержит адреса памяти различных устройств ввода/вывода. Когда процессор выясняет, что внимания требует, к примеру, жесткий диск, он ищет в этой таблице соответствующий адрес памяти. Это новое значение счетчика команд, которое является начальным адресом, откуда процессор должен начинать чтение.

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

Существуют различные способы выполнения процедур ввода / вывода операционной системой. Мы рассмотрим следующие:
  • Программируемый ввод/вывод
  • Ввод/вывод, управляемый прерываниями
  • Ввод/вывод с использованием DMA
  • Ввод/вывод с частичным отображением
  • Ввод/вывод с полным отображением
Программируемый ввод/вывод (programmable I/O). Если операционная система использует программируемый ввод/вывод, процессор посылает данные на устройство ввода/вывода, а затем опрашивает это устройство, чтобы узнать, когда оно будет готово принять новый блок данных. Пока устройство не готово к приему новых данных, процессор простаивает, ожидая пока устройство освободится. Это очень медленный метод работы, бесполезно расходующий драгоценное процессорное время. Поэтому умные люди придумали другой метод: ввод/вывод, управляемый прерываниями.

Ввод/вывод, управляемый прерываниями (interrupt-driven I/O). Если операционная система использует ввод/вывод, управляемый прерываниями, процессор отправляет данные на устройство и переключается на запросы других процессов. Когда устройство закончило обработку полученных данных и готово принять следующий блок данных, оно отправляет прерывание процессору. Процессор останавливает свою работу, отправляет устройству следующий блок данных, а затем снова переключается на другую работу. Это продолжается пока все данные не будут отправлены на устройство. Хотя при этом процессор не ждет выполнения каждой задачи устройством, он все равно расходует много времени на прерывания. Поэтому другие умные люди придумали ввод/вывод с использованием DMA.

Ввод/вывод с использованием DMA (I/O using DMA). Прямой доступ в память (DMA – Direct Memory Access) – это способ передачи данных между устройством ввода/вывода и системной памятью без использования процессора. Скорость передачи данных при этом намного больше. При использовании в операциях ввода/вывода, контроллер DMA передает данные на устройство ввода/вывода, не беспокоя для этого процессор. Этот метод иногда называют вводом/выводом без отображения (unmapped I/O).

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

Ввод/вывод с полным отображением (fully mapped I/O). При использовании ввода/вывода с полным отображением операционная система не доверяет устройству ввода/вывода полностью – физический адрес устройству не передается. Вместо этого устройство работает с логическим адресом и в рамках контекста безопасности (от имени) запрашивающего процесса. Таким образом, операционная система не доверяет устройству прямое взаимодействие с памятью, она работает в качестве посредника для управления взаимодействием между процессом и устройством.

Ссылки по теме:

Комментариев нет: