Защита файла и права доступа 


Поскольку файлы - это защищенные объекты (securable objects), обращение  к ним, регулируется моделью управления доступом, которая руководит доступом ко всем другим защищенным объектам в Windows. Подробное объяснение этой модели см. в главе Управление доступом.

Вы можете установить дескриптор безопасности (security descriptor) для файла или каталога, когда вызываете функцию CreateFile, CreateDirectory или CreateDirectoryEx. Если Вы для параметра lpSecurityAttributes определяете значение ПУСТО (NULL) , файл или каталог получает заданный по умолчанию дескриптор безопасности. Списки контроля доступа (ACL) в заданном по умолчанию дескрипторе безопасности для файла или каталога наследуются от его каталога предыдущего уровня.

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

Чтобы извлечь  дескриптор безопасности объекта файла или каталога, вызовите функцию GetNamedSecurityInfo или GetSecurityInfo. Чтобы изменить дескриптор безопасности объекта файла или каталога, вызовите функцию SetNamedSecurityInfo или SetSecurityInfo.

Правильные права доступа для файлов и каталогов включают в себя стандартные права доступа (standard access rights)  DELETE (удаление), READ_CONTROL (управление чтением), WRITE_DAC (избирательный контроль за доступом к записи) и WRITE_OWNER (монопольная запись). Нижеследующая таблица перечисляет права доступа, которые являются специфическими для  определенных файлов и каталогов.

Права доступа Описание
FILE_ADD_FILE Для каталога, право создавать файл в каталоге.
FILE_ADD_SUBDIRECTORY Для каталога, право создавать подкаталог в каталоге.
FILE_ALL_ACCESS Все возможные права доступа для файла.
FILE_APPEND_DATA Для объекта файла, право добавлять  данные к файлу. Для объекта каталога, право создавать подкаталог.
FILE_CREATE_PIPE_INSTANCE Для именованного канала, право создавать канал.
FILE_DELETE_CHILD Для каталога, право удалять каталог и все файлы содержащиеся в нем, включая файлы только для чтения.
FILE_EXECUTE Для файла собственного кода (данной ЭВМ), право исполнять файл. Это право доступа, данное скриптам может заставить скрипт быть исполняемым, в зависимости от интерпретатора скрипта.
FILE_LIST_DIRECTORY Для каталога, право перечислять состав каталога.
FILE_READ_ATTRIBUTES Право читать атрибуты файла.
FILE_READ_DATA Для файлового объекта, право читать соответствующие данные файла. Для объекта каталога, право читать соответствующие данные каталога.
FILE_READ_EA Право читать дополнительные атрибуты файла.
FILE_TRAVERSE Для каталога, право проходить каталог. По умолчанию, пользователям назначается привилегия BYPASS_TRAVERSE_CHECKING, которая игнорирует право доступа FILE_TRAVERSE. Дополнительную информацию см.  ниже в замечаниях в этой статье.
FILE_WRITE_ATTRIBUTES Право записывать атрибуты в файл.
FILE_WRITE_DATA Для файлового объекта, право записывать данные в файл. Для объекта каталога, право создавать файл в каталоге.
FILE_WRITE_EA Право записывать дополнительные атрибуты в файл.
STANDARD_RIGHTS_READ Включает в себя флажок READ_CONTROL, который является правом читать информацию в дескрипторе безопасности объекта каталога или файла. Он не включает информацию в системный список контроля доступа (SACL).
STANDARD_RIGHTS_WRITE Включает в себя флажок WRITE_CONTROL, который является правом записать в дескриптор безопасности объекта каталога. Он не включает информацию в системный список контроля доступа (SACL).
SYNCHRONIZE Право определять дескриптор файла в одной из функций ожидания. Однако для асинхронных действий файлового ввода - вывода (I/O), вам следует ждать обработки события в структуре OVERLAPPED, а не использовать дескриптор файла для синхронизации.

Ниже перечислены универсальные права доступа (generic access rights) для файлов и каталогов.

Права доступа Описание
GENERIC_EXECUTE FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
SYNCHRONIZE
GENERIC_READ FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
SYNCHRONIZE
GENERIC_WRITE FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
SYNCHRONIZE

 

Windows Me/98/95:  Ниже перечислены единственные поддерживаемые права доступа: DELETE, FILE_WRITE_ATTRIBUTES, GENERIC_READ и GENERIC_WRITE.

Windows сравнивает затребованные права доступа и информацию в маркере доступа потока с информацией в дескрипторе безопасности объекта каталога или файле. Если сравнение не запрещает все затребованные права доступа, которые должны быть предоставленными, дескриптор объекта возвращается потоку, и права доступа предоставляются. За подробной информацией об этом процессе обратитесь к статье Взаимодействие между потоками и защищенными объектами.

По умолчанию, разрешение на доступ к файлу или каталогу управляется строго списками контроля доступа (ACL) в дескрипторе безопасности, связанным с этим файлом или каталогом. В частности, дескриптор безопасности родительского каталога не используется, чтобы управлять доступом к любому дочернему файлу или каталогу. Право доступа FILE_TRAVERSE может быть реализовано, путем удаления привилегии BYPASS_TRAVERSE_CHECKING у пользователей. Это не рекомендуется в общем случае, так как многие программы неправильно  обрабатывают ошибки обхода каталога. Главное использование  права доступа FILE_TRAVERSE в каталогах - это включить соответствие некоторому стандарту POSIX  IEEE и ISO, когда требуется способность к взаимодействию с системами Unix.

Модель системы безопасности Windows предусматривает для дочернего каталога способ наследования или предотвращения наследования, одного или нескольких элементов списка контроля доступа (ACE)  в дескрипторе безопасности родительской директории. Каждый элемент списка контроля доступа (ACE) содержит информацию, которая обуславливает, как эти элементы могут быть унаследованы, и будут ли они воздействовать на наследующий объект каталога. Например, некоторые унаследованные ACE управляют доступом к унаследованному объекту каталога и они называются рабочими элементами списка контроля доступа (ACE) (effective ACEs). Все другие элементы списка контроля доступа (ACE) называются только унаследованными ACE (inherit-only ACEs).

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

Обратите внимание! на то, что Вы не можете использовать отказ в доступе ACE, чтобы не допустить обращения к файлу только для GENERIC_READ, или только для GENERIC_WRITE. Для таких объектов файлов это происходит потому, что универсальные схемы набора прав и для GENERIC_READ, и для GENERIC_WRITE включают в себя  право доступа SYNCHRONIZE. Если элемент списка контроля доступа (ACE) отказывает, то GENERIC_WRITE обращается опекуну, а опекун запрашивает доступ GENERIC_READ, так что запрос завершится ошибкой, потому что потенциально он включает в себя доступ SYNCHRONIZE, в котором косвенно был отказ ACE, и наоборот. Вместо того, чтобы использовать отказ в доступе ACE, используйте разрешение доступа ACE, чтобы явно дать возможность использовать разрешенные права доступа.

Другим способом управления доступом к объектам хранения данных является шифрование. Реализацией шифрования файловой системы в Windows является технология Encrypted File System - Шифрующей файловой системы, или EFS. EFS шифрует только файлы, а не каталоги. Преимущество шифрования заключается в том, что оно предусматривает дополнительную защиту файлов, которая применяется для аудио- и видеоинформации, а не для всей файловой системы, и стандартную архитектуру контроля доступа Windows.За подробной информацией о шифровании файла, обратитесь к статье  Шифрование файла.

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

Привилегии доступа SE_BACKUP_NAME и SE_RESTORE_NAME  были специально созданы, чтобы обеспечить эту способность резервному копированию приложения. Если эти права доступа предоставляются и включаются в маркере доступа резервного прикладного процесса, тогда он может вызвать функцию CreateFile, чтобы открыть ваш файл или каталог для резервного копирования, устанавливая стандартное право доступа READ_CONTROL  как значение параметра dwDesiredAccess в ней. Однако, чтобы идентифицировать вызывающий процесс как  процесс резервирования, вызов  CreateFile должен включать в себя флажок FILE_FLAG_BACKUP_SEMANTICS в параметре dwFlagsAndAttributes . Полный синтаксис вызова функции - ниже:

hFile = CreateFile(fileName,
            READ_CONTROL,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_FLAG_BACKUP_SEMANTICS,
            NULL);

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

hFile = CreateFile(fileName,
            WRITE_OWNER|WRITE_DAC,
            0,
            NULL,
            CREATE_ALWAYS,
            FILE_FLAG_BACKUP_SEMANTICS,
            NULL);

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

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

Если резервное копирование приложения должно иметь доступ к параметрам настройки управления доступом системного уровня, флажок в параметре dwDesiredAccess, передаваемый в CreateFile,  должен быть установлен в значение ACCESS_SYSTEM_SECURITY.

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

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz