Список управление доступом. Матрица защиты с доменами в качестве объектов. Изобразить. - Morozov-5F/operational-system-docs GitHub Wiki

#9.3. Управление доступом к ресурсам

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

##9.3.1. Домены защиты

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

У каждого объекта есть уникальное имя, по которому к нему можно обращаться, и конечный набор операций, которые процессы могут выполнять в отношении этого объекта. Файлу свойственны операции read и write, а семафору — операции up и down.

Совершенно очевидно, что нужен способ запрета процессам доступа к тем объектам, к которым у них нет прав доступа. Более того, этот механизм должен также предоставлять возможность при необходимости ограничивать процессы поднабором разрешенных операций. Например, процессу A может быть дано право проводить чтение данных из файла F, но не разрешено вести запись в этот файл.

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

Распределение объектов по доменам зависит от особенностей того, кому и о чем нужно знать. Тем не менее одним из фундаментальных понятий является принцип минимальных полномочий (Principle of Least Authority (POLA)), или принцип необходимого знания. В общем, безопасность проще соблюсти, когда у каждого домена имеется минимум объектов и привилегий для работы с ними и нет ничего лишнего.

На рис. 9.2 показаны три домена с объектами в каждом из них и правами на чтение, запись и выполнение (Read, Write, eXecute) применительно к каждому объекту. Заметьте, что объект Printer1 одновременно находится в двух доменах и обладает одинаковыми правами в каждом из них. Объект File1 также присутствует в двух доменах, но имеет разные права в каждом из них.

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

Чтобы конкретизировать идею домена защиты, рассмотрим пример из системы UNIX (который также относится к Linux, FreeBSD и им подобным клонам). В UNIX домен процесса определяется его идентификаторами UID и GID. Когда пользователь входит в систему, его оболочка получает UID и GID, которые содержатся в его записи в файле паролей, и они наследуются всеми его дочерними процессами. Представляя любую комбинацию (UID, GID), можно составить полный список всех объектов (файлов, включая устройства ввода-вывода, которые представлены в виде специальных файлов и т. д.), к которым процесс может обратиться с указанием возможного типа доступа (чтение, запись, исполнение). Два процесса с одинаковой комбинацией (UID, GID) будут иметь абсолютно одинаковый доступ к одинаковому набору объектов. Процессы с различающимися значениями (UID, GID) будут иметь доступ к разным наборам файлов, хотя, может быть, и со значительным перекрытием этих наборов.

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

Когда процесс осуществляет системный вызов exec в отношении файла, у которого установлен бит SETUID или бит SETGID, он получает новый действующий идентификатор UID или GID. С другой комбинацией (UID, GID) он имеет и другой набор доступных файлов и операций. Запуск программы с установленным битом SETUID или битом SETGID также вызывает переключение домена, так как при этом изменяются права доступа. Важно знать, как именно система отслеживает принадлежность объекта к тому или иному объекту. Концептуально можно представить себе большую матрицу, в которой строками будут домены, а колонками — объекты. В каждой ячейке перечисляются права, если таковые имеются, которыми располагает домен по отношению к объекту. Матрица для рис. 9.2 показана на рис. 9.3. Располагая этой матрицей и номером текущего домена, операционная система может определить, разрешен ли из конкретного домена определенный вид доступа к заданному объекту.

Само по себе переключение между доменами также может быть легко включено в ту же табличную модель, если в качестве объекта представить сам домен, в отношении которого может быть разрешена операция входа — enter. На рис. 9.4 снова показана матрица с рис. 9.3, но теперь на ней в качестве объектов фигурируют и сами три домена. Процессы в домене 1 могут переключаться на домен 2, но обратно вернуться уже не могут. Эта ситуация моделирует в UNIX выполнение программы с установленным битом SETUID. Другие переключения доменов в данном примере не разрешены.

9.3.2. Списки управления доступом

На практике матрица, изображенная на рис. 9.4, используется довольно редко из-за больших размеров и разряженного характера. Многие домены вообще не имеют доступа ко многим объектам, следовательно, на хранение очень большой практически пустой матрицы будет напрасно тратиться дисковое пространство. Поэтому практическое применение нашли два метода: хранение матрицы по строкам или по столбцам, а затем хранение только заполненных элементов. Как ни удивительно, но эти два подхода отличаются друг от друга. В данном разделе будет рассмотрено хранение этой информации по столбцам, а в следующем — по строкам.

В первом методе с каждым объектом ассоциируется упорядоченный список, содержащий все домены, которым разрешен доступ к данному объекту, а также тип доступа. Такой список, показанный на рис. 9.5, называется ACL (Access Control List — список управления доступом). Здесь показаны три процесса, принадлежащие доменам A, B и C, а также три файла: F1, F2 и F3. Чтобы упростить ситуацию, предположим, что каждому домену соответствует только один пользователь, в данном случае это пользователи A, B и C. Довольно часто в литературе по информационной безопасности пользователей называют субъектами (subjects) или принципалами (principals), то есть пользователями, имеющими учетную запись в данной среде, чтобы отличать их владельцев некими вещами, объектами (objects), к которым, к примеру, можно отнести файлы.

У каждого файла есть связанный с ним ACL. В ACL-списке файла F1 имеется две записи (разделенные точкой с запятой). В первой записи сообщается, что любой процесс,

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

В ACL-списке файла F2 имеется три записи: пользователи A, B и C могут читать файл, а пользователь B может также выполнять в него запись. Другие типы доступа не разрешаются. Очевидно, файл F3 представляет собой исполняемую программу, так как пользователи A и B могут как читать, так и исполнять этот файл. Пользователю B также разрешается вести в него запись.

Этот пример иллюстрирует самую общую форму защиты с помощью ACL-списков. На практике зачастую применяются более сложные системы. Начнем с того, что здесь отображены всего лишь три права доступа: чтение, запись и исполнение. Кроме них могут быть и другие права доступа. Часть прав может иметь общий характер, то есть распространяться на все объекты, а часть может иметь специфическое отношение к объекту. Примерами прав общего характера могут послужить право уничтожения объекта (destroy object) и копирования объекта (copy object), они могут принадлежать любому объекту независимо от его типа. К правам, имеющим специфическое отношение к объекту, можно отнести право добавления сообщения (append message) для объекта почтового ящика и право сортировки в алфавитном порядке (sort alphabetically) для объекта каталога.

До сих пор рассматриваемые записи в ACL-списке относились к отдельным пользователям. Многие системы поддерживают концепцию групп (group) пользователей. У групп есть имена, и они также могут включаться в ACL-списки. Семантика групп имеет два возможных варианта. В некоторых системах у каждого процесса есть идентификатор пользователя UID и идентификатор группы GID. В таких системах ACL-списки содержат записи вида UID1, GID1: права1; UID2, GID2: права2; ... При таких условиях, когда поступает запрос на доступ к объекту, выполняется проверка UID и GID того, кто выдал этот запрос. Если эти идентификаторы присутствуют в ACL-списке, то предоставляются права, перечисленные в списке. Если комбинации (UID, GID) в списке нет, доступ не разрешается.

По сути, использование групп вводит понятие роли (role). Рассмотрим вычислительный центр, в котором Тана является системным администратором и поэтому входит в группу sysadm. Но предположим, что в компании есть также клубы для сотрудников и Тана является членом клуба любителей голубей. Члены клуба принадлежат к группе pigfan и имеют доступ к компьютерам компании для ведения своей голубиной базы данных. Часть ACL-списка может иметь вид, представленный в табл. 9.2.

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

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

tana, *:RW

в файле паролей предоставит Тане доступ независимо от того, к какой группе она в данный момент принадлежит.

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

virgil, *: (none); *, *:RW

предоставляет возможность доступа к файлу для чтения и записи всем, кроме пользователя с именем Вирджил (Virgil). Эта запись срабатывает благодаря тому, что записи сканируются по порядку и из них берется первая подходящая, а последующие записи даже не анализируются. В первой же записи находятся подходящее имя Virgil и права доступа — в данном случае none (то есть отсутствие каких-либо прав), которые и вступают в силу. Тот факт, что все остальные имеют доступ, не удостаивается никакого внимания.

Другой способ работы с группами заключается в том, что записи ACL-списка составлены не из пар (UID, GID), а содержат либо UID, либо GID. Например, запись для файла pigeon_data может иметь следующий вид:

debbie: RW; phil: RW; pigfan: RW

означающий, что Дебби и Фил, а также все члены группы pigfan могут обращаться к этому файлу для чтения и записи.

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

Источники:

  • Современные опреационные системы, Э. Таненбаум, 4-е изд.