Поделиться через


Права безопасности и доступа к файлам

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

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

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

Допустимые права доступа для файлов и каталогов включают в себя права ДОСТУПА DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER и СИНХРОНИЗАЦИЯ стандартных прав доступа. В таблице в константы прав доступа к файлам перечислены права доступа, относящиеся к файлам и каталогам.

Хотя право доступа SYNCHRONIZE определяется в стандартном списке прав доступа в качестве права на указание дескриптора файла в одной из функций ожидания, при использовании асинхронных операций ввода-вывода файлов следует ожидать дескриптора событий, содержащегося в правильно настроенной структуре OVERLAPPED, а не с помощью дескриптора файлов с правами на синхронизацию.

Ниже приведены универсальные права доступа для файлов и каталогов.

Право доступа Description
FILE_GENERIC_EXECUTE
FILE_EXECUTE
FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
СИНХРОНИЗИРОВАТЬ
FILE_GENERIC_READ
FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
СИНХРОНИЗИРОВАТЬ
FILE_GENERIC_WRITE
FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
СИНХРОНИЗИРОВАТЬ

 

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

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

Модель безопасности Windows предоставляет способ наследования дочернего каталога или запретить наследовать один или несколько acEs в дескрипторе безопасности родительского каталога. Каждый ACE содержит сведения, определяющие, как его можно наследовать, и будет ли он влиять на наследуемый объект каталога. Например, некоторые унаследованные acEs управляют доступом к наследуемого объекта каталога, и они называются эффективными acEs. Все остальные acES называются наследуемыми только acEs.

Модель безопасности Windows также применяет автоматическое наследование acEs дочерним объектам в соответствии с правилами наследования ACE. Это автоматическое наследование вместе с сведениями о наследовании в каждом ACE определяет, как ограничения безопасности передаются по иерархии каталогов.

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

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

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

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

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           READ_CONTROL,               // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           OPEN_EXISTING,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

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

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           WRITE_OWNER | WRITE_DAC,    // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           CREATE_ALWAYS,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

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

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

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

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

Стандартные права доступа