Защита извлеченных учетных данных домена с помощью Credential Guard

Credential Guard был впервые представлен в Windows 10 Корпоративная. Для защиты секретов он использует средства обеспечения безопасности на основе виртуализации, чтобы только привилегированное системное ПО могло получать доступ к этим данным. Несанкционированный доступ к секретам может привести к атакам, направленным на кражу учетных данных, например Pass-the-Hash или Pass-The-Ticket.

Credential Guard предоставляет следующие функции и решения.

  • Аппаратная безопасность. Для повышения безопасности извлеченных учетных данных домена Credential Guard использует функции безопасности платформы, включая безопасную загрузку и виртуализацию.

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

  • Улучшенная защита от целенаправленных устойчивых угроз Защита извлеченных учетных данных с помощью средства обеспечения безопасности на основе виртуализации позволяет блокировать атаки, направленные на кражу учетных данных, а также инструменты, используемые во многих других целенаправленных атаках. Вредоносные программы, работающие в операционной системе с правами администратора, не могут получить доступ к секретам, защищенным с помощью средства обеспечения безопасности на основе виртуализации. Несмотря на то что Credential Guard обеспечивает надежную защиту, со временем в устойчивых угрозах, скорее всего, будут применяться новые методы атак, поэтому, кроме этого средства защиты, рекомендуется использовать Device Guard и другие архитектуры и стратегии безопасности.

  • Управляемость. Credential Guard можно управлять с помощью групповой политики, WMI, командной строки и Windows PowerShell.

Принцип работы

Credential Guard изолирует секреты, которые в предыдущих версиях Windows хранилась в локальной системе безопасности (LSA), с помощью средства обеспечения безопасности на основе виртуализации. До Windows 10 хранением секретов, используемых в операционной системе, занималась LSA, которая хранила их памяти процессов. С появлением Credential Guard процесс LSA в операционной системе стал взаимодействовать с новым компонентом — изолированным процессом LSA, которая отвечает за хранение и защиту секретов. Данные, сохраненные в изолированном процессе LSA, защищены с помощью средства обеспечения безопасности на основе виртуализации и недоступны для остальной части операционной системы. LSA в операционной системе взаимодействует с изолированным процессом LSA с помощью удаленных вызовов процедур (RPC).

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

При использовании извлеченных учетных данных по умолчанию Credential Guard также не разрешает применять устаревшие версии протоколов проверки подлинности NTLM и Kerberos, а также наборы шифров, в том числе NTLMv1, MS-CHAPv2 и более слабые типы шифрования Kerberos, такие как DES.

Ниже представлена общая схема изоляции LSA с помощью средства обеспечения безопасности на основе виртуализации.

Mt483740.credguard(ru-ru,VS.85).png

Новые и измененные функции

Сведения о новых и измененных функциях Credential Guard см. в разделе Новые возможности Credential Guard.

Требования к аппаратному и программному обеспечению

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

ТребованиеОписание

Windows 10 Корпоративная

Компьютер должен работать под управлением ОС Windows 10 Корпоративная.

Микропрограммное обеспечение UEFI версии 2.3.1 или старше и поддержка безопасной загрузки

Чтобы убедиться, что микропрограммное обеспечение использует UEFI 2.3.1 или более поздней версии и безопасную загрузку, можно выполнить проверку на соответствие требованиям Программы совместимости оборудования для Windows, воспользовавшись следующей ссылкой: System.Fundamentals.Firmware.CS.UE FISecureBoot.ConnectedStandby.

Расширения виртуализации

Для поддержки средства обеспечения безопасности на основе виртуализация необходимы следующие расширения виртуализации:

  • Intel VT-x или AMD-V;
  • преобразование адресов второго уровня (SLAT).

Архитектура x64

Функции, которые средство обеспечения безопасности на основе виртуализации использует в низкоуровневой оболочке Windows, могут работать только на 64-разрядных архитектурах.

Модуль IOMMU (модуль управления памятью для операций ввода-вывода) VT-d или AMD-Vi

В Windows 10 модуль IOMMU повышает устойчивость системы к атакам на память. ¹

Доверенный платформенный модуль (TPM) версии 1.2 или 2.0

TPM версий 1.2 и 2.0 обеспечивает защиту ключей шифрования, которые хранятся во встроенном ПО. TPM 1.2 не поддерживается в Windows 10 (сборка 10240); однако он поддерживается в Windows 10 версии 1511 (сборка 10586) и более поздних версиях.

Примечание  Если у вас не установлен TPM, Credential Guard по-прежнему будет включен, но ключи, используемые для шифрования Credential Guard, не будут защищены модулем TPM.
 

Процесс безопасного обновления микропрограммного обеспечения

Чтобы убедиться, что микропрограммное обеспечение поддерживает процесс безопасного обновления, его можно проверить на соответствие требованиям Программы совместимости оборудования для Windows, воспользовавшись следующей ссылкой: System.Fundamentals.Firmware.UEFISecureBoot.

Микропрограммное обеспечение обновлено для реализации безопасного MOR

Для работы Credential Guard требуется безопасный бит MOR, который позволяет предотвратить некоторые атаки на память.

Физический компьютер

Credential Guard не удастся использовать на виртуальной машине, запущенной на ПК под управлением Windows 10.

 

¹ Если выбрать параметр Безопасная загрузка и защита DMA в настройках групповой политики, будет необходимо наличие модуля IOMMU. Параметр групповой политики Безопасная загрузка включает Credential Guard на устройствах без IOMMU.

Управление Credential Guard

Credential Guard использует функции безопасности на основе виртуализации, которые следует включить на каждом компьютере, прежде чем использовать Credential Guard.

Включение Credential Guard с помощью групповой политики

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

  1. В консоли управления групповыми политиками перейдите в раздел Конфигурация компьютера -> Административные шаблоны -> Система -> Device Guard.

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

  3. В поле Выберите уровень безопасности платформы выберите Безопасная загрузка или Безопасная загрузка и защита DMA.

  4. В поле Конфигурация Credential Guard щелкните элемент Включено с блокировкой UEFI, а затем нажмите кнопку ОК. Чтобы вы могли отключить Credential Guard удаленно, выберите пункт Включено без блокировки.

    Mt483740.CredGuard_GP(ru-ru,VS.85).png
  5. Закройте консоль управления групповыми политиками.

Добавление Credential Guard в образ

Если вы хотите добавить Credential Guard в образ, добавьте функции безопасности на основе виртуализации, а затем включите Credential Guard.

Добавление функций безопасности на основе виртуализации

Прежде всего необходимо добавить функции безопасности на основе виртуализации. Для этого можно воспользоваться панелью управления или системой обслуживания образов развертывания и управления ими (DISM).

Примечание  Если Credential Guard включается с помощью групповой политики, выполнять эти действия не требуется. Групповая политика сама установит эти компоненты.
 

Mt483740.wedge(ru-ru,VS.85).gifДобавление функций безопасности на основе виртуализации с помощью раздела «Программы и компоненты»

  1. Откройте раздел «Программы и компоненты» Панели управления.

  2. Выберите Включение или отключение компонентов Windows.

  3. Установите флажок Режим изолированного пользователя.

  4. Перейдите в раздел Hyper-V -> Платформа Hyper-V и установите флажок Низкоуровневая оболочка Hyper-V.

  5. Нажмите кнопку ОК.

Mt483740.wedge(ru-ru,VS.85).gifДобавление функций безопасности на основе виртуализации в автономный образ с помощью системы DISM

  1. Откройте командную строку с повышенными привилегиями.

  2. Добавьте низкоуровневую оболочку Hyper-V с помощью следующей команды:
    dism /image:<WIM file name> /Enable-Feature /FeatureName:Microsoft-Hyper-V-Hypervisor
    
  3. Добавьте режим изолированного пользователя с помощью следующей команды:
    dism /image:<WIM file name> /Enable-Feature /FeatureName:IsolatedUserMode
    
Примечание  

Вы также можете добавить эти возможности в оперативный образ с помощью системы DISM или Configuration Manager.

 

Включение Credential Guard

Если вы не используете групповую политику, вы можете включить Credential Guard с помощью реестра.

Mt483740.wedge(ru-ru,VS.85).gifВключение Credential Guard с помощью реестра

  1. Откройте редактор реестра.

  2. Включите средство обеспечения безопасности на основе виртуализации.

    • Откройте раздел реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceGuard.

    • Добавьте новый параметр типа DWORD с именем EnableVirtualizationBasedSecurity. Для включения средства обеспечения безопасности на основе виртуализации установите для этого параметра реестра значение 1, а для отключения — значение 0.

    • Добавьте новый параметр типа DWORD с именем RequirePlatformSecurityFeatures. Установите для этого параметра реестра значение 1, чтобы использовать только Безопасную загрузку, или значение 2, чтобы использовать Безопасную загрузку и защиту DMA.

  3. Включите Credential Guard, выполнив следующие действия.

    • Откройте раздел реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\LSA.

    • Добавьте новый параметр типа DWORD с именем LsaCfgFlags. Присвойте этому параметру значение 1, чтобы включить Credential Guard с блокировкой UEFI, значение 2, чтобы включить Credential Guard без блокировки, или значение 0, чтобы отключить этот компонент.

  4. Закройте редактор реестра.

Примечание  

Вы также можете включить Credential Guard с помощью записей реестра в параметре автоматической установки FirstLogonCommands.

 

Удаление Credential Guard

Если необходимо удалить Credential Guard с компьютера, выполните следующие действия.

  1. Если вы использовали групповую политику, отключите параметр групповой политики, с помощью которого вы включали Credential Guard (Конфигурация компьютера -> Административные шаблоны -> Система -> Device Guard -> Включить средство обеспечения безопасности на основе виртуализации).

  2. Удалите следующий параметр реестра: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\DeviceGuard\LsaCfgFlags.

  3. Удалите переменные EFI Credential Guard с помощью bcdedit.

Mt483740.wedge(ru-ru,VS.85).gifУдаление переменных EFI Credential Guard

  1. В командной строке с повышенными привилегиями введите следующие команды:

    mountvol X: /s
    copy %WINDIR%\System32\SecConfig.efi X:\EFI\Microsoft\Boot\SecConfig.efi /Y
    bcdedit /create {0cb3b571-2f2e-4343-a879-d86a476d7215} /d "DebugTool" /application osloader
    bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} path "\EFI\Microsoft\Boot\SecConfig.efi"
    bcdedit /set {bootmgr} bootsequence {0cb3b571-2f2e-4343-a879-d86a476d7215}
    bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} loadoptions DISABLE-LSA-ISO
    bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} device partition=X:
    mountvol X: /d
    
  2. Перезагрузите компьютер.

  3. Ответьте утвердительно на запрос об отключении Credential Guard.

  4. Для отключения Credential Guard также можно отключить функции безопасности на основе виртуализации.

Примечание  

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

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

bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} loadoptions DISABLE-LSA-ISO,DISABLE-VBS

Дополнительные сведения о системе безопасности на основе виртуализации и Device Guard см. в разделе Руководство по развертыванию Device Guard.

 

Проверка работы Credential Guard

Чтобы проверить, работает ли на компьютере Credential Guard, можно использовать программу "Сведения о системе".

  1. Нажмите кнопку Пуск, введите msinfo32.exe, а затем щелкните Сведения о системе.

  2. Выберите Сводные сведения о системе.

  3. Убедитесь, что строка ОCredential Guard отображается рядом с пунктом Службы безопасности Device Guard выполняются.

    Пример.

    Mt483740.CredGuard_MSInfo32(ru-ru,VS.85).png

Рекомендации по использованию Credential Guard

  • Если Credential Guard был включен на устройстве после его присоединения к домену, то может оказаться, что безопасность секретов пользователя и устройства уже были скомпрометированы. Мы рекомендуем включать Охранник учетных данных до присоединения компьютера к домену.

  • Следует регулярно проводить проверку компьютеров с включенным Credential Guard. Это можно сделать с помощью политик аудита безопасности или запросов WMI. Ниже представлен список кодов событий WinInit, которые следует искать.

    • Код события 13: Credential Guard (LsaIso.exe) запущен и защищает учетные данные LSA

    • Код события 14: конфигурация Credential Guard (LsaIso.exe): 0x1, 0

      • Первая переменная: 0x1 означает, что Credential Guard настроен для запуска. 0x0 означает, что Credential Guard не настроен для запуска.
      • Вторая переменная: 0 означает, что Credential Guard настроен для работы в режиме защиты. 1 означает, что Credential Guard для работы в тестовом режиме. Эта переменная должна всегда иметь значение 0.
    • Код события 15: Credential Guard (LsaIso.exe) настроен, но ядро системы безопасности не запущено. Операция будет продолжена без Credential Guard.

    • Код события 16: не удалось запустить Credential Guard (LsaIso.exe): [код ошибки]

    • Код события 17: ошибка чтения конфигурации UEFI Credential Guard (LsaIso.exe): [код ошибки]

    Можно также узнать, используется ли TPM для защиты ключей, проверив следующее событие в источнике событий Microsoft -> Windows -> Kernel-Boot. При использовании TPM значение маски регистра конфигурации платформы доверенного платформенного модуля будет отличным от 0.

    • Код события: 51 Подготовка главного ключа шифрования. Состояние использования кэшированной копии: 0x0. Состояние распечатывания кэшированной копии: 0x1. Состояние создания нового ключа: 0x1. Состояние запечатывания: 0x1. Маска регистра конфигурации платформы доверенного платформенного модуля: 0x0.

  • Пароли по-прежнему небезопасны, поэтому мы рекомендуем организациям развертывать Credential Guard и переходить от использования паролей к другим методам проверки подлинности, например физическим смарт-картам, виртуальным смарт-картам, Microsoft Passport или Microsoft Passport for Work.

  • Некоторые сторонние поставщики поддержки безопасности (поставщики общих служб и AP) могут быть несовместимы с Credential Guard. Credential Guard не позволяет сторонним поставщикам общих служб запрашивать хэш-коды паролей из LSA. При этом поставщики общих служб и AP все равно получают уведомление о пароле, когда пользователь входит в систему или меняет пароль. Никакое использование недокументированных API с другими поставщиками общих служб и AP не поддерживается. Рекомендуется проверять взаимодействие других реализаций поставщиков общих служб и AP с Credential Guard, чтобы не допустить ситуаций, в которых поставщики общих служб и AP зависят от недокументированного или неподдерживаемого поведения. Например, не поддерживается использование API KerbQuerySupplementalCredentialsMessage. Не следует заменять поставщиков общих служб NTLM или Kerberos другими поставщиками общих служб и AP. Более подробную информацию см. в статье Restrictions around Registering and Installing a Security Package (Ограничения на регистрацию и установку пакетов безопасности) на веб-сайте MSDN.

  • По мере увеличения масштабов защиты, осуществляемой Credential Guard, последующие выпуски Windows 10 с работающим Credential Guard могут повлиять на сценарии, которые работали в прошлом. Например, Credential Guard может заблокировать использование определенного типа учетных данных или определенного компонента, чтобы не позволить вредоносному ПО воспользоваться уязвимостями. Поэтому мы рекомендуем проверять сценарии, необходимые для работы организации, перед обновлением устройств с работающим Credential Guard.

  • Если вы используете конечные точки Wi-Fi и VPN на основе MS-CHAPv2, то они подвержены атакам, схожим с атаками на NTLMv1. Мы рекомендуем организациям применять проверку подлинности с использованием сертификатов при подключении к Wi-Fi и VPN.

  • Начиная c Windows 10 версии 1511, учетные данные домена, которые хранятся в диспетчере учетных данных, защищены с помощью Credential Guard. Диспетчер учетных данных позволяет хранить учетные данные, такие как имена пользователей и пароли, используемые для входа на веб-сайты или в систему на других компьютерах в сети. В отношении данных, хранящихся в диспетчере учетных данных и защищенных с помощью Credential Guard, действуют следующие ограничения:

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

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

    • С помощью панели управления диспетчера учетных данных невозможно восстановить учетные данные, если их резервная копия создана с ПК, на котором включен Credential Guard. Если необходимо создать резервную копию учетных данных, это нужно сделать до включения Credential Guard. В противном случае восстановить эти учетные данные будет невозможно.

Сценарии, не защищенные с помощью Credential Guard

В ряде случаев хранение учетных данных не защищено Credential Guard.

  • Программное обеспечение, которое используется для управления учетными данными, кроме защиты компонентов Windows

  • Локальные учетные записи и учетные записи Майкрософт

  • Сервер Windows Server 2016 Technical Preview, выполняющий некоторые роли, например работающий в качестве контроллера домена или шлюза удаленных рабочих столов. Если сервер Windows Server 2016 Server Technical Preview используется в качестве обычного клиентского компьютера, на нем обеспечивается тот же уровень защиты, что и при использовании ОС Windows 10 Корпоративная

  • Клавиатурные шпионы

  • Физические атаки

  • Нет защиты от использования злоумышленником с вредоносным ПО привилегий, связанных с любыми учетными данными на компьютере. Мы рекомендуем использовать выделенные компьютеры для учетных записей повышенной важности, например для учетных записей ИТ-специалистов и пользователей, имеющих доступ к важным ресурсам организации.

Дополнительная защита

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

Атака на учетные данные позволяет злоумышленнику украсть секреты с одного устройства и использовать их на другом. Выполнив развертывание политик проверки подлинности с использованием комплексной проверки подлинности в Windows Server 2012 R2 или более поздних версиях доменов, можно разрешить пользователям вход только с определенных устройств, подключенных к домену. Но так как устройства также используют общие секреты для проверки подлинности, злоумышленники могут украсть и их. При использовании сертификатов устройств с Credential Guard политики проверки подлинности могут требовать, чтобы устройство проходило проверку подлинности с помощью своего собственного закрытого ключа. Это не позволит использовать общие секреты на украденных устройствах с украденными паролями пользователей или секретными ключами Kerberos для входа от имени пользователя.

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

  • Домены устройств работают под управлением Windows Server 2012 или более поздних версий, а у всех контроллеров домена имеются сертификаты, которые прошли обязательную проверку центра распространения ключей (KDC) (имеется расширенное использование ключа (EKU) KDC, а имя DNS-домена соответствует полю DNSName расширения SubjectAltName (SAN)).

  • Устройства под управлением Windows 10 имеют центр сертификации, выпускающий сертификаты контроллера домена в хранилище предприятия.

  • Удостоверение и надежность устройства проверяется так же, как удостоверение и надежность пользователя перед выдачей ему смарт-карты.

Дополнительные параметры групповой политики

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

  • На контроллерах домена с помощью групповой политики настройте поддержку KDC требований, комплексной проверки подлинности и защиты Kerberos. Задайте для параметра групповой политики Поддержка KDC требований, комплексной проверки подлинности и защиты Kerberos значение Поддерживается или Всегда предоставлять утверждения.

  • На устройствах под управлением Windows 10 данный параметр также можно включить с помощью групповой политики. Для этого включите параметры групповой политики Поддержка клиентами Kerberos требований, комплексной проверки подлинности и защиты Kerberos и Всегда начинать с отправки комплексной проверки подлинности в разделе Конфигурация компьютера -> Административные шаблоны -> Система -> Kerberos.

Комплексная проверка подлинности

Комплексная проверка подлинности позволяет добавить удостоверение устройства к удостоверению пользователя при получении доступа к домену и ресурсам. Без комплексной проверки подлинности проверяются только секреты пользователя. При использовании комплексной проверкой подлинности клиент Kerberos должен иметь секреты и пользователя, и устройства.

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

  • Проверка подлинности пользователя на устройствах, присоединенных к домену, будет защищена. Это означает, что в перехваченном сетевом трафике будут содержаться зашифрованные данные начальной проверки подлинности Kerberos. Без соответствующего ключа устройства запросы AS-REQ протокола Kerberos будут защищены от автономных атак с перебором по словарю.

  • Ошибки KDC подписываются. Это обеспечивает защиту от атак с применением спуфинга ошибок.

Развертывание сертификатов компьютера

Если контроллеры домена в организации работают под управлением Windows Server 2016 Technical Preview, то устройства под управлением Windows 10 автоматически регистрируют сертификат компьютера, если включен Credential Guard и компьютер присоединен к домену.

Если контроллеры домена работают под управлением Windows Server 2012 R2, сертификаты компьютера необходимо подготавливать к работе вручную на каждом устройстве. Это можно сделать, создав шаблон сертификата в контроллере домена или центре сертификации и развернув сертификаты компьютеров на каждом устройстве.

В отношении сертификатов компьютера следует применять те же меры безопасности, которые используются для выдачи смарт-карт пользователям.

  1. В консоли диспетчера сертификатов щелкните правой кнопкой мыши Шаблоны сертификатов и выберите Управление.

  2. Щелкните правой кнопкой мыши Проверка подлинности рабочей станции и выберите Скопировать шаблон.

  3. Щелкните правой кнопкой мыши на новом шаблоне и выберите Свойства.

  4. На вкладке Расширения щелкните Политики приложений, а затем нажмите Изменить.

  5. Щелкните Проверка подлинности клиента, а затем нажмите Удалить.

  6. Добавьте EKU ID-PKInit-KPClientAuth. Щелкните Добавить, затем нажмите Создать и укажите следующие значения.

    • Имя: Kerberos Client Auth

    • Идентификатор объекта: 1.3.6.1.5.2.3.4

  7. На вкладке Расширения щелкните Политики выдачи, затем щелкните Изменить.

  8. В разделе Политики выдачи щелкните Высокая надежность.

  9. На вкладке Имя субъекта снимите флажок DNS-имя, а затем установите флажок Имя участника-пользователя (UPN).

На тех устройствах, на которых работает Credential Guard, выполните регистрацию устройств, использующих сертификат проверки подлинности компьютера, выполнив следующую команду:

CertReq -EnrollCredGuardCert MachineAuthentication
Примечание  

После регистрации сертификата проверки подлинности компьютера необходимо перезагрузить устройство.

 

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

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

  • Сценарий get-IssuancePolicy.ps1 отображает все политики выдачи, доступные в центре сертификации.

    В командной строке Windows PowerShell введите следующую команду:

    .\get-IssuancePolicy.ps1 –LinkedToGroup:All
    
  • Сценарий set-IssuancePolicyToGroupLink.ps1 создает универсальную группу безопасности, создает подразделение и связывает политику выдачи с универсальной группой безопасности.

    В командной строке Windows PowerShell введите следующую команду:

    .\set-IssuancePolicyToGroupLink.ps1 –IssuancePolicyName:”<name of issuance policy>” –groupOU:”<Name of OU to create>” –groupName:”<name of Universal security group to create>”
    

Развертывание политики проверки подлинности

Перед настройкой политики проверки подлинности следует зарегистрировать все неудачные попытки применить политику проверки подлинности в центре распространения ключей (KDC). Для этого в средстве «Просмотр событий» перейдите в раздел Журналы приложений и служб\Microsoft\Windows\Проверка подлинности, щелкните правой кнопкой мыши на «AuthenticationPolicyFailures-DomainController» и выберите Включить журнал.

Теперь можно настроить политику проверки подлинности для использования Credential Guard.

Mt483740.wedge(ru-ru,VS.85).gifДобавление политики проверки подлинности для Credential Guard

  1. Убедитесь, что ваши контроллеры домена функционируют по меньшей мере в режиме работы домена Windows Server 2012 R2.

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

  3. Добавьте учетную запись компьютера в эту группу безопасности.

  4. Откройте центр администрирования Active Directory.

  5. Щелкните Проверка подлинности, нажмите Создать, а затем щелкните Политика проверки подлинности.

  6. В поле Отображаемое имя введите имя этой политики проверки подлинности.

  7. В разделе Учетные записи щелкните Добавить.

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

  9. В разделе Пользователь нажмите кнопку Изменить, которая относится к учетной записи пользователя.

  10. Щелкните Добавить условие.

  11. Убедитесь, что в поле Изменение условий управления доступом установлено значение Пользователь > Группа > Элемент каждого > Значение, а затем щелкните Добавить элементы.

  12. В диалоговом окне Выбор пользователей, компьютеров или учетных записей служб введите имя группы безопасности, созданной с помощью сценария set-IssuancePolicyToGroupLink, и нажмите кнопку ОК.

  13. Нажмите кнопку ОК, чтобы закрыть окно Изменение условий управления доступом.

  14. Нажмите кнопку ОК, чтобы создать политику проверки подлинности.

  15. Закройте центр администрирования Active Directory.

Примечание  

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

 

Приложение. Сценарии

Ниже перечислены сценарии, упоминавшиеся в этом разделе.

Получение доступных политик выдачи в центре сертификации

Сохраните этот файл сценария под именем get-IssuancePolicy.ps1.

#######################################
##     Parameters to be defined      ##
##     by the user                   ##
#######################################

Param (
$Identity,
$LinkedToGroup
)

#######################################
##     Strings definitions           ##
#######################################
Data getIP_strings {
# culture="en-US"
ConvertFrom-StringData -stringdata @'
help1 = This command can be used to retrieve all available Issuance Policies in a forest. The forest of the currently logged on user is targetted.
help2 = Usage:
help3 = The following parameter is mandatory:
help4 = -LinkedToGroup:<yes|no|all>
help5 = "yes" will return only Issuance Policies that are linked to groups. Checks that the linked Issuance Policies are linked to valid groups.
help6 = "no" will return only Issuance Policies that are not currently linked to any group. 
help7 = "all" will return all Issuance Policies defined in the forest. Checks that the linked Issuance policies are linked to valid groups.
help8 = The following parameter is optional:
help9 = -Identity:<Name, Distinguished Name or Display Name of the Issuance Policy that you want to retrieve>. If you specify an identity, the option specified in the "-LinkedToGroup" parameter is ignored.
help10 = Output: This script returns the Issuance Policy objects meeting the criteria defined by the above parameters.
help11 = Examples:
errorIPNotFound = Error: no Issuance Policy could be found with Identity "{0}"
ErrorNotSecurity = Error: Issuance Policy "{0}" is linked to group "{1}" which is not of type "Security".
ErrorNotUniversal = Error: Issuance Policy "{0}" is linked to group "{1}" whose scope is not "Universal".
ErrorHasMembers = Error: Issuance Policy "{0}" is linked to group "{1}" which has a non-empty membership. The group has the following members:
LinkedIPs = The following Issuance Policies are linked to groups:
displayName = displayName : {0}
Name = Name : {0}
dn = distinguishedName : {0}
        InfoName = Linked Group Name: {0} 
        InfoDN = Linked Group DN: {0}   
NonLinkedIPs = The following Issuance Policies are NOT linked to groups:
'@
}

##Import-LocalizedData getIP_strings


import-module ActiveDirectory


#######################################
##           Help                    ##
#######################################

function Display-Help {

    ""
    $getIP_strings.help1
    ""
$getIP_strings.help2
""
$getIP_strings.help3
"     " + $getIP_strings.help4
"             " + $getIP_strings.help5
    "             " + $getIP_strings.help6
    "             " + $getIP_strings.help7
""
$getIP_strings.help8
    "     " + $getIP_strings.help9
    ""
    $getIP_strings.help10
""
""    
$getIP_strings.help11
    "     " + '$' + "myIPs = .\get-IssuancePolicy.ps1 -LinkedToGroup:All"
    "     " + '$' + "myLinkedIPs = .\get-IssuancePolicy.ps1 -LinkedToGroup:yes"
    "     " + '$' + "myIP = .\get-IssuancePolicy.ps1 -Identity:""Medium Assurance"""
""
}


$root = get-adrootdse
$domain = get-addomain -current loggedonuser
$configNCDN = [String]$root.configurationNamingContext


if ( !($Identity) -and !($LinkedToGroup) ) {
display-Help
break
}

if ($Identity) {
    $OIDs = get-adobject -Filter {(objectclass -eq "msPKI-Enterprise-Oid") -and ((name -eq $Identity) -or (displayname -eq $Identity) -or (distinguishedName -like $Identity)) } -searchBase $configNCDN -properties *

    if ($OIDs -eq $null) {
$errormsg = $getIP_strings.ErrorIPNotFound -f $Identity
write-host $errormsg -ForegroundColor Red
    }
    
    foreach ($OID in $OIDs) {
    
        if ($OID."msDS-OIDToGroupLink") {
            # In case the Issuance Policy is linked to a group, it is good to check whether there is any problem with the mapping.
            $groupDN = $OID."msDS-OIDToGroupLink"
            $group = get-adgroup -Identity $groupDN
    $groupName = $group.Name
            
            # Analyze the group
            if ($group.groupCategory -ne "Security") {
$errormsg = $getIP_strings.ErrorNotSecurity -f $Identity, $groupName
                write-host $errormsg -ForegroundColor Red
            }
            if ($group.groupScope -ne "Universal") {
                $errormsg = $getIP_strings.ErrorNotUniversal -f $Identity, $groupName
write-host $errormsg -ForegroundColor Red
            }
            $members = Get-ADGroupMember -Identity $group
            if ($members) {
                $errormsg = $getIP_strings.ErrorHasMembers -f $Identity, $groupName
write-host $errormsg -ForegroundColor Red
                foreach ($member in $members) {
                    write-host "          "  $member -ForeGroundColor Red
                }
            }
        }
        
    }
    return $OIDs
    break
}

if (($LinkedToGroup -eq "yes") -or ($LinkedToGroup -eq "all")) {
    $LDAPFilter = "(&(objectClass=msPKI-Enterprise-Oid)(msDS-OIDToGroupLink=*)(flags=2))"
    $LinkedOIDs = get-adobject -searchBase $configNCDN -LDAPFilter $LDAPFilter -properties *

    write-host ""    
    write-host "*****************************************************"
    write-host $getIP_strings.LinkedIPs
    write-host "*****************************************************"
    write-host ""
    if ($LinkedOIDs -ne $null){
      foreach ($OID in $LinkedOIDs) {
  
          # Display basic information about the Issuance Policies
          ""
  $getIP_strings.displayName -f $OID.displayName
  $getIP_strings.Name -f $OID.Name
  $getIP_strings.dn -f $OID.distinguishedName
       
          
          # Get the linked group.
          $groupDN = $OID."msDS-OIDToGroupLink"
          $group = get-adgroup -Identity $groupDN
          $getIP_strings.InfoName -f $group.Name
          $getIP_strings.InfoDN -f $groupDN
          
          # Analyze the group
          $OIDName = $OID.displayName
    $groupName = $group.Name
          if ($group.groupCategory -ne "Security") {
          $errormsg = $getIP_strings.ErrorNotSecurity -f $OIDName, $groupName
          write-host $errormsg -ForegroundColor Red
          }
          if ($group.groupScope -ne "Universal") {
          $errormsg = $getIP_strings.ErrorNotUniversal -f $OIDName, $groupName
          write-host $errormsg -ForegroundColor Red
          }
          $members = Get-ADGroupMember -Identity $group
          if ($members) {
          $errormsg = $getIP_strings.ErrorHasMembers -f $OIDName, $groupName
          write-host $errormsg -ForegroundColor Red
              foreach ($member in $members) {
                  write-host "          "  $member -ForeGroundColor Red
              }
          }
          write-host ""
      }
    }else{
write-host "There are no issuance policies that are mapped to a group"
    }
    if ($LinkedToGroup -eq "yes") {
        return $LinkedOIDs
        break
    }
}    

if (($LinkedToGroup -eq "no") -or ($LinkedToGroup -eq "all")) {  
    $LDAPFilter = "(&(objectClass=msPKI-Enterprise-Oid)(!(msDS-OIDToGroupLink=*))(flags=2))"
    $NonLinkedOIDs = get-adobject -searchBase $configNCDN -LDAPFilter $LDAPFilter -properties *

    write-host ""    
    write-host "*********************************************************"
    write-host $getIP_strings.NonLinkedIPs
    write-host "*********************************************************"
    write-host ""
    if ($NonLinkedOIDs -ne $null) {
      foreach ($OID in $NonLinkedOIDs) {

# Display basic information about the Issuance Policies
write-host ""
$getIP_strings.displayName -f $OID.displayName
$getIP_strings.Name -f $OID.Name
$getIP_strings.dn -f $OID.distinguishedName
write-host ""
      }
    }else{
write-host "There are no issuance policies which are not mapped to groups"
    }
    if ($LinkedToGroup -eq "no") {
        return $NonLinkedOIDs
        break
    }
}

Примечание  

Если не удается запустить этот сценарий, попробуйте заменить одиночные кавычки после параметра ConvertFrom-StringData.

 

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

Сохраните этот файл сценария под именем set-IssuancePolicyToGroupLink.ps1.

#######################################
##     Parameters to be defined      ##
##     by the user                   ##
#######################################

Param (
$IssuancePolicyName,
$groupOU,
$groupName
)

#######################################
##     Strings definitions           ##
#######################################

Data ErrorMsg {
# culture="en-US"
ConvertFrom-StringData -stringdata @'
help1 = This command can be used to set the link between a certificate issuance policy and a universal security group.
help2 = Usage:
help3 = The following parameters are required:
help4 = -IssuancePolicyName:<name or display name of the issuance policy that you want to link to a group>
help5 = -groupName:<name of the group you want to link the issuance policy to>. If no name is specified, any existing link to a group is removed from the Issuance Policy.
help6 = The following parameter is optional:
help7 = -groupOU:<Name of the Organizational Unit dedicated to the groups which are linked to issuance policies>. If this parameter is not specified, the group is looked for or created in the Users container.
help8 = Examples:
help9 = This command will link the issuance policy whose display name is "High Assurance" to the group "HighAssuranceGroup" in the Organizational Unit "OU_FOR_IPol_linked_groups". If the group or the Organizational Unit do not exist, you will be prompted to create them.
help10 = This command will unlink the issuance policy whose name is "402.164959C40F4A5C12C6302E31D5476062" from any group.
MultipleIPs = Error: Multiple Issuance Policies with name or display name "{0}" were found in the subtree of "{1}"
NoIP = Error: no issuance policy with name or display name "{0}" could be found in the subtree of "{1}".
IPFound = An Issuance Policy with name or display name "{0}" was successfully found: {1}
MultipleOUs = Error: more than 1 Organizational Unit with name "{0}" could be found in the subtree of "{1}".
confirmOUcreation = Warning: The Organizational Unit that you specified does not exist. Do you want to create it?
OUCreationSuccess = Organizational Unit "{0}" successfully created.
OUcreationError = Error: Organizational Unit "{0}" could not be created.
OUFoundSuccess = Organizational Unit "{0}" was successfully found.
multipleGroups = Error: More than one group with name "{0}" was found in Organizational Unit "{1}".  
confirmGroupCreation = Warning: The group that you specified does not exist. Do you want to create it?
groupCreationSuccess = Univeral Security group "{0}" successfully created.
groupCreationError = Error: Univeral Security group "{0}" could not be created.
GroupFound = Group "{0}" was successfully found.
confirmLinkDeletion = Warning: The Issuance Policy "{0}" is currently linked to group "{1}". Do you really want to remove the link?
UnlinkSuccess = Certificate issuance policy successfully unlinked from any group.
UnlinkError = Removing the link failed.
UnlinkExit = Exiting without removing the link from the issuance policy to the group.
IPNotLinked = The Certificate issuance policy is not currently linked to any group. If you want to link it to a group, you should specify the -groupName option when starting this script.
ErrorNotSecurity = Error: You cannot link issuance Policy "{0}" to group "{1}" because this group is not of type "Security".
ErrorNotUniversal = Error: You cannot link issuance Policy "{0}" to group "{1}" because the scope of this group is not "Universal".
ErrorHasMembers = Error: You cannot link issuance Policy "{0}" to group "{1}" because it has a non-empty membership. The group has the following members:
ConfirmLinkReplacement = Warning: The Issuance Policy "{0}" is currently linked to group "{1}". Do you really want to update the link to point to group "{2}"?
LinkSuccess = The certificate issuance policy was successfully linked to the specified group.
LinkError = The certificate issuance policy could not be linked to the specified group.
ExitNoLinkReplacement = Exiting without setting the new link.
'@
}

# import-localizeddata ErrorMsg

function Display-Help {
""
write-host $ErrorMsg.help1
""
write-host $ErrorMsg.help2
""
write-host $ErrorMsg.help3
write-host "`t" $ErrorMsg.help4
write-host "`t" $ErrorMsg.help5
""
write-host $ErrorMsg.help6
write-host "`t" $ErrorMsg.help7
""
""
write-host $ErrorMsg.help8
""
write-host $ErrorMsg.help9
".\Set-IssuancePolicyToGroupMapping.ps1 -IssuancePolicyName ""High Assurance"" -groupOU ""OU_FOR_IPol_linked_groups"" -groupName ""HighAssuranceGroup"" "
""
write-host $ErrorMsg.help10
'.\Set-IssuancePolicyToGroupMapping.ps1 -IssuancePolicyName "402.164959C40F4A5C12C6302E31D5476062" -groupName $null '
""
}



# Assumption:  The group to which the Issuance Policy is going 
#              to be linked is (or is going to be created) in 
#              the domain the user running this script is a member of.
import-module ActiveDirectory
$root = get-adrootdse
$domain = get-addomain -current loggedonuser


if ( !($IssuancePolicyName) ) {
display-Help
break
}

#######################################
##     Find the OID object           ##
##     (aka Issuance Policy)         ##
#######################################

$searchBase = [String]$root.configurationnamingcontext
$OID = get-adobject -searchBase $searchBase -Filter { ((displayname -eq $IssuancePolicyName) -or (name -eq $IssuancePolicyName)) -and (objectClass -eq "msPKI-Enterprise-Oid")} -properties *

if ($OID -eq $null) {
$tmp = $ErrorMsg.NoIP -f $IssuancePolicyName, $searchBase  
write-host $tmp -ForeGroundColor Red
break;
}
elseif ($OID.GetType().IsArray) {
$tmp = $ErrorMsg.MultipleIPs -f $IssuancePolicyName, $searchBase  
write-host $tmp -ForeGroundColor Red
break;
}
else {
$tmp = $ErrorMsg.IPFound -f $IssuancePolicyName, $OID.distinguishedName
write-host $tmp -ForeGroundColor Green
}



#######################################
##  Find the container of the group  ##
#######################################

if ($groupOU -eq $null) {
# default to the Users container
$groupContainer = $domain.UsersContainer
} 
else {
$searchBase = [string]$domain.DistinguishedName
$groupContainer = get-adobject -searchBase $searchBase -Filter { (Name -eq $groupOU) -and (objectClass -eq "organizationalUnit")}
if ($groupContainer.count -gt 1) {
$tmp = $ErrorMsg.MultipleOUs -f $groupOU, $searchBase
write-host $tmp -ForegroundColor Red
break;
}
elseif ($groupContainer -eq $null) {
$tmp = $ErrorMsg.confirmOUcreation
write-host $tmp " ( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
new-adobject -Name $groupOU -displayName $groupOU -Type "organizationalUnit" -ProtectedFromAccidentalDeletion $true -path $domain.distinguishedName
if ($?){
$tmp = $ErrorMsg.OUCreationSuccess -f $groupOU
write-host $tmp -ForegroundColor Green
}
else{
$tmp = $ErrorMsg.OUCreationError -f $groupOU
write-host $tmp -ForeGroundColor Red 
break;
}
$groupContainer = get-adobject -searchBase $searchBase -Filter { (Name -eq $groupOU) -and (objectClass -eq "organizationalUnit")}
}
else {
break;
}
}
else {
$tmp = $ErrorMsg.OUFoundSuccess -f $groupContainer.name
write-host $tmp -ForegroundColor Green
}
}

#######################################
##  Find the group               ##
#######################################

if (($groupName -ne $null) -and ($groupName -ne "")){
##$searchBase = [String]$groupContainer.DistinguishedName
$searchBase = $groupContainer
$group = get-adgroup -Filter { (Name -eq $groupName) -and (objectClass -eq "group") } -searchBase $searchBase
if ($group -ne $null -and $group.gettype().isarray) {
$tmp = $ErrorMsg.multipleGroups -f $groupName, $searchBase
write-host $tmp -ForeGroundColor Red
break;
}
elseif ($group -eq $null) {
$tmp = $ErrorMsg.confirmGroupCreation
write-host $tmp " ( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
new-adgroup -samAccountName $groupName -path $groupContainer.distinguishedName -GroupScope "Universal" -GroupCategory "Security"
if ($?){
$tmp = $ErrorMsg.GroupCreationSuccess -f $groupName
write-host $tmp -ForegroundColor Green
}else{
$tmp = $ErrorMsg.groupCreationError -f $groupName
write-host $tmp -ForeGroundColor Red 
break
}
$group = get-adgroup -Filter { (Name -eq $groupName) -and (objectClass -eq "group") } -searchBase $searchBase
}
else {
break;
}
}
else {
$tmp = $ErrorMsg.GroupFound -f $group.Name
write-host $tmp -ForegroundColor Green
}
} 
else {
#####
## If the group is not specified, we should remove the link if any exists
#####
if ($OID."msDS-OIDToGroupLink" -ne $null) {
$tmp = $ErrorMsg.confirmLinkDeletion -f $IssuancePolicyName, $OID."msDS-OIDToGroupLink"
write-host $tmp " ( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
set-adobject -Identity $OID -Clear "msDS-OIDToGroupLink"
if ($?) {
$tmp = $ErrorMsg.UnlinkSuccess
write-host $tmp -ForeGroundColor Green
}else{
$tmp = $ErrorMsg.UnlinkError
write-host $tmp -ForeGroundColor Red
}
} 
else { 
$tmp = $ErrorMsg.UnlinkExit
write-host $tmp
break 
}
}
else {
$tmp = $ErrorMsg.IPNotLinked
write-host $tmp -ForeGroundColor Yellow
}
break;
}


#######################################
##  Verify that the group is         ##
##  Universal, Security, and         ## 
##  has no members                   ##
#######################################

if ($group.GroupScope -ne "Universal") {
$tmp = $ErrorMsg.ErrorNotUniversal -f $IssuancePolicyName, $groupName
write-host $tmp -ForeGroundColor Red
break;
}
if ($group.GroupCategory -ne "Security") {
$tmp = $ErrorMsg.ErrorNotSecurity -f $IssuancePolicyName, $groupName
write-host $tmp -ForeGroundColor Red
break;
}
$members = Get-ADGroupMember -Identity $group
if ($members -ne $null) {
$tmp = $ErrorMsg.ErrorHasMembers -f $IssuancePolicyName, $groupName
write-host $tmp -ForeGroundColor Red
foreach ($member in $members) {write-host "   $member.name" -ForeGroundColor Red}
break;
}


#######################################
##  We have verified everything. We  ##
##  can create the link from the     ## 
##  Issuance Policy to the group.    ##
#######################################

if ($OID."msDS-OIDToGroupLink" -ne $null) {
$tmp = $ErrorMsg.ConfirmLinkReplacement -f $IssuancePolicyName, $OID."msDS-OIDToGroupLink", $group.distinguishedName
write-host $tmp  "( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
$tmp = @{'msDS-OIDToGroupLink'= $group.DistinguishedName}
set-adobject -Identity $OID -Replace $tmp
if ($?) {
$tmp = $Errormsg.LinkSuccess
write-host $tmp -Foreground Green
}else{
$tmp = $ErrorMsg.LinkError
write-host $tmp -Foreground Red
}
} else { 
$tmp = $Errormsg.ExitNoLinkReplacement
write-host $tmp
break 
}
}
else {
$tmp = @{'msDS-OIDToGroupLink'= $group.DistinguishedName}
set-adobject -Identity $OID -Add $tmp
if ($?) {
$tmp = $Errormsg.LinkSuccess
write-host $tmp -Foreground Green
}else{
$tmp = $ErrorMsg.LinkError
write-host $tmp -Foreground Red
}
}

Примечание  

Если не удается запустить этот сценарий, попробуйте заменить одиночные кавычки после параметра ConvertFrom-StringData.

 

Связанные разделы

Isolated User Mode in Windows 10 with Dave Probert (Channel 9) (Режим изолированного пользователя в Windows 10 с Дэйвом Пробертом (Dave Probert), Channel 9)
Isolated User Mode Processes and Features in Windows 10 with Logan Gabriel (Channel 9) (Процессы и функции режима изолированного пользователя в Windows 10 с Логаном Гэбриэлом (Logan Gabriel), Channel 9)
More on Processes and Features in Windows 10 Isolated User Mode with Dave Probert (Channel 9) (Дополнительные сведения о процессах и функциях режима изолированного пользователя в Windows 10 с Дэйвом Пробертом (Dave Probert), Channel 9)
Mitigating Credential Theft using the Windows 10 Isolated User Mode (Channel 9) (Защита от кражи учетных данных с помощью режима изолированного пользователя Windows 10 (Channel 9))
Enabling Strict KDC Validation in Windows Kerberos (Включение обязательной проверки KDC в Windows Kerberos)
Что нового в проверке подлинности Kerberos для Windows Server 2012
Пошаговое руководство по настройке контроля механизма проверки подлинности для доменных служб Active Directory в ОС Windows Server 2008 R2
Доверенный платформенный модуль

 

 

Показ: