Составители:
Рубрика:
нии потоков, а вот в дальнейшем поток может работать от имени какого-
либо иного пользователя, используя собственный маркер воплощения
(impersonation).
Процессы и потоки в Windows являются с одной стороны «представи-
телями» пользователя, выступающими от его имени, а с другой стороны –
защищаемыми объектами, при доступе к которым выполняется проверка
прав, то есть они обладают одновременно и маркерами доступа, и деск-
рипторами безопасности.
Описатели объектов ядра в Windows позволяют разным процессам и
потокам взаимодействовать с объектами с учетом их контекстов безопас-
ности, располагаемых прав и требуемого режима доступа. Примерами за-
щищаемых объектов являются процессы, потоки, файлы, большинство
синхронизирующих примитивов (события, семафоры и т.д.), проекции
файлов в память и многое другое.
Для создания большинства объектов ядра используются функции,
начинающиеся на слово «Create» и возвращающие описатель созданного
объекта, например функции CreateFile, CreateProcess, CreateEvent и т.д.
Многие объекты при их создании могут получить собственное имя или ос-
таться неименованными.
Любой процесс или поток может ссылаться на объекты ядра, создан-
ные другим процессом или потоком. Для этого предусмотрено три меха-
низма:
• Объекты могут быть унаследованы дочерним процессом при его
создании. В этом случае объекты ядра должны быть «наследуемы-
ми», и родительский процесс должен принять меры к тому, чтобы
потомок мог узнать их описатели. Возможность передавать опи-
сатель потомкам по наследованию явно указывается в большин-
стве функций, так или иначе создающих объекты ядра (обычно
такие функции содержат аргумент «BOOL bInheritHandle», кото-
рый указывает возможность наследования).
• Объект может иметь собственное уникальное имя – тогда мож-
но получить описатель этого объекта по его имени. Для разных
типов объектов Win32 API предоставляет набор функций, начи-
нающийся на Open...например, OpenMutex, OpenEvent и т.д.
• Процесс-владелец объекта может передать его описатель любо-
му другому процессу. Для этого процесс-владелец объекта дол-
жен получить специальный описатель объекта для «экспорта» в
указанный процесс. В Win32 API для этого предназначена функ-
ция DuplicateHandle, создающая для объекта, заданного описа-
телем в контексте данного процесса, новый описатель, коррект-
ный в контексте нового процесса:
Основы многозадачности
209
ядро операционной системы вынуждено проверять полномочия каждого
процесса при их попытках доступа к защищаемым объектам.
Для того чтобы ядро операционной системы могло контролировать
доступ к тем или иным объектам, сами объекты должны управляться
ядром системы. Это приводит к понятию объектов ядра (kernel objects), ко-
торые создаются по запросу процессов ядром системы, управляются
ядром, и доступ к которым также контролируется ядром системы.
6.2.3.1. Объекты ядра
Объекты ядра представлены в качестве некоторых структур и типов
данных, управляемых ядром операционной системы и размещенных в па-
мяти, принадлежащей ядру. Пользовательские процессы, как правило,
не имеют возможности доступа к этим объектам напрямую. Для того чтобы
пользовательский процесс мог оперировать такими объектами, введено по-
нятие описатель (handle) объекта ядра. Так, например, объектами ядра явля-
ются файлы, процессы, потоки, события, почтовые ящики и многое другое.
Все созданные описатели объектов ядра должны удаляться с помо-
щью функции
BOOL CloseHandle( HANDLE hKernelObject ),
которая уменьшает счетчик использования объекта и уничтожает его,
когда на объект никто больше не ссылается.
Доступ к защищаемым объектам в Windows задается так называемы-
ми дескрипторами безопасности (Security Descriptor). Дескриптор содержит
информацию о владельце объекта и первичной группе пользователей и два
списка управления доступом (ACL, Access Control List): один список задает
разрешения доступа, другой – необходимость аудита при доступе к объек-
ту. Список содержит записи, указывающие права выполнения действий, и
запреты, назначенные конкретным пользователям и группам. При досту-
пе к защищаемым объектам для начала проверяются запреты – если для
данного пользователя и группы имеется запрет доступа, то дальнейшая
проверка не выполняется и попытка доступа отклоняется. Если запретов
нет, то проверяются права доступа – при отсутствии разрешений доступ
отклоняется. Запрет обладает более высоким «приоритетом», чем наличие
разрешений – это позволяет разрешить доступ, к примеру, целой группе
пользователей и выборочно запретить некоторым ее членам.
Объект, осуществляющий доступ (выполняющийся поток), облада-
ет так называемым маркером доступа (access token). Маркер идентифици-
рует пользователя, от имени которого предпринимается попытка досту-
па, а также его привилегии и умолчания (например, стандартный ACL
объектов, создаваемых этим пользователем). В Windows маркерами дос-
тупа обладают как потоки, так и процессы. С процессом связан так на-
зываемый первичный маркер доступа, который используется при созда-
208
CIL и системное программирование в Microsoft .NET
208 CIL и системное программирование в Microsoft .NET Основы многозадачности 209 ядро операционной системы вынуждено проверять полномочия каждого нии потоков, а вот в дальнейшем поток может работать от имени какого- процесса при их попытках доступа к защищаемым объектам. либо иного пользователя, используя собственный маркер воплощения Для того чтобы ядро операционной системы могло контролировать (impersonation). доступ к тем или иным объектам, сами объекты должны управляться Процессы и потоки в Windows являются с одной стороны «представи- ядром системы. Это приводит к понятию объектов ядра (kernel objects), ко- телями» пользователя, выступающими от его имени, а с другой стороны – торые создаются по запросу процессов ядром системы, управляются защищаемыми объектами, при доступе к которым выполняется проверка ядром, и доступ к которым также контролируется ядром системы. прав, то есть они обладают одновременно и маркерами доступа, и деск- рипторами безопасности. 6.2.3.1. Объекты ядра Описатели объектов ядра в Windows позволяют разным процессам и Объекты ядра представлены в качестве некоторых структур и типов потокам взаимодействовать с объектами с учетом их контекстов безопас- данных, управляемых ядром операционной системы и размещенных в па- ности, располагаемых прав и требуемого режима доступа. Примерами за- мяти, принадлежащей ядру. Пользовательские процессы, как правило, щищаемых объектов являются процессы, потоки, файлы, большинство не имеют возможности доступа к этим объектам напрямую. Для того чтобы синхронизирующих примитивов (события, семафоры и т.д.), проекции пользовательский процесс мог оперировать такими объектами, введено по- файлов в память и многое другое. нятие описатель (handle) объекта ядра. Так, например, объектами ядра явля- Для создания большинства объектов ядра используются функции, ются файлы, процессы, потоки, события, почтовые ящики и многое другое. начинающиеся на слово «Create» и возвращающие описатель созданного Все созданные описатели объектов ядра должны удаляться с помо- объекта, например функции CreateFile, CreateProcess, CreateEvent и т.д. щью функции Многие объекты при их создании могут получить собственное имя или ос- BOOL CloseHandle( HANDLE hKernelObject ), таться неименованными. которая уменьшает счетчик использования объекта и уничтожает его, Любой процесс или поток может ссылаться на объекты ядра, создан- когда на объект никто больше не ссылается. ные другим процессом или потоком. Для этого предусмотрено три меха- Доступ к защищаемым объектам в Windows задается так называемы- низма: ми дескрипторами безопасности (Security Descriptor). Дескриптор содержит • Объекты могут быть унаследованы дочерним процессом при его информацию о владельце объекта и первичной группе пользователей и два создании. В этом случае объекты ядра должны быть «наследуемы- списка управления доступом (ACL, Access Control List): один список задает ми», и родительский процесс должен принять меры к тому, чтобы разрешения доступа, другой – необходимость аудита при доступе к объек- потомок мог узнать их описатели. Возможность передавать опи- ту. Список содержит записи, указывающие права выполнения действий, и сатель потомкам по наследованию явно указывается в большин- запреты, назначенные конкретным пользователям и группам. При досту- стве функций, так или иначе создающих объекты ядра (обычно пе к защищаемым объектам для начала проверяются запреты – если для такие функции содержат аргумент «BOOL bInheritHandle», кото- данного пользователя и группы имеется запрет доступа, то дальнейшая рый указывает возможность наследования). проверка не выполняется и попытка доступа отклоняется. Если запретов • Объект может иметь собственное уникальное имя – тогда мож- нет, то проверяются права доступа – при отсутствии разрешений доступ но получить описатель этого объекта по его имени. Для разных отклоняется. Запрет обладает более высоким «приоритетом», чем наличие типов объектов Win32 API предоставляет набор функций, начи- разрешений – это позволяет разрешить доступ, к примеру, целой группе нающийся на Open...например, OpenMutex, OpenEvent и т.д. пользователей и выборочно запретить некоторым ее членам. • Процесс-владелец объекта может передать его описатель любо- Объект, осуществляющий доступ (выполняющийся поток), облада- му другому процессу. Для этого процесс-владелец объекта дол- ет так называемым маркером доступа (access token). Маркер идентифици- жен получить специальный описатель объекта для «экспорта» в рует пользователя, от имени которого предпринимается попытка досту- указанный процесс. В Win32 API для этого предназначена функ- па, а также его привилегии и умолчания (например, стандартный ACL ция DuplicateHandle, создающая для объекта, заданного описа- объектов, создаваемых этим пользователем). В Windows маркерами дос- телем в контексте данного процесса, новый описатель, коррект- тупа обладают как потоки, так и процессы. С процессом связан так на- ный в контексте нового процесса: зываемый первичный маркер доступа, который используется при созда-
Страницы
- « первая
- ‹ предыдущая
- …
- 109
- 110
- 111
- 112
- 113
- …
- следующая ›
- последняя »