Известно, что одним из важнейших компонентов системы безопасности ОС Windows является система контроля и управления
Для построения формальных моделей безопасности принято представлять ИС в виде совокупности взаимодействующих сущностей - субъектов (s) и объектов (o).
Защищаемые объекты Windows включают:
Помимо
Для того чтобы выяснить, в какой мере комбинация в виде управления дискреционным и ролевым доступом служит гарантией защиты для выполняемых программ, желательно иметь представление о формальных моделях, используемых при построении системы безопасности ОС Windows. Возможности формальных моделей проанализированы в приложении.
Основной вывод из анализа применяемых в ОС Windows моделей контроля доступа (комбинация дискреционной и ролевой): нельзя формально обосновать безопасность ИС в случаях, представляющих практический интерес. Необходимо обосновывать безопасность конкретной системы путем ее активного исследования.
Ключевая цель системы защиты Windows - следить за тем, кто и к каким объектам осуществляет доступ. Система защиты хранит информацию, относящуюся к безопасности для каждого пользователя, группы пользователей и объекта. Модель защиты ОС Windows требует, чтобы субъект на этапе открытия объекта указывал, какие операции он собирается выполнять в отношении этого объекта. Единообразие контроля доступа к различным объектам (процессам, файлам, семафорам и др.) обеспечивается тем, что с каждым процессом (потоком) связан маркер доступа, а с каждым объектом - дескриптор защиты. Маркер доступа в качестве параметра имеет идентификатор пользователя, а дескриптор защиты - списки прав доступа. ОС может контролировать попытки доступа, которые прямо или косвенно производятся процессами и потоками, инициированными пользователем.
ОС Windows отслеживает и контролирует доступ к разнообразным объектам системы (файлы, принтеры, процессы, именованные каналы и т.д.). Помимо разрешающих записей, списки прав доступа содержат и запрещающие записи, чтобы пользователь, которому доступ к объекту запрещен, не смог получить его как член какой-либо группы, которой этот доступ предоставлен.
Пользователи системы для упрощения администрирования (а также для соответствия стандарту POSIX) объединены в группы. Пользователей и группы иногда называют участниками безопасности. Пользователи посредством порождаемых ими субъектов (процессов, потоков) осуществляют доступ к объектам (файлам, устройствам и др.). Изучение модели контроля доступа ОС Windows целесообразно начать с анализа характеристик субъектов и объектов, которые существенны для организации
Прежде чем начать изучение API системы, имеет смысл сказать несколько слов об имеющихся полезных утилитах и инструментальных средствах.
Для управления системой безопасности в ОС Windows имеются разнообразные и удобные инструментальные средства. В частности, в рамках данной темы потребуется умение управлять учетными записями пользователей при помощи панели "Пользователи и пароли". Кроме того понадобится контролировать привилегии пользователей при помощи панели "Назначение прав пользователям". Рекомендуется также освоить работу с утилитой просмотра данных маркера доступа процесса WhoAmI.exe, утилитами просмотра и редактирования списков контроля доступа (cacls.exe, ShowACLs.exe, SubInACL,exe, SvcACL.exe), утилитой просмотра маркера доступа процесса PuList.exe и рядом других.
Обилие интерактивных средств не устраняет необходимости программного управления различными объектами в среде ОС Windows. Применение API системы позволяет лучше изучить ее особенности и создавать приложения, соответствующие сложным требованиям защиты. Примером могут служить различные сценарии ограничения доступа (применение ограниченных маркеров доступа, перевоплощение, создание объектов, не связанных с конкретным пользователем, и т.д.). Тем не менее, встроенные инструментальные возможности системы будут активно использоваться в качестве вспомогательных средств при разработке разнообразных программных приложений.
Каждый пользователь (и каждая группа пользователей) системы должен иметь учетную запись (account) в базе данных системы безопасности. Учетные записи идентифицируются именем пользователя и хранятся в базе данных SAM (Security HKLM/SAM реестра.
Учетная запись пользователя содержат набор сведений о пользователе, такие, как имя, пароль (или реквизиты), комментарии и адрес. Наиболее важными элементами учетной записи пользователя являются: список привилегий пользователя в отношении данной системы, список групп, в которых состоит пользователь, и идентификатор безопасности SID (
Учетные записи групп, созданные для упрощения администрирования, содержат список учетных записей пользователей, а также включают сведения, аналогичные сведениям учетной записи пользователя (SID группы, привилегии члена группы и др.).
Основным средством создания учетной записи пользователя служит Win32-функция , ).
Для успешного применения Net -функций достаточно знать следующее. Во-первых, Net -функции входят в состав библиотеки NetApi32.Lib, которую нужно явным образом добавить в проект, а прототипы функций объявлены в заголовочном файле Lm.h. Во-вторых, Net -функции поддерживают строки только в формате Unicode (см. лекцию 2). Наконец, информацию об учетной записи Net -функции нужно передавать с помощью специализированных структур, наименее сложная из которых структура USER_INFO_1.
Для иллюстрации рассмотрим несложную программу, задача которой - создать новую учетную запись для пользователя "ExpUser".
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <windows.h>
#include <lm.h>
BOOL CreateUser(PWSTR pszName, PWSTR pszPassword) {
USER_INFO_1 ui = {0};
NET_API_STATUS nStatus;
ui.usri1_name = pszName; // имя пользователя
ui.usri1_password = pszPassword; // пароль пользователя
ui.usri1_priv = USER_PRIV_USER; // обычный пользователь
nStatus = NetUserAdd(NULL, 1, (LPBYTE)ui, NULL);
return (nStatus == NERR_Success);
}
void main() {
if(!CreateUser(L"ExpUser", L"123"))
printf("A system error has occurred");
}
Результат работы программы - создание нового пользователя - можно проконтролировать при помощи апплета панели управления "Локальные пользователи". После создания пользователя целесообразно наделить его минимальным набором прав, например, правом входа в систему. Самое разумное - включить пользователя в какую-либо группу, например, в группу обычных пользователей. В этом случае вновь созданный пользователь получит привилегии члена данной группы. Это можно сделать при помощи того же апплета. О том, как обеспечить пользователя необходимыми привилегиями программным образом, будет рассказано ниже.
Для удаления учетной записи пользователя используется функция NetUserDel.
На основе предыдущей программы рекомендуется написать программу удаления учетной записи конкретного пользователя.
В заключение данного раздела хотелось бы еще раз подчеркнуть, что, хотя Net -функции позволяют работать с именами учетных записей, остальная часть системы для идентификации учетной записи использует идентификатор безопасности SID.
SID пользователя (и группы) является уникальным внутренним идентификатором и представляют собой структуру переменной длины с коротким заголовком, за которым следует длинное случайное число. Это числовое значение формируется из ряда параметров, причем утверждается , что вероятность появления двух одинаковых SID практически равна нулю. В частности, если удалить пользователя в системе, а затем создать его под тем же именем, то SID вновь созданного пользователя будет уже другим.
Узнать свой идентификатор безопасности пользователь легко может при помощи утилит whoami или getsid из ресурсов Windows. Например, так:
> whoami /user /sid
При помощи команды whoami /all можно получить всю информацию из маркера доступа процесса, см. следующие разделы.
Задание
Выполните следующую последовательность действий.
Система хранит идентификаторы безопасности в бинарной форме, однако существует и текстовая форма представления SID. Текстовая форма используется для вывода текущего значения SID, а также для интерактивного ввода (например, в реестр).
В текстовой форме каждый идентификатор безопасности имеет определенный формат. Вначале находится префикс S, за которым следует группа чисел, разделенных дефисами. Например, SID администратора системы имеет вид: S-1-5-<домен>-500, а SID группы everyone, в которую входят все пользователи, включая анонимных и гостей - S-1-1-0.
Поскольку структура SID имеет переменную длину, для копирования SID и преобразования его в текстовую форму и обратно рекомендуется прибегать к специальным функциям CopySID, ConvertSidToStringSid и ConvertStringSidToSid.
Чтобы получить бинарное значение SID по имени пользователя, нужно использовать функцию LookupAccountName. Обратная задача может быть решена при помощи функции LookupAccountSid.
В качестве иллюстрации рассмотрим несложную программу, задача которой - получение значения Sid для текущей учетной записи и преобразования его в текстовую форму.
#define _WIN32_WINNT 0x0500
#define UNICODE
#ifdef UNICODE
#define _UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
void main(void){
wchar_t UserName[256];
int MaxUserNameLength = 256;
SID Sid[1024];
PSID pSid;
LPTSTR StringSid;
DWORD SidSize=1024;
SID_NAME_USE SidType;
LPTSTR DomainName=NULL;
DWORD DomainNameSize=16; // длина имени домена
HANDLE hHeap;
hHeap = GetProcessHeap();
pSid = Sid[0];
GetUserName(UserName, MaxUserNameLength); // получаем имя пользователя
DomainName = (LPTSTR)HeapAlloc(hHeap,0,DomainNameSize * sizeof(TCHAR));
LookupAccountName(
NULL, // локальный компьютер
UserName, pSid, SidSize, DomainName,DomainNameSize,SidType);
if (!ConvertSidToStringSid(pSid, StringSid)) /* память для строки выделяет сама функция */
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
LocalFree(StringSid);
HeapFree(hHeap,0,DomainName);
}
В приведенной программе вначале формируются параметры вызова функции LookupAccountName. В частности, имя текущей учетной записи возвращает функция GetUserName(). Кроме того, необходимо выделить память для имени домена. Результирующее значение SID можно сравнить с тем, которое выдает утилита Whoami.exe.
На основе предыдущей программы рекомендуется написать программу, которая при помощи функции LookupAccountSid решает обратную задачу - позволяет выяснить имя владельца данного идентификатора безопасности.
В ОС Windows все типы объектов защищены одинаковым образом. С каждым объектом связан дескриптор защиты (security descriptor). Дескриптор защиты описывается структурой типа SECURITY_DESCRIPTOR и инициализируется функцией InitializeSecurityDescriptor.
Связь объекта с дескриптором происходит в момент создания объекта. Например, один из аргументов функции CreateFile - указатель на структуру SECURITY_ATTRIBUTES, которая содержит указатель на дескриптор защиты.
Дескриптор защиты (см. рис 13.1) содержит SID владельца объекта, SID групп для данного объекта и два указателя на списки
Структура каждого ACL списка проста. Это набор записей
(рис 13.1) Структура дескриптора защиты для файлаВ списке ACL есть записи
На примере, изображенном на рис 13.1,
Кроме списка
Задание. Сформировать список прав доступа для файла при помощи инструментальных средств ОС Windows.
Для установки прав доступа к файлу, находящемуся на NTFS разделе диска, нужно выбрать вкладку "Безопасность" апплета "Свойства", который возникает в Windows Explorer при нажатии на
Итак, дескриптор защиты имеет достаточно сложную структуру и его формирование выглядит непростой задачей. К счастью, в Windows есть стандартный механизм, назначающий доступ к объектам "по умолчанию", если приложение не позаботилось создать его явно. В таких случаях говорят, что объекту назначена стандартная защита. Примером может служить создание файла при помощи функции CreateFile, где параметру-указателю на структуру SECURITY_ATTRIBUTES присвоено значение NULL. Некоторые объекты используют только стандартную защиту (
Субъекты хранят информацию о стандартной защите, которая будет назначена создаваемым объектам, в своем маркере доступа (см. следующий раздел). Разумеется, в ОС Windows есть все необходимые средства для настройки стандартной защиты, в частности, списка
Основной источник информации о защите объекта - Win32-функция GetSecurityInfo, тогда как настройка защиты объекта может быть осуществлена при помощи функции SetSecurityInfo.
В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца файла из дескриптора
#define _WIN32_WINNT 0x0500
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
#include <Aclapi.h>
void main(void){
PSID pSid;
PSECURITY_DESCRIPTOR pSD;
PACL pDACL;
LPTSTR StringSid = NULL;
ULONG Error;
HANDLE hFile;
hFile = CreateFile(TEXT("MyFile.txt"), READ_CONTROL, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
Error = GetSecurityInfo(hFile,
SE_FILE_OBJECT, // тип объекта
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
pSid, // Sid владельца
NULL, // Sid группы
pDACL, NULL, // списки прав доступа
pSD // дескриптор защиты);
if(Error != ERROR_SUCCESS) printf("GetSecurityInfo Error\n");
if (!ConvertSidToStringSid(pSid, StringSid)) /* память для строки выделяет сама функция */
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
LocalFree(pSD);
LocalFree(StringSid);
}
Задача данной программы - открыть существующий файл MyFile.txt и применить функцию GetSecurityInfo для извлечения идентификатора безопасности владельца из дескриптора
На основе предыдущей программы рекомендуется написать программу, которая выводит на экран список прав доступа к обозначенному файлу.
Так же как и объекты, субъекты должны иметь отличительные признаки - контекст пользователя, для того, чтобы система могла контролировать их действия. Сведения о контексте пользователя хранятся в маркере (употребляются также термины "
Вслед за оболочкой (Windows Explorer) все процессы (а также все потоки процесса), запускаемые пользователем, наследуют этот маркер. Когда один процесс создает другой при помощи функции CreateProcess,
Основные компоненты маркера доступа показаны на рис 13.2.
(рис 13.2) Основные компоненты маркера доступаВключая в маркер информацию о защите, в частности,
Задание
Осуществить просмотр данных маркера доступа с помощью утилиты WhoAmi
Если процесс обладает правом TOKEN_QUERY доступа к объекту, то большую часть содержимого маркера можно считать при помощи функции GetTokenInformation. Чтобы получить описатель маркера, необходимо воспользоваться функцией OpenProcessToken.
В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца процесса из маркера доступа данного процесса.
#define _WIN32_WINNT 0x0500
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
void main(void){
DWORD TokenUserBufSize=256;
LPTSTR StringSid;
TOKEN_USER *ptUser;
HANDLE hHeap;
HANDLE hToken = NULL;
hHeap = GetProcessHeap();
ptUser = (TOKEN_USER *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, TokenUserBufSize);
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken))
printf("OpenProcessToken Error\n");
if (!GetTokenInformation(hToken, // описатель маркера доступа
TokenUser, // нужна информация о пользователе
ptUser, // буфер для информации
TokenUserBufSize, TokenUserBufSize))
printf("GetTokenInformation Error\n");;
if (!ConvertSidToStringSid(ptUser->User.Sid, StringSid))
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
CloseHandle(hToken);
LocalFree(StringSid);
HeapFree(hHeap,0,ptUser);
}
Задача данной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него идентификатора безопасности владельца. После чего идентификатор преобразуется в текстовую форму и выводится на экран.
В следующей лекции будет приведен пример программы получения из маркера доступа информации о привилегиях пользователя.
На основе предыдущей программы рекомендуется написать программу, которая выводит на экран список прав доступа "по умолчанию" для объектов, создаваемых данным процессом.
После формализации атрибутов защиты субъектов и объектов можно перечислить основные этапы проверки прав доступа , , , см. рис 13.3.
(рис 13.3) Пример проверки прав доступа к защищенному объектуЭтапов проверки довольно много. Наиболее важные этапы из них:
Очевидно, что для процедуры проверки важен порядок расположения
Подсистема защиты данных является одной из наиболее важных. В центре системы безопасности ОС Windows находится система контроля доступом. Реализованные модели дискреционного и ролевого доступа являются удобными и широко распространены, однако не позволяют формально обосновать безопасность приложений в ряде случаев, представляющих практический интерес. С каждым процессом или потоком, то есть, активным компонентом (субъектом), связан маркер доступа, а у каждого защищаемого объекта (например, файла) имеется дескриптор защиты. Проверка прав доступа обычно осуществляется в момент открытия объекта и заключается в сопоставлении прав субъекта списку прав доступа, который хранится в составе дескриптора защиты объекта.
Представление информационной системы как совокупности взаимодействующих сущностей - субъектов и объектов - является базовым представлением большинства формальных моделей. В защите нуждаются и объекты, и субъекты. В этом смысле субъект является частным случаем объекта. Иногда говорят, что субъект - это объект, который способен осуществлять преобразование данных и которому передано управление .
Применение формальной модели строится на присвоении субъектам и объектам идентификаторов и фиксации набора правил, позволяющих определить, имеет ли данный субъект авторизацию, достаточную для предоставления указанного типа доступа к данному объекту.
Применение данного подхода может быть проиллюстрировано следующим образом.
Имеется совокупность объектов {Oi}, субъектов {Si} и пользователей {Ui}. Вводится операция доступа {Si} -> {Oj}, под которой подразумевается использование i-м субъектом информации из j-го объекта. Основные варианты доступа: чтение, запись и активация процесса, записанного в объекте. В результате последней операции появляется новый субъект {Si} -> {Oj} -> {Sk}.
Во время загрузки создается ряд субъектов (системных процессов), и к их числу принадлежит оболочка Sshell, с помощью которой прошедшие аутентификацию пользователи могут создавать свои субъекты (запускать свои программы). При помощи выполняемых программ пользователи осуществляют доступ к объектам (например, осуществляют чтение файлов). В итоге деятельность такого пользователя может быть описана ориентированным графом доступа (см. рис 13.4).
(рис 13.4) Пример графа доступаМножество графов доступа можно рассматривать как фазовое пространство, а функционирование конкретной системы - как траекторию в фазовом пространстве. Защита информации может состоять в том, чтобы избегать "неблагоприятных" траекторий. Практически такое управление возможно только ограничением на доступ в каждый момент времени, или, как утверждается в известной "оранжевой" книге , все вопросы безопасности информации определяются описанием доступов субъектов к объектам.
Можно ввести также особый вид субъекта, который активизируется при каждом доступе и называется
Модели управления доступом регламентируют доступ субъектов к объектам. Наиболее распространена так называемая дискреционная (произвольная) модель, в которой обычные пользователи могут принимать участие в определении функций политики и присвоении атрибутов безопасности. Среди дискреционных моделей классической считается модель Харрисона-Руззо-Ульмана (см. ) - в ней система защиты представлена в виде набора множеств, элементами которых являются составные части системы защиты: субъекты, объекты, уровни доступа, операции и т.п.
С концептуальной точки зрения текущее состояние прав доступа при дискреционном управлении описывается матрицей (см. рис 13.5), в строках которой перечислены субъекты, в столбцах - объекты, а в ячейках - операции, которые субъект может выполнить над объектом. Операции зависят от объектов. Например, для файлов это операции чтения, записи, выполнения, изменения атрибутов, а для принтера - операции печати и управления. Поведение системы моделируется с помощью понятия состояния Q = (S,O,M), где S,O,M - соответственно текущие множества субъектов, объектов и текущее состояние матрицы доступа.
(рис 13.5) Пример матрицы доступаС учетом дискреционной модели можно следующим образом сформулировать задачу системы защиты информации. С точки зрения безопасности, поведение системы может моделироваться как последовательность состояний, описываемых совокупностью субъектов, объектов и матрицей доступа. Тогда можно утверждать, что для безопасности системы в состоянии Q0 не должно существовать последовательности команд, в результате которой право R будет занесено в ячейку памяти матрицы доступа M, где оно отсутствовало в состоянии Q0. (критерий Харрисона-Руззо-Ульмана). По существу необходимо ответить на вопрос: сможет ли некоторый субъект S когда-либо получить какие-либо права доступа к некоторому объекту O?
Очевидно, что для обеспечения безопасности необходимо наложить запрет на некоторые отношения доступа. Харрисон, Руззо и Ульман доказали, что в общем случае не существует алгоритма, который может для произвольной системы, ее начального состояния Q0 и общего права r решить, является ли данная конфигурация безопасной. Чтобы удовлетворить критерию безопасности в общем случае, в ИС должны отсутствовать некоторые операции создания и удаления сущностей, в результате чего эксплуатация подобной системы теряет практический смысл.
Таким образом, если не предпринимать специальных мер, система с
Очевидно, что для каждого субъекта S, активизированного в момент времени t, существует единственный активизированный субъект S', который активизировал субъект S. Поэтому можно, анализируя граф, подобный изображенному на рис 13.5, выявить единственного пользователя, от имени которого активизирован субъект S.
Соответственно, для любого объекта существует единственный пользователь, от имени которого активизирован субъект, создавший данный объект. Можно сказать, что этот пользователь породил данный объект, а также сформировал для него список прав доступа.
В этом случае схематичное изображение канала утечки в виде разрешенного доступа от имени разных пользователей к одному и тому же объекту будет выглядеть следующим образом:
Ui -> (Write)-> O, в момент времени t1 и Uj -> (Read)-> O в момент времени t2, где i≠j и t1 < t2,
Фактически это означает, что ничто не мешает легальному пользователю (например, вследствие программной ошибки) перебросить секретную информацию во вновь созданный объект, доступ к которому открыт всем желающим, или организовать
Итак, формальный анализ показывает, что безопасное использование систем с дискреционным контролем доступа предполагает наличие дополнительных защитных мер, а именно - тщательное проектирование и корректную реализацию системы защиты.
Другая возможность, предоставляемая ОС Windows - управление ролевым, в частности привилегированным доступом. Ролевая политика предназначена в первую очередь для упрощения администрирования информационных систем с большим числом пользователей и различных ресурсов.
В ролевой политике управление доступом осуществляется с помощью правил. Вначале для каждой роли указывается набор привилегий по отношению к системе и полномочий, представляющих набор прав доступа к объектам, и уже затем каждому пользователю назначается список доступных ему ролей. Классическое понятие субъект замещается понятиями пользователь и роль. Примером роли является присутствующая почти в каждой системе роль суперпользователя (группа Administrator для ОС Windows). Количество ролей обычно не соответствует количеству реальных пользователей - один пользователь может выполнять несколько ролей, и наоборот, несколько пользователей могут в рамках одной и той же роли выполнять типовую работу.
Таким образом, в рамках ролевой модели формируются близкие к реальной жизни правила контроля доступа и ограничения, соблюдение которых и служит критерием безопасности системы. Однако, как и в случае дискреционной модели, ролевая политика безопасности не гарантирует безопасность с помощью формальных доказательств.
Известно, что одним из важнейших компонентов системы безопасности ОС Windows является система контроля и управления
Для построения формальных моделей безопасности принято представлять ИС в виде совокупности взаимодействующих сущностей - субъектов (s) и объектов (o).
Защищаемые объекты Windows включают:
Помимо
Для того чтобы выяснить, в какой мере комбинация в виде управления дискреционным и ролевым доступом служит гарантией защиты для выполняемых программ, желательно иметь представление о формальных моделях, используемых при построении системы безопасности ОС Windows. Возможности формальных моделей проанализированы в приложении.
Основной вывод из анализа применяемых в ОС Windows моделей контроля доступа (комбинация дискреционной и ролевой): нельзя формально обосновать безопасность ИС в случаях, представляющих практический интерес. Необходимо обосновывать безопасность конкретной системы путем ее активного исследования.
Ключевая цель системы защиты Windows - следить за тем, кто и к каким объектам осуществляет доступ. Система защиты хранит информацию, относящуюся к безопасности для каждого пользователя, группы пользователей и объекта. Модель защиты ОС Windows требует, чтобы субъект на этапе открытия объекта указывал, какие операции он собирается выполнять в отношении этого объекта. Единообразие контроля доступа к различным объектам (процессам, файлам, семафорам и др.) обеспечивается тем, что с каждым процессом (потоком) связан маркер доступа, а с каждым объектом - дескриптор защиты. Маркер доступа в качестве параметра имеет идентификатор пользователя, а дескриптор защиты - списки прав доступа. ОС может контролировать попытки доступа, которые прямо или косвенно производятся процессами и потоками, инициированными пользователем.
ОС Windows отслеживает и контролирует доступ к разнообразным объектам системы (файлы, принтеры, процессы, именованные каналы и т.д.). Помимо разрешающих записей, списки прав доступа содержат и запрещающие записи, чтобы пользователь, которому доступ к объекту запрещен, не смог получить его как член какой-либо группы, которой этот доступ предоставлен.
Пользователи системы для упрощения администрирования (а также для соответствия стандарту POSIX) объединены в группы. Пользователей и группы иногда называют участниками безопасности. Пользователи посредством порождаемых ими субъектов (процессов, потоков) осуществляют доступ к объектам (файлам, устройствам и др.). Изучение модели контроля доступа ОС Windows целесообразно начать с анализа характеристик субъектов и объектов, которые существенны для организации
Прежде чем начать изучение API системы, имеет смысл сказать несколько слов об имеющихся полезных утилитах и инструментальных средствах.
Для управления системой безопасности в ОС Windows имеются разнообразные и удобные инструментальные средства. В частности, в рамках данной темы потребуется умение управлять учетными записями пользователей при помощи панели "Пользователи и пароли". Кроме того понадобится контролировать привилегии пользователей при помощи панели "Назначение прав пользователям". Рекомендуется также освоить работу с утилитой просмотра данных маркера доступа процесса WhoAmI.exe, утилитами просмотра и редактирования списков контроля доступа (cacls.exe, ShowACLs.exe, SubInACL,exe, SvcACL.exe), утилитой просмотра маркера доступа процесса PuList.exe и рядом других.
Обилие интерактивных средств не устраняет необходимости программного управления различными объектами в среде ОС Windows. Применение API системы позволяет лучше изучить ее особенности и создавать приложения, соответствующие сложным требованиям защиты. Примером могут служить различные сценарии ограничения доступа (применение ограниченных маркеров доступа, перевоплощение, создание объектов, не связанных с конкретным пользователем, и т.д.). Тем не менее, встроенные инструментальные возможности системы будут активно использоваться в качестве вспомогательных средств при разработке разнообразных программных приложений.
Каждый пользователь (и каждая группа пользователей) системы должен иметь учетную запись (account) в базе данных системы безопасности. Учетные записи идентифицируются именем пользователя и хранятся в базе данных SAM (Security HKLM/SAM реестра.
Учетная запись пользователя содержат набор сведений о пользователе, такие, как имя, пароль (или реквизиты), комментарии и адрес. Наиболее важными элементами учетной записи пользователя являются: список привилегий пользователя в отношении данной системы, список групп, в которых состоит пользователь, и идентификатор безопасности SID (
Учетные записи групп, созданные для упрощения администрирования, содержат список учетных записей пользователей, а также включают сведения, аналогичные сведениям учетной записи пользователя (SID группы, привилегии члена группы и др.).
Основным средством создания учетной записи пользователя служит Win32-функция , ).
Для успешного применения Net -функций достаточно знать следующее. Во-первых, Net -функции входят в состав библиотеки NetApi32.Lib, которую нужно явным образом добавить в проект, а прототипы функций объявлены в заголовочном файле Lm.h. Во-вторых, Net -функции поддерживают строки только в формате Unicode (см. лекцию 2). Наконец, информацию об учетной записи Net -функции нужно передавать с помощью специализированных структур, наименее сложная из которых структура USER_INFO_1.
Для иллюстрации рассмотрим несложную программу, задача которой - создать новую учетную запись для пользователя "ExpUser".
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <windows.h>
#include <lm.h>
BOOL CreateUser(PWSTR pszName, PWSTR pszPassword) {
USER_INFO_1 ui = {0};
NET_API_STATUS nStatus;
ui.usri1_name = pszName; // имя пользователя
ui.usri1_password = pszPassword; // пароль пользователя
ui.usri1_priv = USER_PRIV_USER; // обычный пользователь
nStatus = NetUserAdd(NULL, 1, (LPBYTE)ui, NULL);
return (nStatus == NERR_Success);
}
void main() {
if(!CreateUser(L"ExpUser", L"123"))
printf("A system error has occurred");
}
Результат работы программы - создание нового пользователя - можно проконтролировать при помощи апплета панели управления "Локальные пользователи". После создания пользователя целесообразно наделить его минимальным набором прав, например, правом входа в систему. Самое разумное - включить пользователя в какую-либо группу, например, в группу обычных пользователей. В этом случае вновь созданный пользователь получит привилегии члена данной группы. Это можно сделать при помощи того же апплета. О том, как обеспечить пользователя необходимыми привилегиями программным образом, будет рассказано ниже.
Для удаления учетной записи пользователя используется функция NetUserDel.
На основе предыдущей программы рекомендуется написать программу удаления учетной записи конкретного пользователя.
В заключение данного раздела хотелось бы еще раз подчеркнуть, что, хотя Net -функции позволяют работать с именами учетных записей, остальная часть системы для идентификации учетной записи использует идентификатор безопасности SID.
SID пользователя (и группы) является уникальным внутренним идентификатором и представляют собой структуру переменной длины с коротким заголовком, за которым следует длинное случайное число. Это числовое значение формируется из ряда параметров, причем утверждается , что вероятность появления двух одинаковых SID практически равна нулю. В частности, если удалить пользователя в системе, а затем создать его под тем же именем, то SID вновь созданного пользователя будет уже другим.
Узнать свой идентификатор безопасности пользователь легко может при помощи утилит whoami или getsid из ресурсов Windows. Например, так:
> whoami /user /sid
При помощи команды whoami /all можно получить всю информацию из маркера доступа процесса, см. следующие разделы.
Задание
Выполните следующую последовательность действий.
Система хранит идентификаторы безопасности в бинарной форме, однако существует и текстовая форма представления SID. Текстовая форма используется для вывода текущего значения SID, а также для интерактивного ввода (например, в реестр).
В текстовой форме каждый идентификатор безопасности имеет определенный формат. Вначале находится префикс S, за которым следует группа чисел, разделенных дефисами. Например, SID администратора системы имеет вид: S-1-5-<домен>-500, а SID группы everyone, в которую входят все пользователи, включая анонимных и гостей - S-1-1-0.
Поскольку структура SID имеет переменную длину, для копирования SID и преобразования его в текстовую форму и обратно рекомендуется прибегать к специальным функциям CopySID, ConvertSidToStringSid и ConvertStringSidToSid.
Чтобы получить бинарное значение SID по имени пользователя, нужно использовать функцию LookupAccountName. Обратная задача может быть решена при помощи функции LookupAccountSid.
В качестве иллюстрации рассмотрим несложную программу, задача которой - получение значения Sid для текущей учетной записи и преобразования его в текстовую форму.
#define _WIN32_WINNT 0x0500
#define UNICODE
#ifdef UNICODE
#define _UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
void main(void){
wchar_t UserName[256];
int MaxUserNameLength = 256;
SID Sid[1024];
PSID pSid;
LPTSTR StringSid;
DWORD SidSize=1024;
SID_NAME_USE SidType;
LPTSTR DomainName=NULL;
DWORD DomainNameSize=16; // длина имени домена
HANDLE hHeap;
hHeap = GetProcessHeap();
pSid = Sid[0];
GetUserName(UserName, MaxUserNameLength); // получаем имя пользователя
DomainName = (LPTSTR)HeapAlloc(hHeap,0,DomainNameSize * sizeof(TCHAR));
LookupAccountName(
NULL, // локальный компьютер
UserName, pSid, SidSize, DomainName,DomainNameSize,SidType);
if (!ConvertSidToStringSid(pSid, StringSid)) /* память для строки выделяет сама функция */
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
LocalFree(StringSid);
HeapFree(hHeap,0,DomainName);
}
В приведенной программе вначале формируются параметры вызова функции LookupAccountName. В частности, имя текущей учетной записи возвращает функция GetUserName(). Кроме того, необходимо выделить память для имени домена. Результирующее значение SID можно сравнить с тем, которое выдает утилита Whoami.exe.
На основе предыдущей программы рекомендуется написать программу, которая при помощи функции LookupAccountSid решает обратную задачу - позволяет выяснить имя владельца данного идентификатора безопасности.
В ОС Windows все типы объектов защищены одинаковым образом. С каждым объектом связан дескриптор защиты (security descriptor). Дескриптор защиты описывается структурой типа SECURITY_DESCRIPTOR и инициализируется функцией InitializeSecurityDescriptor.
Связь объекта с дескриптором происходит в момент создания объекта. Например, один из аргументов функции CreateFile - указатель на структуру SECURITY_ATTRIBUTES, которая содержит указатель на дескриптор защиты.
Дескриптор защиты (см. рис 13.1) содержит SID владельца объекта, SID групп для данного объекта и два указателя на списки
Структура каждого ACL списка проста. Это набор записей
(рис 13.1) Структура дескриптора защиты для файлаВ списке ACL есть записи
На примере, изображенном на рис 13.1,
Кроме списка
Задание. Сформировать список прав доступа для файла при помощи инструментальных средств ОС Windows.
Для установки прав доступа к файлу, находящемуся на NTFS разделе диска, нужно выбрать вкладку "Безопасность" апплета "Свойства", который возникает в Windows Explorer при нажатии на
Итак, дескриптор защиты имеет достаточно сложную структуру и его формирование выглядит непростой задачей. К счастью, в Windows есть стандартный механизм, назначающий доступ к объектам "по умолчанию", если приложение не позаботилось создать его явно. В таких случаях говорят, что объекту назначена стандартная защита. Примером может служить создание файла при помощи функции CreateFile, где параметру-указателю на структуру SECURITY_ATTRIBUTES присвоено значение NULL. Некоторые объекты используют только стандартную защиту (
Субъекты хранят информацию о стандартной защите, которая будет назначена создаваемым объектам, в своем маркере доступа (см. следующий раздел). Разумеется, в ОС Windows есть все необходимые средства для настройки стандартной защиты, в частности, списка
Основной источник информации о защите объекта - Win32-функция GetSecurityInfo, тогда как настройка защиты объекта может быть осуществлена при помощи функции SetSecurityInfo.
В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца файла из дескриптора
#define _WIN32_WINNT 0x0500
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
#include <Aclapi.h>
void main(void){
PSID pSid;
PSECURITY_DESCRIPTOR pSD;
PACL pDACL;
LPTSTR StringSid = NULL;
ULONG Error;
HANDLE hFile;
hFile = CreateFile(TEXT("MyFile.txt"), READ_CONTROL, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
Error = GetSecurityInfo(hFile,
SE_FILE_OBJECT, // тип объекта
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
pSid, // Sid владельца
NULL, // Sid группы
pDACL, NULL, // списки прав доступа
pSD // дескриптор защиты);
if(Error != ERROR_SUCCESS) printf("GetSecurityInfo Error\n");
if (!ConvertSidToStringSid(pSid, StringSid)) /* память для строки выделяет сама функция */
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
LocalFree(pSD);
LocalFree(StringSid);
}
Задача данной программы - открыть существующий файл MyFile.txt и применить функцию GetSecurityInfo для извлечения идентификатора безопасности владельца из дескриптора
На основе предыдущей программы рекомендуется написать программу, которая выводит на экран список прав доступа к обозначенному файлу.
Так же как и объекты, субъекты должны иметь отличительные признаки - контекст пользователя, для того, чтобы система могла контролировать их действия. Сведения о контексте пользователя хранятся в маркере (употребляются также термины "
Вслед за оболочкой (Windows Explorer) все процессы (а также все потоки процесса), запускаемые пользователем, наследуют этот маркер. Когда один процесс создает другой при помощи функции CreateProcess,
Основные компоненты маркера доступа показаны на рис 13.2.
(рис 13.2) Основные компоненты маркера доступаВключая в маркер информацию о защите, в частности,
Задание
Осуществить просмотр данных маркера доступа с помощью утилиты WhoAmi
Если процесс обладает правом TOKEN_QUERY доступа к объекту, то большую часть содержимого маркера можно считать при помощи функции GetTokenInformation. Чтобы получить описатель маркера, необходимо воспользоваться функцией OpenProcessToken.
В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца процесса из маркера доступа данного процесса.
#define _WIN32_WINNT 0x0500
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
void main(void){
DWORD TokenUserBufSize=256;
LPTSTR StringSid;
TOKEN_USER *ptUser;
HANDLE hHeap;
HANDLE hToken = NULL;
hHeap = GetProcessHeap();
ptUser = (TOKEN_USER *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, TokenUserBufSize);
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken))
printf("OpenProcessToken Error\n");
if (!GetTokenInformation(hToken, // описатель маркера доступа
TokenUser, // нужна информация о пользователе
ptUser, // буфер для информации
TokenUserBufSize, TokenUserBufSize))
printf("GetTokenInformation Error\n");;
if (!ConvertSidToStringSid(ptUser->User.Sid, StringSid))
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
CloseHandle(hToken);
LocalFree(StringSid);
HeapFree(hHeap,0,ptUser);
}
Задача данной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него идентификатора безопасности владельца. После чего идентификатор преобразуется в текстовую форму и выводится на экран.
В следующей лекции будет приведен пример программы получения из маркера доступа информации о привилегиях пользователя.
На основе предыдущей программы рекомендуется написать программу, которая выводит на экран список прав доступа "по умолчанию" для объектов, создаваемых данным процессом.
После формализации атрибутов защиты субъектов и объектов можно перечислить основные этапы проверки прав доступа , , , см. рис 13.3.
(рис 13.3) Пример проверки прав доступа к защищенному объектуЭтапов проверки довольно много. Наиболее важные этапы из них:
Очевидно, что для процедуры проверки важен порядок расположения
Подсистема защиты данных является одной из наиболее важных. В центре системы безопасности ОС Windows находится система контроля доступом. Реализованные модели дискреционного и ролевого доступа являются удобными и широко распространены, однако не позволяют формально обосновать безопасность приложений в ряде случаев, представляющих практический интерес. С каждым процессом или потоком, то есть, активным компонентом (субъектом), связан маркер доступа, а у каждого защищаемого объекта (например, файла) имеется дескриптор защиты. Проверка прав доступа обычно осуществляется в момент открытия объекта и заключается в сопоставлении прав субъекта списку прав доступа, который хранится в составе дескриптора защиты объекта.
Представление информационной системы как совокупности взаимодействующих сущностей - субъектов и объектов - является базовым представлением большинства формальных моделей. В защите нуждаются и объекты, и субъекты. В этом смысле субъект является частным случаем объекта. Иногда говорят, что субъект - это объект, который способен осуществлять преобразование данных и которому передано управление .
Применение формальной модели строится на присвоении субъектам и объектам идентификаторов и фиксации набора правил, позволяющих определить, имеет ли данный субъект авторизацию, достаточную для предоставления указанного типа доступа к данному объекту.
Применение данного подхода может быть проиллюстрировано следующим образом.
Имеется совокупность объектов {Oi}, субъектов {Si} и пользователей {Ui}. Вводится операция доступа {Si} -> {Oj}, под которой подразумевается использование i-м субъектом информации из j-го объекта. Основные варианты доступа: чтение, запись и активация процесса, записанного в объекте. В результате последней операции появляется новый субъект {Si} -> {Oj} -> {Sk}.
Во время загрузки создается ряд субъектов (системных процессов), и к их числу принадлежит оболочка Sshell, с помощью которой прошедшие аутентификацию пользователи могут создавать свои субъекты (запускать свои программы). При помощи выполняемых программ пользователи осуществляют доступ к объектам (например, осуществляют чтение файлов). В итоге деятельность такого пользователя может быть описана ориентированным графом доступа (см. рис 13.4).
(рис 13.4) Пример графа доступаМножество графов доступа можно рассматривать как фазовое пространство, а функционирование конкретной системы - как траекторию в фазовом пространстве. Защита информации может состоять в том, чтобы избегать "неблагоприятных" траекторий. Практически такое управление возможно только ограничением на доступ в каждый момент времени, или, как утверждается в известной "оранжевой" книге , все вопросы безопасности информации определяются описанием доступов субъектов к объектам.
Можно ввести также особый вид субъекта, который активизируется при каждом доступе и называется
Модели управления доступом регламентируют доступ субъектов к объектам. Наиболее распространена так называемая дискреционная (произвольная) модель, в которой обычные пользователи могут принимать участие в определении функций политики и присвоении атрибутов безопасности. Среди дискреционных моделей классической считается модель Харрисона-Руззо-Ульмана (см. ) - в ней система защиты представлена в виде набора множеств, элементами которых являются составные части системы защиты: субъекты, объекты, уровни доступа, операции и т.п.
С концептуальной точки зрения текущее состояние прав доступа при дискреционном управлении описывается матрицей (см. рис 13.5), в строках которой перечислены субъекты, в столбцах - объекты, а в ячейках - операции, которые субъект может выполнить над объектом. Операции зависят от объектов. Например, для файлов это операции чтения, записи, выполнения, изменения атрибутов, а для принтера - операции печати и управления. Поведение системы моделируется с помощью понятия состояния Q = (S,O,M), где S,O,M - соответственно текущие множества субъектов, объектов и текущее состояние матрицы доступа.
(рис 13.5) Пример матрицы доступаС учетом дискреционной модели можно следующим образом сформулировать задачу системы защиты информации. С точки зрения безопасности, поведение системы может моделироваться как последовательность состояний, описываемых совокупностью субъектов, объектов и матрицей доступа. Тогда можно утверждать, что для безопасности системы в состоянии Q0 не должно существовать последовательности команд, в результате которой право R будет занесено в ячейку памяти матрицы доступа M, где оно отсутствовало в состоянии Q0. (критерий Харрисона-Руззо-Ульмана). По существу необходимо ответить на вопрос: сможет ли некоторый субъект S когда-либо получить какие-либо права доступа к некоторому объекту O?
Очевидно, что для обеспечения безопасности необходимо наложить запрет на некоторые отношения доступа. Харрисон, Руззо и Ульман доказали, что в общем случае не существует алгоритма, который может для произвольной системы, ее начального состояния Q0 и общего права r решить, является ли данная конфигурация безопасной. Чтобы удовлетворить критерию безопасности в общем случае, в ИС должны отсутствовать некоторые операции создания и удаления сущностей, в результате чего эксплуатация подобной системы теряет практический смысл.
Таким образом, если не предпринимать специальных мер, система с
Очевидно, что для каждого субъекта S, активизированного в момент времени t, существует единственный активизированный субъект S', который активизировал субъект S. Поэтому можно, анализируя граф, подобный изображенному на рис 13.5, выявить единственного пользователя, от имени которого активизирован субъект S.
Соответственно, для любого объекта существует единственный пользователь, от имени которого активизирован субъект, создавший данный объект. Можно сказать, что этот пользователь породил данный объект, а также сформировал для него список прав доступа.
В этом случае схематичное изображение канала утечки в виде разрешенного доступа от имени разных пользователей к одному и тому же объекту будет выглядеть следующим образом:
Ui -> (Write)-> O, в момент времени t1 и Uj -> (Read)-> O в момент времени t2, где i≠j и t1 < t2,
Фактически это означает, что ничто не мешает легальному пользователю (например, вследствие программной ошибки) перебросить секретную информацию во вновь созданный объект, доступ к которому открыт всем желающим, или организовать
Итак, формальный анализ показывает, что безопасное использование систем с дискреционным контролем доступа предполагает наличие дополнительных защитных мер, а именно - тщательное проектирование и корректную реализацию системы защиты.
Другая возможность, предоставляемая ОС Windows - управление ролевым, в частности привилегированным доступом. Ролевая политика предназначена в первую очередь для упрощения администрирования информационных систем с большим числом пользователей и различных ресурсов.
В ролевой политике управление доступом осуществляется с помощью правил. Вначале для каждой роли указывается набор привилегий по отношению к системе и полномочий, представляющих набор прав доступа к объектам, и уже затем каждому пользователю назначается список доступных ему ролей. Классическое понятие субъект замещается понятиями пользователь и роль. Примером роли является присутствующая почти в каждой системе роль суперпользователя (группа Administrator для ОС Windows). Количество ролей обычно не соответствует количеству реальных пользователей - один пользователь может выполнять несколько ролей, и наоборот, несколько пользователей могут в рамках одной и той же роли выполнять типовую работу.
Таким образом, в рамках ролевой модели формируются близкие к реальной жизни правила контроля доступа и ограничения, соблюдение которых и служит критерием безопасности системы. Однако, как и в случае дискреционной модели, ролевая политика безопасности не гарантирует безопасность с помощью формальных доказательств.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.