Файловые системы
Основные понятия
Файл есть именованная совокупность данных. Это определение относится к виртуальному (логическому) файлу, – каким он представляется пользователю. Определение виртуального файла не конкретизирует, где именно, на каких носителях находятся данные, из каких элементов совокупность состоит и каковы отношения между элементами. Отсутствие детализации в определении виртуального файла делает его удобной универсальной метафорой любых внешних по отношению к процессу именованных данных. В современных ОС прочно укоренилось представление всех внешних устройств, как виртуальных файлов, и имеется тенденция ко все более широкому использованию файловой метафоры (семафоры, каналы-транспортеры, очереди т.д.).
Понятие же физического файла связывают с данными, хранящимися на внешней памяти. Файл, созданный на внешней памяти, может существовать на ней сколь угодно долго, пока не будет уничтожен явно. Характерным является то, что файл продолжает существовать и после завершения создавшего его процесса, данные файла могут быть многократно прочитаны, модифицированы, полностью заменены этим же или другим процессом.
Физический файл есть набор записей на устройстве внешней памяти, сгруппированных таким образом, чтобы управлять доступом к ним, их чтением и модификацией. Файловой системой (ФС) называется та часть ОС, которая обеспечивает перевод виртуального представления файла в физическое. Этот перевод выполняется поэтапно, что позволяет представить ФС в виде иерархической модели, состоящей из нескольких уровней. В упрощенном виде эта модель м.б. сведена к двум уровням.
Логическая ФС обеспечивает интерфейс процессов и выполняет перевод символьного имени файла в некоторый внутрисистемный идентификатор файла. Этот перевод включает в себя поиск по каталогам. Логическая ФС имеет дело с виртуальным файлом и с виртуальными адресами в файле.Физическая ФС находит по идентификатору дескриптор файла – системную структуру данных, содержащую информацию о местонахождении файла, его характеристиках и состоянии, открывает файл и сопровождает открытый файл. Она же выполняет перевод виртуальных файловых адресов в реальные адреса на носителях, отслеживает размещение файлов на внешней памяти и управляет распределением пространства внешней памяти. Самый нижний уровень физической ФС обеспечивается драйверами дисковых устройств.
Логическая организация файлов. Интерфейс процесса
Вне зависимости от логической структуры виртуального файла для получения процессом доступа к данным файла должен быть выполнен системный вызов open. Этот системный вызов, во-первых, обеспечивает поиск файла в логической ФС, во-вторых, связывает внешнее имя файла с файловой переменной в программе. Файловая переменная является некоторым указателем на внутрисистемный идентификатор файла. Далее программа, выполняя системные вызовы read, write, seek, close, идентифицирует файл именно этим значением.
Синтаксис и семантика системных вызовов, связанных с чтением/записью и поиском данных в файле, зависит от логической структуры файла. Логические структуры виртуальных файлов, прежде всего, можно подразделить на байториентированные и записеориентированные.
Байториентированные файлы представляются, как линейная последовательность байт без какого-либо дополнительного структурирования. За одну операцию обмена читается или пишется любое заданное количество байт. К байториентированным файлам обеспечивается произвольный доступ, для чего вводится понятие файлового курсора – номера того байта файла, который будет читаться/записываться следующим. По умолчанию при открытии файла курсор устанавливается на начало файла и сдвигается при каждой операции read/write. Но системный вызов seek дает процессу возможность установить курсор в произвольную позицию. Байториентированная организация является наиболее универсальной из всех возможных, так как на неструктурированную последовательность байт приложение может наложить любую собственную логическую структуру.
В записеориентированных файлах единицей обмена является запись – порция данных, состоящая из одного или нескольких байт и, возможно, имеющая свою внутреннюю структуру. Имеется целый ряд методов логической организации записеориентированных файлов: последовательные файлы из записей фиксированной или переменной длины, файлы прямого доступа с ключами, файлы комбинированного доступа (индексно-последовательные и B+-деревья). Записеориентированные файлы более удобны для пользователей.
Стандарт ОС предусматривает байториентированную организацию файлов. Однако, некоторые ОС наряду с ней поддерживают и более сложные, записеориентированные организации.
Каталоги логической ФС
Логическая ФС рассматривает файл, как единицу хранения. Удачным представляется сравнение логической ФС с библиотекарем, который не должен знать содержание книги (файла), но обязан уметь быстро найти требуемую книгу в книгохранилище. Соответственно, файловые справочники ОС носят названия каталогов или оглавлений.
Файловые справочники располагаются на тех же носителях, что и файлы данных. Первоначально с каждой единицей сменного носителя (пакет магнитных дисков, бобина магнитной ленты) жестко связывался свой единственный справочник, и смена носителя вызывала смену справочника. Такая единица сменного носителя получила название тома. Дальнейшее развитие вычислительных систем привело с одной стороны к увеличению объемов носителей, так что несколько их единиц могут составлять один том, с другой – к практике разбиения одного физического носителя на несколько логических томов. Мы определяем том, как часть внешней памяти вычислительной системы, имеющую собственный справочник-каталог. Элемент каталога содержит, как минимум, символьное имя файла и адрес его дескриптора, иногда дескриптор файла может непосредственно входить в элемент каталога.
Каждый файл имеет символьное имя, которое позволяет пользователю обращаться к данному конкретному файлу. Каждая ОС устанавливает собственные соглашения о формировании имен. Иногда эти соглашения допускают или даже требуют разделения имени файла на составные части – компоненты. При записи символьного имени его компоненты обычно разделяются точкой. Разные ОС накладывают разные ограничения на количество и длины компонент имени. Некоторые ОС резервируют одну из составляющих имени файла в качестве описателя типа информации, хранящейся в файле.
Каталоги файлов выполняют две функции: обеспечивают поиск файлов и структурирование хранения информации. В настоящее время в большинстве ОС принята иерархическая структура каталогов. Любой каталог может содержать файлы и другие каталоги (подкаталоги). Каталог именуется по правилам именования файлов. В такой структуре возникают понятия полного и локального имен файла. Полное имя файла состоит из имени каталога и имени файла в каталоге. Обычно эти имена разделяются наклонной чертой ‘\’ или ‘/’. Вторая часть полного имени является локальным именем файла. На томе не может быть двух файлов, имеющих одинаковые полные имена, но файлы с одинаковыми локальными именами могут находиться в разных каталогах. Для сокращения именования файлов процесс может сообщить ОС устанавливаемое по умолчанию имя каталога. Каталог, имя которого устанавливается по умолчанию, называется рабочим или текущим. К файлам в рабочем каталоге процесс может обращаться по локальным именам, к файлам в других каталогах – только по полным именам.
Древовидный каталог является элегантной и в большинстве случаев удобной структурой, но в некоторых случаях может быть полезно внести в идеальную древовидную структуру некоторые нарушения.
Алиасами или альтернативными именами (в Unix – link) называются элементы каталогов, указывающие на один и тот же файловый дескриптор. Алиасы могут находиться в одном том же подкаталоге, в этом случае альтернативные имена обязательно должны быть разными, или в разных подкаталогах – тогда имена могут быть одинаковыми. Два разных элемента каталога, таким образом, указывают на один и тот же физический файл. Если при обращении к файлу по одному из алиасов в данных файла были сделаны изменения, то при чтении файла по другому алиасу эти изменения будут найдены в файле. Как правило, алиасы создаются для того, чтобы включить файлы, находящиеся в других каталогах, но часто используемые данным пользователем в рабочий каталог пользователя. Если для файла создан алиас, то оба внешних имени– первое и альтернативное – являются равноправными – файл в равной степени принадлежит обоим каталогам. При удалении файла по одному из алиасов удаляется только соответствующий элемент в каталоге, физический же файл (и его дескриптор) продолжает существовать, он будет уничтожен только когда будет удалена последняя ссылка на него.
Косвенным файлом (в Unix – symbolic link) называется элемент каталога, который ссылается на другой элемент каталога. Ссылка производится обычно путем указания полного символьного имени каталога. Принципиальное отличие косвенных файлов от алиасов – в том, что имена косвенных файлов имеют неравные права с основным именем. Только один элемент каталога (основной) ссылается на физический файл, остальные же – на элемент каталога. Поэтому удаление физического файла возможно только по основному имени, удаления же по косвенным именам удаляют только элементы каталогов. Если файл удален по основному имени, то косвенные ссылки на него, как правило, остаются в каталогах и обращения по косвенным именам приведут к ошибкам.
API логической ФС включает в себя также системные вызовы, связанные с созданием и уничтожением каталогов и сменой рабочего каталога.
Физическая ФС. Дескриптор файла.
Дескриптор файла данных является структурой ключевой при переводе виртуального представления файла в реальное. Дескриптор однозначно связан с физическим файлом, но храниться может как вместе с файлом, так и отдельно от него (в элементе каталога, в отдельном месте). В любом случае, однако, дескриптор файла является прозрачным для процессов пользователей, он обрабатывается только ОС. Дескриптор содержит информацию о физической природе файла и информацию о его использовании и защите. Формат дескриптора определяется спецификациями конкретной ФС. В общем случае в дескриптор файла могут входить следующие составляющие:
- тип файла (файл данных, косвенный файл, каталог, файл-устройство и т.п.);
- тип данных файла (текст, объектный модуль, программа и т.п.);
- сведения об организации файла (для перехода от логической структуры к физической);
- размер файла;
- план размещения файла на устройстве внешней памяти;
- список прав доступа;
- время (создания, последней модификации, последнего доступа);
- счетчик алиасов файла;
- и т.д., и т.п.
При открытии файла производится считывание дескриптора в оперативную память и построение его расширения, называемого дескриптором открытого файла. В расширение дескриптора открытого файла в оперативной памяти могут входить:
- счетчик открытий файла (файл может одновременно использоваться несколькими процессами);
- замок разделяемого доступа;
- режим обработки;
- режим буферизации;
- текущее положение файлового курсора;
- идентификация устройства, на котором расположен файл;
- информация, зависящая от типа файла.
- и т.д., и т.п.
Некоторые поля дескриптора изменяются автоматически при работе с файлом. Все изменения, выполненные в дескрипторе в ходе работы с открытым файлом, запоминаются в его копии на внешней памяти при выполнении системного вызова close.
Физическая структура файлов
Уровень физической структуры выполняет перевод реальных адресов в физические адреса на носителе. На этот уровень ложатся все задачи, связанные с управлением распределением реальной внешней памяти. Несколько принципиально важных положений являются общими для любых способов управления дисковой памятью.
- Дисковая память состоит из блоков, являющихся единицами распределения дискового пространства (например, секторов). Каждый блок имеет уникальный номер (адрес), его идентифицирующий. В каждый блок может быть записана любая информация достаточно сложной структуры, в том числе и содержащая ссылки на другие блоки.
- Каждый физический диск описывается дескриптором диска, который содержит информацию о количестве и размере блоков на диске и о свободном пространстве на диске. Дисковый дескриптор записывается на известное заранее место на диске.
- Каждый файл в составе своего дескриптора имеет план своего размещения на физическом пространстве диска.
- Информация, записываемая на диск, может быть избыточной для обеспечения возможности ее восстановления при сбоях.
- Дисковое пространство распределяется блоками фиксированной длины. Даже в тех дисковых архитектурах, которые допускают чтение/запись блоками переменной длины, размер единицы распределения, как правило, все равно фиксирован (например, дорожка). Возможно объединение в единицу распределения нескольких смежных блоков в кластер.
- Поиск на диске управляющих структур ФС и свободных блоков может оказаться слишком времяемким. Поэтому те управляющие структуры, обращение к которым происходит наиболее часто, обычно копируются в оперативную память.
Распределение дисковой памяти, прежде всего, может быть классифицировано как смежное или не смежное. В первом случае файлу распределяется непрерывный участок (экстент) внешней памяти, во втором – файл может быть разбросан по пространству диска.
Преимущества смежного распределения следующие. Во-первых, план размещения файла в этом случае получается простейшим: он состоит только из адреса начала экстента и его размера. Во-вторых, оно обеспечивает высокую степень локализации обращений к дорожкам при обработке файла и, следовательно, высокую эффективность обмена. Однако смежное распределение имеет серьезные недостатки. Во-первых, здесь возникают все проблемы фрагментации пространства дисковой памяти. Во-вторых, требуется, чтобы необходимый размер дискового пространства указывался при создании файла. В-третьих, расширение файла за пределы установленного размера невозможно – для файлов с длительным сроком существования эта проблема может стать критической. Перечисленные недостатки могут быть несколько сглажены, если допускается, чтобы файл занимал не один, а несколько экстентов пространства, и для файла выполняется первичное и вторичное распределение. План размещения файла в этом случае представляется массивом описателей экстентов.
Несмежное распределение позволяет наращивать размер файла динамически, однако, при последовательном чтении файла требует частых позиционирований механизма чтения записи, а план размещения файла оказывается сложным и громоздким, он представляет собой либо линейные списки блоков, либо карту размещения, либо списки (возможно, нелинейные) указателей на блоки.
В ранних ФС, работавших с томами небольшого объема, применялось преимущественно смежное распределение. С увеличением размера томов и числа файлов на них произошел повсеместный переход к полностью несмежному распределению. Дальнейшее увеличение размеров дисков заставило ФС вернуться к смежному распределению на новом уровне. Современные ФС стремятся располагать файлы в непрерывных участках дискового пространства, но допускают неограниченное число экстентов. Указатели на экстенты обычно составляют древовидные списки.
Другой аспект распределения дисковой памяти – учет свободного пространства на диске. Здесь применяются либо карта дискового пространства, либо списки свободных блоков. Карта свободной памяти может состоять из однобитовых элементов со значением 0 – свободен, 1– занят, каждый бит карты соответствует одному блоку (сектору) дискового пространства. Поиск свободного участка заданного размера сводится к поиску в карте цепочки нулевых бит заданной длины. Если для системы имеет значение выделение дисковой памяти непрерывными участками, то состояние дискового пространства может отображаться в двух или более картах разного "масштаба". Списки свободных блоков– линейные, их обработка производится по дисциплине LIFO – выборка блока происходит из начала списка, и новый свободный блок также добавляется в начало списка. ФС может поддерживать несколько таких списков– для блоков разных размеров.
Системные средства взаимодействия процессов
Проблемы параллельного выполнения
Параллельными называются процессы, у которых интервалы времени выполнения перекрываются за счет использования разных ресурсов одной и той же вычислительной системы или за счет перераспределения одного и того же набора ресурсов. Процессы, работающие в большинстве современных ОС, являются слабо связанными. Это означает, что за исключением достаточно редких моментов явной связи процессы выполняются независимо друг от друга. Поскольку параллельные процессы разделяют ресурсы вычислительной системы, задачи управления параллельным выполнением есть задачи управления ресурсами. Методы решения этих задач составляют широкий спектр от самых консервативных (требующих значительного снижения уровня мультипрограммирования), до самых либеральных (допускающих параллельное выполнение большого числа процессов).
Основной задачей управления параллельным выполнением является задача взаимного исключения: два процесса не могут выполнять одновременный доступ к разделяемым ресурсам.
В некоторых случаях возникает необходимость в приостановке выполнения процесса до наступления некоторого внешнего по отношению к нему события – такая задача называется задачей синхронизации. Если рассматривать события как ресурсы (потребляемые), то задача синхронизации является частным случаем задачи взаимного исключения. Как частный случай, она допускает частные решения.
Ниже рассматриваются средства, которые предоставляются для решения этих задач практически всеми современными ОС.
Критические секции
Критической секцией называется такой участок кода процесса, во время выполнения которого процесс не может быть прерван. Участок кода, на котором процесс осуществляет доступ к совместно используемому ресурсу, берется в «скобки критической секции». На время прохождения процесса через критическую секцию все остальные процессы блокируются, что снижает уровень мультипрограммирования в системе. Поэтому это средство широко применяются только для потоков – параллельно выполняющихся частей одного и того же процесса: они все принадлежат одному процессу – одному пользователю и разделяют почти все ресурсы этого процесса. Блокировка затрагивает только другие потоки того же процесса и не затрагивает другие процессы и их потоки.
Виртуальные прерывания или сигналы
Для того, чтобы выдавать синхронизирующий сигнал из одного процесса в другой может использоваться виртуальное прерывание. ОС может предоставлять в распоряжение процессов системный вызов посылки виртуального прерывания от одного процесса к другому. Когда процессу посылается сигнал, выполнение процесса-получателя прерывается и управление передается на процедуру – обработчик этого сигнала в составе процесса. Процесс должен предварительно установить адрес обработчика при помощи специального системного вызова, в котором указывается адрес обработчика, тип сигнала и реакция на сигнал (передать управление на обработчик, игнорировать, установить реакцию по умолчанию). По умолчанию реакция на сигнал, обработка которого не установлена– завершение процесса-получателя.
В ОС определены допустимые типы сигналов. Сигналы могут генерироваться системой автоматически в следующих случаях:
- завершение или другое изменение статуса процесса-потомка;
- программные ошибки (прерывания-ловушки);
- ошибки в выполнении системных вызовов или неправильные обращения к системным вызовам;
- терминальные воздействия (например, нажатие клавиши "Внимание" или Ctrl+Break);
- при необходимости завершения процесса (системный вызов kill);
- сигнал от таймера;
- и т.д.
Большинство допустимых сигналов генерируется в аварийных или исключительных случаях. Однако резервируются и несколько типов сигналов, которыми процессы обмениваются друг с другом и интерпретируют их по взаимной договоренности.
Общие области памяти
Два и более процессов могут использовать одну и ту же физическую область памяти. Наиболее просто это достигается в тех моделях памяти, которые обеспечивают динамическую трансляцию адресов. Напомним, что каждый процесс имеет собственную таблицу сегментов или страниц, в которой содержится помимо прочего базовый адрес сегмента/страницы в физической памяти. Для разделяемой области памяти создается по элементу в таблице для каждого процесса, ее использующего. Поскольку для каждого процесса разделяемый сегмент описывается своим дескриптором, права доступа к сегменту могут быть установлены различными для разных процессов.
Разделяемые сегменты памяти, однако, порождают ряд проблем как для программистов, так и для ОС. Проблемы программистов – взаимное исключение процессов при доступе к общей памяти. Программисты могут дифференцировать права доступа для процессов или организовать взаимное исключение, используя семафоры (см. ниже). Проблемы ОС – организация свопинга. Очевидно, что вероятность вытеснения разделяемого сегмента или страницы должна быть тем меньше, чем больше процессов разделяют этот сегмент/страницу.
Семафоры
Семафоры являются базовым средством для обеспечения взаимодействия между процессами и наличествуют во всех многозадачных ОС явно (в составе API) или неявно (как средства, реализующие другие формы взаимодействия).
Семафор является целочисленной переменной, которая в простейшем случае (двоичный семафор) может принимать значения 0 или 1. Над семафорами определены 2 операции:
V-операция есть операция с одним операндом, который должен быть семафором. Выполнение операции состоит в увеличении значения на 1, это действие должно быть атомарным.
P-операция есть операция с одним операндом, который должен быть семафором. Выполнение операции состоит в уменьшении значения аргумента на 1, если только это действие не приведет к отрицательному значению операнда. Выполнение P-операции, т.е., принятие решение о том, что момент является подходящим для уменьшения аргумента, и последующее его уменьшение должно быть атомарным.
Атомарность P-операции и является потенциальной задержкой: если процесс пытается выполнить P-операцию над семафором, значение которого в данный момент нулевое, данная P-операция не может завершиться пока другой процесс не выполнит V-операцию над этим семафором. Несколько процессов могут начать одновременно P-операцию над одним и тем же семафором. Тогда при установке семафора в 1 только одна из P-операций завершится.
Защита разделяемых ресурсов теперь выглядит следующим образом. Каждый ресурс защищается своим семафором, значение которого может быть 1 – свободен или 0 – занят. Процесс, выполняющий доступ к ресурсу, инициирует P-операцию. Если ресурс занят – процесс задерживается в своей P-операции до освобождения ресурса. Когда ресурс освобождается, P-операция процесса завершается и процесс занимает ресурс. При освобождении ресурса процесс выполняет V-операцию
Для решения задачи взаимного исключения достаточно двоичных семафоров. Семафор, который может принимать неотрицательные значения, большие 1, называется общим семафором. Такой семафор может быть очень удобен, например, при управлении не единичным ресурсом, а классом ресурсов. Начальное значение семафора устанавливается равным числу единиц ресурса в классе. Каждое выделение единицы ресурса процессу сопровождается P-операцией, уменьшающей значение семафора. Семафор, таким образом, играет роль счетчика ресурсов. Когда этот счетчик достигнет нулевого значения, процесс, выдавший следующий запрос на ресурс, будет заблокирован в своей P-операции. Освобождение ресурса сопровождается V-операцией, которая разблокирует процесс, ожидающий ресурс или наращивает счетчик ресурсов.
Общие семафоры могут быть использованы и для простого решения задачи синхронизации. В этом случае семафор связывается с каким-либо событием и имеет начальное значение 0. (Событие может рассматриваться как ресурс, и до наступления события этот ресурс недоступен). Процесс, ожидающий события, выполняет P-операцию и блокируется до установки семафора в 1. Процесс, сигнализирующий о событии, выполняет над семафором V-операцию.
Каналы-трубопроводы
Для процесса канал практически аналогичен файлу. Специальные системные вызовы используются для создания канала и получения доступа к каналу, а для работы с каналом используются те же вызовы read и write, что и для файлов, и закрытие канала выполняется вызовом close. Канал, однако, представляет собой не внешние данные, а область памяти, доступ к которой осуществляется по дисциплине FIFO – первый вошел– первый вышел. Для канала выделяется память в системной области, что может ограничивать емкость канала. В связи с этим процесс, обращающийся к каналу, может блокироваться: при попытке чтения из пустого канала и при попытке записи в переполненный канал.
Наиболее часто используются неименованные каналы, как средство связи между родителем и потомком. Операция создания неименованного канала возвращает два файловых манипулятора: для чтения и для записи. Процесс-предок передает эти манипуляторы процессу-потомку. Если связь между предком и потомком однонаправленная, то каждый из них закрывает канал по одному из манипуляторов.
Именованные каналы ориентированы, прежде всего, на взаимодействие процессов в сетевой среде. Такой канал двунаправленный, то есть, к нему возможны обращения и для чтения, и для записи. Данные в канале могут передаваться как потоком байт, так и сообщениями. В последнем случае каждое сообщение снабжается заголовком, в котором указывается его длина. К одному концу канала постоянно подключен процесс, его создавший – владелец или сервер, к другому концу могут подключаться различные процессы-клиенты, таким образом, обмен данными по именованному каналу между процессами, ни один из которых не является владельцем канала, невозможен. По логике использования именованные каналы ближе к очередям (см. ниже).
Очереди сообщений
Очереди воплощают модель взаимодействия процессов "много отправителей – один получатель". Эту модель часто называют почтовым ящиком из-за сходства с таковым, висящим на дверях каждой квартиры. Процесс-получатель является владельцем очереди, он создает очередь, а остальные процессы получают к ней доступ, "открывая" ее. Очередь обычно имеет внешнее имя. Передача данных в очереди происходит всегда сообщениями, причем каждое сообщение имеет заголовок и тело. Заголовок всегда имеет фиксированный для данной системы формат. В него обязательно входит длина сообщения, а другая информация зависит от спецификаций конкретной системы: это может быть приоритет сообщения, тип сообщения, идентификатор процесса-отправителя и т.п. Тело сообщения интерпретируется по правилам, устанавливаемым самими процессами– отправителем и получателем. Заголовок и тело представляют собой существенно разные структуры данных и располагаются в разных местах в памяти. Собственно очередь (чаще всего – линейный список) ОС составляет из заголовков сообщений. В элементы очереди включаются указатели на тела сообщений, располагающиеся в памяти системы или процессов.
Как правило, возможности процесса-получателя сообщений не ограничиваются чтением по дисциплине FIFO, ему предоставляется более богатый выбор дисциплин: LIFO, по приоритету, по типам, по идентификаторам отправителя и т.п. В распоряжении владельца имеются также средства определения размера очереди, а возможно, и просмотра очереди – неразрушающего чтения из нее. В распоряжении процесса-отправителя имеется только вызов посылки сообщения в очередь.
Очереди реализуют асинхронный механизм взаимодействия: процесс, отправивший сообщение, продолжает свое выполнение, не заботясь о судьбе посланного сообщения. Если ему для продолжения выполнения необходим ответ на сообщение, он ожидает ответа в своем почтовом ящике. Очереди, таким образом, являются наиболее гибким и универсальным средством взаимодействия, и в некоторых системах они являются единственным средством взаимодействия между процессами – как пользовательскими, так и системными.
Защита ресурсов
Общие требования безопасности
Защита информации достигается комплексом мер безопасности, включающим в себя как обеспечение сохранности информации, так и контроль доступа к ней. Требования к безопасности – сохранности и конфиденциальности пользовательских и системных программ и данных, а также к потреблению ресурсов пользователями в пределах установленных им бюджетов всегда являлось одним из важнейших в вычислительных системах. В настоящее время все сколько-нибудь серьезные пользователи в производственной сфере готовы платить за гарантии безопасность в своей работе.
В США, а де-факто и во всем мире, требования безопасности к компьютерным системам в бизнесе определяются стандартным классом C2. (Правительственные стандарты США определяют несколько классов безопасности: от самого высокого – A до самого низкого – D, с дополнительной градацией в классах B и C). Основные требования класса C2 сводятся к следующим:
- владелец ресурса должен управлять доступом к ресурсу;
- ОС должна защищать объекты от несанкционированного использования другими процессами (в том числе и после их удаления);
- перед получением доступа к системе каждый пользователь должен идентифицировать себя, введя уникальное имя входа в систему и пароль; система должна быть способной использовать эту уникальную информацию для контроля действий пользователя;
- администратор системы должен иметь возможность контроля связанных с безопасностью событий, доступ к этим контрольным данным должен ограничиваться администратором;
- система должна защищать себя от внешнего вмешательства типа модификации выполняющейся системы или хранимых файлов.
Модель защиты
Модель защиты рассматривает объекты – элементы системы, которым требуется защита, и субъекты – активные элементы, стремящиеся получить доступ к объектам. Механизмы защиты должны обеспечивать ограничение доступа субъектов к объектам: во-первых, доступ к объекту должен быть разрешен только для определенных субъектов, во-вторых, даже имеющему доступ субъекту должно быть разрешено выполнение только определенного набора операций. Для обеспечения защиты могут применяться: кодирование объектов; сокрытие местоположения объектов; инкапсуляция объектов. Для каждого объекта определено множество допустимых для него операций. Применительно к файлам, например, возможны в общем случае следующие операции:
- получение информации из объекта;
- обновление информации в объекте;
- добавление в объект новой информации (без изменения старой);
- интерпретация объекта как исполняемого кода;
- уничтожение объекта;
- получение информации об объекте;
- установка информации об объекте;
- установка прав доступа к объекту.
Перечень всех операций, допустимых для данной пары субъект-объект составляет возможности или право доступа данного субъекта к данному объекту. Каждая пара субъект-объект при каждом акте доступа взаимодействует в определенном режиме доступа. Условием разрешения доступа является совпадение запрошенного субъектом режима доступа с его возможностями по отношению к запрошенному объекту.
Полный набор прав доступа для всех субъектов и всех объектов может быть представлен в виде матрицы доступа, строки которой соответствуют субъектам, а столбцы – объектам (или наоборот). На пересечениях строк и столбцов указываются права доступа для данной пары. В многопользовательских системах с большим количеством, как объектов, так и субъектов, во-первых, размер матрицы может быть чрезвычайно большим, во-вторых, сама матрица наверняка будет очень сильно разрежена. Поэтому матричное представление прав доступа является неэффективным. Матрица может быть представлена либо в виде списков возможностей, либо в виде списков управления доступом. В первом случае в системе существует таблица субъектов и с каждым элементом этой таблицы связывается список объектов, к которым субъект имеет доступ. Во втором случае имеется таблица объектов, с элементами которой связаны списки субъектов. Для сокращения списков субъекты могут объединяться в группы пользователей, а объекты– в группы доступа.
Реализация системы защиты
Простейшим примером реализации защиты является защита файлов в традиционной ФС s5 ОС Unix. В дескрипторе каждого файла хранится идентификатор владельца файла и битовые тройки вида rwx (читать, писать, выполнять). Первая тройка определяет права доступа к файлу его владельца, вторая– пользователей, входящих в ту же группу, что и владелец, третья – всех остальных пользователей.
В наиболее последовательном виде объектная модель доступа м.б. реализована в объектно-ориентированных системах. Во-первых, в таких системах объектами являются не только файлы, но и любые ресурсы. Доступ к любому ресурсу сопровождается процедурой проверки прав доступа– одинаковой для любого типа объектов. Инкапсуляция и определение методов для объектов просто не дают возможности выполнить над объектом непредусмотренную для него операцию.
В современных системах вводятся также классы или роли пользователей: принадлежность пользователя к тому или иному классу разрешает пользователю работать с теми или иными объектами. Обычно в возможности класса входят объекты и соответствующие возможности, позволяющие выполнять управление системой, например, выполнять те или иные команды. Роль привилегированного пользователя охватывает все объекты системы со всеми правами доступа к ним. Предустановленная роль обычного пользователя разрешает ему доступ к такому подмножеству объектов и возможностей, оперируя которыми он не может вывести из строя ОС или повредить другим пользователям. Дополнительные права обычного пользователя обеспечиваются персональными разрешениями.
Связанную с пользователем информацию, относящуюся к системе защиты, называют бюджетом. Дескриптор пользователя в ОС обычно называют профилем пользователя. Помимо бюджетной информации в профиль могут входить настройки интерфейса рабочего места, процедура, автоматически выполняемая при начале пользователем сеанса, установки библиотек и каталогов для поиска и т.д. и т.п. Независимо от того, используются в системе списки возможностей или списки управления доступом, некоторые данные бюджета все равно содержатся в профиле пользователя: его имя и пароль (последний – обычно в закодированном виде), его класс, список групп, к которым он принадлежит. Бюджеты пользователей должны быть одними из наиболее строго защищаемых объектов в системе.