Основы организации операционных систем Microsoft Windows

Отдельные аспекты безопасности Windows

Разбить на страницы
Показывать лекцию целиком

Аутентификация пользователя. Вход в систему

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

Согласно п.1 политики безопасности для доступа к компьютеру пользователь должен пройти процедуру аутентификации. Эта процедура инициируется комбинацией клавиш "ctrl+alt+del". Данная комбинация клавиш, известная как SAS (secure attention sequence), всегда перехватывается драйвером клавиатуры, который вызывает при этом настоящую (а не троянского коня) программу аутентификации. Пользовательский процесс не может сам перехватить эту комбинацию клавиш или отменить ее обработку драйвером. Говоря языком стандартов, можно сказать, что в системе реализована функциональность пути доверительных отношений (trusted path functionality). Данная особенность также отвечает требованиям защиты уровня B Оранжевой книги.

Процедурой аутентификации пользователя в системе управляет программа, WinLogon, представляющая собой начальную интерактивную процедуру, которая отображает начальный диалог с пользователем на экране. Процесс WinLogon активно взаимодействует с библиотекой GINA (Graphic Identification aNd Authentication - графической библиотекой идентификации и аутентификации). Библиотека GINA является заменяемым компонентом, интерфейс с ней хорошо документирован, поэтому иногда в приложениях, реализующих защиту, присутствует версия GINA, отличная от оригинальной. Получив имя и пароль пользователя от GINA, WinLogon вызывает модуль Lsass для аутентификации этого пользователя. В случае успешного входа в систему Winlogon извлекает из реестра профиль пользователя и определяет тип запускаемой оболочки.

Комбинация SAS может быть получена системой не только на этапе регистрации пользователя. Если пользователь уже вошел в систему, то после нажатия клавиш "ctrl-alt-del" он получает возможность: посмотреть список активных процессов, инициировать перезагрузку или выключение компьютера, изменить свой пароль и заблокировать рабочую станцию. В свою очередь, если рабочая станция заблокирована, то после ввода SAS пользователь имеет возможность ее разблокировки. Иногда может быть осуществлен принудительный вывод пользователя из системы с последующим входом в нее администратора.

В процессе аутентификации вызывается системная функция LogonUser (см. MSDN), которая исходя из имени пользователя, его пароля и имени рабочей станции или домена возвращает указатель на маркер доступа пользователя. Маркер впоследствии передается всем дочерним процессам. При формировании маркера используются ключи SECURITY и SAM реестра. Первый ключ определяет общую политику безопасности, а второй ключ содержит информацию о защите для индивидуальных пользователей.

Задание

Рекомендуется осуществить ввод комбинации клавиш "ctrl-alt-del" в разных ситуациях и инициировать одно из перечисленных выше действий.

Написание, компиляция и прогон программы создания нового пользователя с правами входа в систему

Напишите программу, которая создает новую учетную запись при помощи функции NetUserAdd, а затем назначает ему право входа в систему SeInteractiveLogonRight путем вызова функции LsaAddAccountRights. В случае успешной реализации сделайте попытку регистрации в системе в качестве нового пользователя.

Написание, компиляция и прогон программы получения маркера доступа по имени пользователя и его паролю

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

Выявление вторжений. Аудит системы защиты

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

Аудит, таким образом, заключается в регистрации специальных данных о различных типах событий, происходящих в системе и так или иначе влияющих на состояние безопасности компьютерной системы. К числу таких событий обычно причисляют следующие:

  • вход или выход из системы;
  • операции с файлами (открыть, закрыть, переименовать, удалить);
  • обращение к удаленной системе;
  • смена привилегий или иных атрибутов безопасности (режима доступа, уровня благонадежности пользователя и т.п.).
  • Событие аудита в ОС Windows может быть сгенерировано пользовательским приложением, диспетчером объектов или другим кодом режима ядра. Чтобы инициировать фиксацию событий, связанных с доступом к объекту, необходимо сформировать в дескрипторе безопасности этого объекта список SACL, в котором перечислены пользователи, чьи попытки доступа к данному объекту подлежат аудиту. Это можно сделать программно, а также при помощи инструментальных средств системы.

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

    Задание. Организовать аудит доступа к файлу с помощью инструментальных средств ОС Windows

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

  • Открыть диалоговое окно "Локальные параметры политики безопасности\ Политика аудита" (см. рис 15.1) административной консоли панели управления.(рис 15.1) Диалоговое окно "Локальные параметры политики безопасности\ Политика аудита" административной консоли панели управления
  • Включить в список проверки нужную совокупность событий, например, аудит доступа к объектам.
  • С помощью программы Windows Explorer выбрать файл для аудита. Вызвать панель фиксации событий, которые связаны с файлом, подлежащим аудиту. Для этого при помощи мыши в контекстном меню открыть окно "Свойства", выбрать вкладку "Безопасность", затем, нажав кнопку "Дополнительно", выбрать "Аудит". Затем с помощью кнопки "Добавить" выбрать пользователя, действия которого подлежат аудиту, и перечень событий, подлежащих аудиту (см. рис 15.2).(рис 15.2) Диалоговое окно установки событий, подлежащих аудиту для конкретного файла
  • В случае успеха попробовать осуществить обращение к данному файлу. Все оговоренные действия в отношении файла должны найти отражение в журнале событий безопасности. Для просмотра журнала событий нужно выбрать окно "Просмотр событий" через иконку "Администрирование" панели управления.
  • В случае отказа проверить наличие у пользователя (в том числе и у администратора), от имени которого производится эксперимент, привилегии "Создание журналов безопасности" и, в случае ее отсутствия, назначить ее пользователю с помощью консоли "Назначение прав пользователям".
  • Как уже говорилось, список SACL, входящий в состав дескриптора защиты объекта, можно формировать и модифицировать программными средствами. Это можно сделать с помощью функции SetSecurityInfo, которая является обратной по отношению к уже знакомой нам функции GetSecurutyInfo и содержит тот же набор параметров. Поскольку речь идет об аудите, то параметр SecurityInfo, который специфицирует компонент дескриптора защиты, подлежащий изменению, должен включать значение SACL_SECURITY_INFORMATION.

    Недопустимость повторного использования объектов

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

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

    В ОС Windows гарантируется безопасность повторного использования областей физической памяти. Согласно , если пользовательскому процессу понадобилась свободная страница памяти, она может быть выделена только из списка обнуленных страниц базы данных PFN (см. раздел, связанный с работой менеджера памяти). Если этот список пуст, страница берется из списка свободных страниц и заполняется нулями. Если и этот список пуст, диспетчер памяти извлекает страницу из списка простаивающих (standby) страниц и обнуляет ее. Необнуленная страница передается только для отображения проецируемого файла. В этом случае фрейм необнуленной страницы инициализируется данными с диска.

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

    Защита от внешнего навязывания

    В соответствии с политикой безопасности операционная система должна защищать себя от внешнего влияния или навязывания, такого, как модификация загруженной системы или системных файлов, хранимых на диске. Чтобы удовлетворить требованиям политики безопасности, в ОС Windows встроены средства защиты файлов (Windows File Protection, WFP), которые защищают системные файлы даже от изменений со стороны пользователя с административными правами. В основе защиты лежат средства фиксации изменений в системных файлах (см. лекцию 12 ). Данная мера, безусловно, повышает стабильность системы.

    Согласно документации, мониторингу и защите подлежат все поставляемые в составе ОС файлы с расширениями sys, dll, exe и ocx, а также некоторые шрифты TrueType (Micros.ttf, Tahoma.ttf и Tahomabd.ttf). Если выясняется, что файл подменен, он заменяется копией из каталога %systemroot%\system32\dllcache, на который указывает одна из записей в реестре. Если размер места, выделенного для этого каталога, не достаточен, то в нем сохраняются копии не всех системных файлов. В тех случаях, когда делается попытка удаления системного файла и при этом его не оказывается в каталоге dllcache, система пытается восстановить его с установочного компакт-диска ОС Windows или из сетевых ресурсов.

    Кроме того, администратор системы с помощью утилиты Sfc.exe (system file checker) может осуществить проверку корректности версии всех системных файлов. Сведения о файлах с некорректным номером версии заносятся в протокол. Корректность системных файлов проверяется с помощью механизма электронной подписи и к неподписанным файлам следует относиться с осторожностью. Для проверки подписи и выявления неподписанных файлов служит штатная утилита SigVerif.exe.

    Задание. Попробуйте удалить какой-либо системный файл из каталога Windows\system32, например, sol.exe (игра "косынка").

    Маркер доступа. Контекст пользователя

    Как уже говорилось, наиболее важной характеристикой субъекта является маркер доступа. Обычно маркер создается при интерактивном входе пользователя в систему и хранит сведения о контексте пользователя. Вначале маркер связывается с процессом-оболочкой Windows Explorer, а затем все процессы, порожденные пользователем во время сеанса работы, получают дубликат данного маркера. Важно понимать, что самостоятельно создать маркер пользовательское приложение не может. Это может сделать только служба Lsass.

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

    Для безопасной работы в духе принципа минимума привилегий ОС Windows поддерживает механизмы создания маркеров с ограниченными привилегиями и заимствования маркера. Первый позволяет изъять из маркера определенные привилегии, наличие которых при выполнении данной операции не нужно, а второй разрешает запускать приложения от имени другой учетной записи. API системы позволяет влиять на перечень действующих привилегий маркера, дублировать маркер, чтобы его мог заимствовать другой процесс, решать проблемы перевоплощения и создания ограниченных маркеров

    Считывание сведений о привилегиях пользователя из маркера доступа

    В предыдущих лекциях описаны привилегии пользователя (раздел "ролевой доступ") и основные функции для считывания информации из маркера ( OpenProcessToken, GetTokenInformation ) в разделе "субъекты". Для получения списка привилегий из маркера при помощи функции GetTokenInformation нужно для параметра TokenInformationClass, выбрать значение TokenPrivileges. Ранее мы уже получали перечень привилегий учетной записи. Перечень привилегий, входящих в состав маркера, существенно шире, поскольку включает в себя привилегии пользователя и привилегии групп, в состав которых входит пользователь.

    Прогон программы получения списка привилегий из маркера доступа процесса

    В качестве примера рассмотрим программу, задача которой - получение перечня привилегий пользователя и его групп из маркера доступа данного процесса.

    #include <windows.h>
    #include <stdio.h>
    #pragma hdrstop
    
    void main()
    {
     HANDLE hToken;
     LUID setcbnameValue;
     TOKEN_PRIVILEGES tkp;
     DWORD errcod;
     LPVOID lpMsgBuf;
     LPCTSTR msgptr;
    
     UCHAR InfoBuffer[1000];
     PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES) InfoBuffer;
     DWORD dwInfoBufferSize;
     DWORD dwPrivilegeNameSize;
     DWORD dwDisplayNameSize;
     UCHAR ucPrivilegeName[500];
     UCHAR ucDisplayName[500];
     DWORD dwLangId;
     UINT i;
    
     if ( ! OpenProcessToken( GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, hToken ) )
     {
      puts( "OpenProcessToken" );
      return;
     }
    
     GetTokenInformation( hToken, TokenPrivileges, InfoBuffer,
      sizeof InfoBuffer, dwInfoBufferSize);
    
     printf( "Account privileges: \n\n" );
     for( i = 0; i < ptgPrivileges->PrivilegeCount; i ++ )
     {
      dwPrivilegeNameSize = sizeof ucPrivilegeName;
      dwDisplayNameSize = sizeof ucDisplayName;
      LookupPrivilegeName( NULL, ptgPrivileges->Privileges[i].Luid,
       (char *)ucPrivilegeName, dwPrivilegeNameSize );
      LookupPrivilegeDisplayName( NULL, (char *)ucPrivilegeName,
       (char *)ucDisplayName, dwDisplayNameSize, dwLangId );
      printf( "%s   (%s)\n", ucPrivilegeName, ucDisplayName);
     }
    
    }

    Задача приведенной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него списка привилегий. Функция LookupPrivilegeName позволяет получить программное имя привилегии по ее локальному идентификатору (Luid), а функция LookupPrivilegeDisplayName преобразует программное имя привилегии в дружественное имя.

    Включение и отключение привилегий в маркере

    Большую часть информации в маркере менять нельзя. Например, нельзя ни добавить, ни удалить привилегию. Согласно , , возможность добавления привилегий в маркер представляла бы собой "глубокий подкоп под систему защиты Windows". Последнее означает, что изменение привилегий субъекта - прерогатива подсистемы локальной авторизации (LSA) и должно осуществляться централизовано только при помощи функций семейства LSA (см. лекцию 14).

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

    Перевоплощение

    В ОС Windows имеются интересные возможности выполнения кода с маркером, отличным от маркера данного процесса. Это, например, существенно для серверов, которые должны выступать от имени и с привилегиями клиентов. Одна из таких возможностей - запуск нового процесса с указанным маркером при помощи функции CreateProcessAsUser. Эта функция является аналогом функции CreateProcess за исключением параметра hToken, который указывает на маркер, определяющий контекст пользователя нового процесса.

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

    Windows не позволяет серверам выступать в роли клиентов без их ведома. Чтобы избежать этого, клиентский процесс может ограничить уровень имперсонации. Поэтому для участия в перевоплощении маркер должен иметь соответствующий уровень перевоплощения. Этот уровень определяется параметром маркера TokenImpersonationLevel и может быть запрошен функцией GetTokenInformation. Для процесса перевоплощения важно, чтобы этот параметр имел значение не ниже SecurityImpersonation, что означает возможность имперсонации на локальной машине. Значение SecurityDelegation позволяет серверному процессу выступать от имени клиента, как на локальном, так и на удаленном компьютере. Последнее значение имеет отношение к делегированию, которое является естественным развитием перевоплощения, но работает только при наличии домена и функционировании активного каталога. По умолчанию устанавливается уровень SecurityImpersonation.

    Маркер перевоплощения обычно создают путем дублирования существующего маркера и придания ему нужных прав доступа и уровня имперсонации. Это можно сделать при помощи функции DuplicateTokenEx. Собственно перевоплощение осуществляется при помощи функции ImpersonateLoggedOnUser. Чтобы вернуться в исходное состояние, поток должен вызвать функцию RevertToSelf.

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

    Прогон программы заимствования маркера доступа и получения из него нужной информации

    В качестве "сложного" упражнения рекомендуется написать программу, задача которой - создать маркер доступа с нужным уровнем перевоплощения для указанной учетной записи и передать его текущему процессу. Затем для контроля нужно вывести на экран основные характеристики этого (уже ставшего текущим) маркера, например, перечень привилегий, после чего вернуть значение текущего маркера к исходному и извлечь из него привилегии еще раз.

    Другие возможности настройки контекста пользователя

    В ОС Windows имеются и другие возможности настройки контекста пользователя в соответствии со сложными требованиями защиты с учетом принципа минимума привилегий. В качестве примера можно упомянуть схему контроля доступа при помощи маркеров, называемых ограниченными. Ограниченные маркеры создаются функцией CreateRestrictedToken. В этот маркер в момент его создания можно внести следующие изменения: удалить привилегии, отключить некоторые SID-идентификаторы и добавить "ограниченные" SID'ы учетных записей. Последние просто добавляют ряд новых проверок к уже существующим при организации доступа к объекту. Ограниченные маркеры удобны, когда приложение подменяет клиента при выполнении кода, способного нанести ущерб системе.

    Заключение

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

    Страницы:

    Аутентификация пользователя. Вход в систему

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

    Согласно п.1 политики безопасности для доступа к компьютеру пользователь должен пройти процедуру аутентификации. Эта процедура инициируется комбинацией клавиш "ctrl+alt+del". Данная комбинация клавиш, известная как SAS (secure attention sequence), всегда перехватывается драйвером клавиатуры, который вызывает при этом настоящую (а не троянского коня) программу аутентификации. Пользовательский процесс не может сам перехватить эту комбинацию клавиш или отменить ее обработку драйвером. Говоря языком стандартов, можно сказать, что в системе реализована функциональность пути доверительных отношений (trusted path functionality). Данная особенность также отвечает требованиям защиты уровня B Оранжевой книги.

    Процедурой аутентификации пользователя в системе управляет программа, WinLogon, представляющая собой начальную интерактивную процедуру, которая отображает начальный диалог с пользователем на экране. Процесс WinLogon активно взаимодействует с библиотекой GINA (Graphic Identification aNd Authentication - графической библиотекой идентификации и аутентификации). Библиотека GINA является заменяемым компонентом, интерфейс с ней хорошо документирован, поэтому иногда в приложениях, реализующих защиту, присутствует версия GINA, отличная от оригинальной. Получив имя и пароль пользователя от GINA, WinLogon вызывает модуль Lsass для аутентификации этого пользователя. В случае успешного входа в систему Winlogon извлекает из реестра профиль пользователя и определяет тип запускаемой оболочки.

    Комбинация SAS может быть получена системой не только на этапе регистрации пользователя. Если пользователь уже вошел в систему, то после нажатия клавиш "ctrl-alt-del" он получает возможность: посмотреть список активных процессов, инициировать перезагрузку или выключение компьютера, изменить свой пароль и заблокировать рабочую станцию. В свою очередь, если рабочая станция заблокирована, то после ввода SAS пользователь имеет возможность ее разблокировки. Иногда может быть осуществлен принудительный вывод пользователя из системы с последующим входом в нее администратора.

    В процессе аутентификации вызывается системная функция LogonUser (см. MSDN), которая исходя из имени пользователя, его пароля и имени рабочей станции или домена возвращает указатель на маркер доступа пользователя. Маркер впоследствии передается всем дочерним процессам. При формировании маркера используются ключи SECURITY и SAM реестра. Первый ключ определяет общую политику безопасности, а второй ключ содержит информацию о защите для индивидуальных пользователей.

    Задание

    Рекомендуется осуществить ввод комбинации клавиш "ctrl-alt-del" в разных ситуациях и инициировать одно из перечисленных выше действий.

    Написание, компиляция и прогон программы создания нового пользователя с правами входа в систему

    Напишите программу, которая создает новую учетную запись при помощи функции NetUserAdd, а затем назначает ему право входа в систему SeInteractiveLogonRight путем вызова функции LsaAddAccountRights. В случае успешной реализации сделайте попытку регистрации в системе в качестве нового пользователя.

    Написание, компиляция и прогон программы получения маркера доступа по имени пользователя и его паролю

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

    Выявление вторжений. Аудит системы защиты

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

    Аудит, таким образом, заключается в регистрации специальных данных о различных типах событий, происходящих в системе и так или иначе влияющих на состояние безопасности компьютерной системы. К числу таких событий обычно причисляют следующие:

  • вход или выход из системы;
  • операции с файлами (открыть, закрыть, переименовать, удалить);
  • обращение к удаленной системе;
  • смена привилегий или иных атрибутов безопасности (режима доступа, уровня благонадежности пользователя и т.п.).
  • Событие аудита в ОС Windows может быть сгенерировано пользовательским приложением, диспетчером объектов или другим кодом режима ядра. Чтобы инициировать фиксацию событий, связанных с доступом к объекту, необходимо сформировать в дескрипторе безопасности этого объекта список SACL, в котором перечислены пользователи, чьи попытки доступа к данному объекту подлежат аудиту. Это можно сделать программно, а также при помощи инструментальных средств системы.

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

    Задание. Организовать аудит доступа к файлу с помощью инструментальных средств ОС Windows

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

  • Открыть диалоговое окно "Локальные параметры политики безопасности\ Политика аудита" (см. рис 15.1) административной консоли панели управления.(рис 15.1) Диалоговое окно "Локальные параметры политики безопасности\ Политика аудита" административной консоли панели управления
  • Включить в список проверки нужную совокупность событий, например, аудит доступа к объектам.
  • С помощью программы Windows Explorer выбрать файл для аудита. Вызвать панель фиксации событий, которые связаны с файлом, подлежащим аудиту. Для этого при помощи мыши в контекстном меню открыть окно "Свойства", выбрать вкладку "Безопасность", затем, нажав кнопку "Дополнительно", выбрать "Аудит". Затем с помощью кнопки "Добавить" выбрать пользователя, действия которого подлежат аудиту, и перечень событий, подлежащих аудиту (см. рис 15.2).(рис 15.2) Диалоговое окно установки событий, подлежащих аудиту для конкретного файла
  • В случае успеха попробовать осуществить обращение к данному файлу. Все оговоренные действия в отношении файла должны найти отражение в журнале событий безопасности. Для просмотра журнала событий нужно выбрать окно "Просмотр событий" через иконку "Администрирование" панели управления.
  • В случае отказа проверить наличие у пользователя (в том числе и у администратора), от имени которого производится эксперимент, привилегии "Создание журналов безопасности" и, в случае ее отсутствия, назначить ее пользователю с помощью консоли "Назначение прав пользователям".
  • Как уже говорилось, список SACL, входящий в состав дескриптора защиты объекта, можно формировать и модифицировать программными средствами. Это можно сделать с помощью функции SetSecurityInfo, которая является обратной по отношению к уже знакомой нам функции GetSecurutyInfo и содержит тот же набор параметров. Поскольку речь идет об аудите, то параметр SecurityInfo, который специфицирует компонент дескриптора защиты, подлежащий изменению, должен включать значение SACL_SECURITY_INFORMATION.

    Недопустимость повторного использования объектов

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

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

    В ОС Windows гарантируется безопасность повторного использования областей физической памяти. Согласно , если пользовательскому процессу понадобилась свободная страница памяти, она может быть выделена только из списка обнуленных страниц базы данных PFN (см. раздел, связанный с работой менеджера памяти). Если этот список пуст, страница берется из списка свободных страниц и заполняется нулями. Если и этот список пуст, диспетчер памяти извлекает страницу из списка простаивающих (standby) страниц и обнуляет ее. Необнуленная страница передается только для отображения проецируемого файла. В этом случае фрейм необнуленной страницы инициализируется данными с диска.

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

    Защита от внешнего навязывания

    В соответствии с политикой безопасности операционная система должна защищать себя от внешнего влияния или навязывания, такого, как модификация загруженной системы или системных файлов, хранимых на диске. Чтобы удовлетворить требованиям политики безопасности, в ОС Windows встроены средства защиты файлов (Windows File Protection, WFP), которые защищают системные файлы даже от изменений со стороны пользователя с административными правами. В основе защиты лежат средства фиксации изменений в системных файлах (см. лекцию 12 ). Данная мера, безусловно, повышает стабильность системы.

    Согласно документации, мониторингу и защите подлежат все поставляемые в составе ОС файлы с расширениями sys, dll, exe и ocx, а также некоторые шрифты TrueType (Micros.ttf, Tahoma.ttf и Tahomabd.ttf). Если выясняется, что файл подменен, он заменяется копией из каталога %systemroot%\system32\dllcache, на который указывает одна из записей в реестре. Если размер места, выделенного для этого каталога, не достаточен, то в нем сохраняются копии не всех системных файлов. В тех случаях, когда делается попытка удаления системного файла и при этом его не оказывается в каталоге dllcache, система пытается восстановить его с установочного компакт-диска ОС Windows или из сетевых ресурсов.

    Кроме того, администратор системы с помощью утилиты Sfc.exe (system file checker) может осуществить проверку корректности версии всех системных файлов. Сведения о файлах с некорректным номером версии заносятся в протокол. Корректность системных файлов проверяется с помощью механизма электронной подписи и к неподписанным файлам следует относиться с осторожностью. Для проверки подписи и выявления неподписанных файлов служит штатная утилита SigVerif.exe.

    Задание. Попробуйте удалить какой-либо системный файл из каталога Windows\system32, например, sol.exe (игра "косынка").

    Маркер доступа. Контекст пользователя

    Как уже говорилось, наиболее важной характеристикой субъекта является маркер доступа. Обычно маркер создается при интерактивном входе пользователя в систему и хранит сведения о контексте пользователя. Вначале маркер связывается с процессом-оболочкой Windows Explorer, а затем все процессы, порожденные пользователем во время сеанса работы, получают дубликат данного маркера. Важно понимать, что самостоятельно создать маркер пользовательское приложение не может. Это может сделать только служба Lsass.

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

    Для безопасной работы в духе принципа минимума привилегий ОС Windows поддерживает механизмы создания маркеров с ограниченными привилегиями и заимствования маркера. Первый позволяет изъять из маркера определенные привилегии, наличие которых при выполнении данной операции не нужно, а второй разрешает запускать приложения от имени другой учетной записи. API системы позволяет влиять на перечень действующих привилегий маркера, дублировать маркер, чтобы его мог заимствовать другой процесс, решать проблемы перевоплощения и создания ограниченных маркеров

    Считывание сведений о привилегиях пользователя из маркера доступа

    В предыдущих лекциях описаны привилегии пользователя (раздел "ролевой доступ") и основные функции для считывания информации из маркера ( OpenProcessToken, GetTokenInformation ) в разделе "субъекты". Для получения списка привилегий из маркера при помощи функции GetTokenInformation нужно для параметра TokenInformationClass, выбрать значение TokenPrivileges. Ранее мы уже получали перечень привилегий учетной записи. Перечень привилегий, входящих в состав маркера, существенно шире, поскольку включает в себя привилегии пользователя и привилегии групп, в состав которых входит пользователь.

    Прогон программы получения списка привилегий из маркера доступа процесса

    В качестве примера рассмотрим программу, задача которой - получение перечня привилегий пользователя и его групп из маркера доступа данного процесса.

    #include <windows.h>
    #include <stdio.h>
    #pragma hdrstop
    
    void main()
    {
     HANDLE hToken;
     LUID setcbnameValue;
     TOKEN_PRIVILEGES tkp;
     DWORD errcod;
     LPVOID lpMsgBuf;
     LPCTSTR msgptr;
    
     UCHAR InfoBuffer[1000];
     PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES) InfoBuffer;
     DWORD dwInfoBufferSize;
     DWORD dwPrivilegeNameSize;
     DWORD dwDisplayNameSize;
     UCHAR ucPrivilegeName[500];
     UCHAR ucDisplayName[500];
     DWORD dwLangId;
     UINT i;
    
     if ( ! OpenProcessToken( GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, hToken ) )
     {
      puts( "OpenProcessToken" );
      return;
     }
    
     GetTokenInformation( hToken, TokenPrivileges, InfoBuffer,
      sizeof InfoBuffer, dwInfoBufferSize);
    
     printf( "Account privileges: \n\n" );
     for( i = 0; i < ptgPrivileges->PrivilegeCount; i ++ )
     {
      dwPrivilegeNameSize = sizeof ucPrivilegeName;
      dwDisplayNameSize = sizeof ucDisplayName;
      LookupPrivilegeName( NULL, ptgPrivileges->Privileges[i].Luid,
       (char *)ucPrivilegeName, dwPrivilegeNameSize );
      LookupPrivilegeDisplayName( NULL, (char *)ucPrivilegeName,
       (char *)ucDisplayName, dwDisplayNameSize, dwLangId );
      printf( "%s   (%s)\n", ucPrivilegeName, ucDisplayName);
     }
    
    }

    Задача приведенной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него списка привилегий. Функция LookupPrivilegeName позволяет получить программное имя привилегии по ее локальному идентификатору (Luid), а функция LookupPrivilegeDisplayName преобразует программное имя привилегии в дружественное имя.

    Включение и отключение привилегий в маркере

    Большую часть информации в маркере менять нельзя. Например, нельзя ни добавить, ни удалить привилегию. Согласно , , возможность добавления привилегий в маркер представляла бы собой "глубокий подкоп под систему защиты Windows". Последнее означает, что изменение привилегий субъекта - прерогатива подсистемы локальной авторизации (LSA) и должно осуществляться централизовано только при помощи функций семейства LSA (см. лекцию 14).

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

    Перевоплощение

    В ОС Windows имеются интересные возможности выполнения кода с маркером, отличным от маркера данного процесса. Это, например, существенно для серверов, которые должны выступать от имени и с привилегиями клиентов. Одна из таких возможностей - запуск нового процесса с указанным маркером при помощи функции CreateProcessAsUser. Эта функция является аналогом функции CreateProcess за исключением параметра hToken, который указывает на маркер, определяющий контекст пользователя нового процесса.

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

    Windows не позволяет серверам выступать в роли клиентов без их ведома. Чтобы избежать этого, клиентский процесс может ограничить уровень имперсонации. Поэтому для участия в перевоплощении маркер должен иметь соответствующий уровень перевоплощения. Этот уровень определяется параметром маркера TokenImpersonationLevel и может быть запрошен функцией GetTokenInformation. Для процесса перевоплощения важно, чтобы этот параметр имел значение не ниже SecurityImpersonation, что означает возможность имперсонации на локальной машине. Значение SecurityDelegation позволяет серверному процессу выступать от имени клиента, как на локальном, так и на удаленном компьютере. Последнее значение имеет отношение к делегированию, которое является естественным развитием перевоплощения, но работает только при наличии домена и функционировании активного каталога. По умолчанию устанавливается уровень SecurityImpersonation.

    Маркер перевоплощения обычно создают путем дублирования существующего маркера и придания ему нужных прав доступа и уровня имперсонации. Это можно сделать при помощи функции DuplicateTokenEx. Собственно перевоплощение осуществляется при помощи функции ImpersonateLoggedOnUser. Чтобы вернуться в исходное состояние, поток должен вызвать функцию RevertToSelf.

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

    Прогон программы заимствования маркера доступа и получения из него нужной информации

    В качестве "сложного" упражнения рекомендуется написать программу, задача которой - создать маркер доступа с нужным уровнем перевоплощения для указанной учетной записи и передать его текущему процессу. Затем для контроля нужно вывести на экран основные характеристики этого (уже ставшего текущим) маркера, например, перечень привилегий, после чего вернуть значение текущего маркера к исходному и извлечь из него привилегии еще раз.

    Другие возможности настройки контекста пользователя

    В ОС Windows имеются и другие возможности настройки контекста пользователя в соответствии со сложными требованиями защиты с учетом принципа минимума привилегий. В качестве примера можно упомянуть схему контроля доступа при помощи маркеров, называемых ограниченными. Ограниченные маркеры создаются функцией CreateRestrictedToken. В этот маркер в момент его создания можно внести следующие изменения: удалить привилегии, отключить некоторые SID-идентификаторы и добавить "ограниченные" SID'ы учетных записей. Последние просто добавляют ряд новых проверок к уже существующим при организации доступа к объекту. Ограниченные маркеры удобны, когда приложение подменяет клиента при выполнении кода, способного нанести ущерб системе.

    Заключение

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

    Вернуться к учебному плану