Visual Studio обычно запускается дома, затем тот же ноутбук подключается к корпоративному туннелю, и каждый запуск полминуты висит на заставке. Уберите политику — и задержка исчезнет вместе с ней; уберите туннель — произойдёт то же самое. Оба наблюдения верны, поэтому два компонента постоянно винят друг друга. Решающий вопрос: запрос отзыва сертификата ждёт путь, который даёт только туннель, или вообще не находит его.

Измеряйте загрузку, а не запуск

Одна политика WDAC, развёрнутая как подписанный SiPolicy.p7b, решает, какие образы могут выполняться на машине. Целостность кода проверяет цепочку подписей образа перед выполнением, и эта проверка может включать вопрос об отзыве. Ответ зависит от точки распространения CRL или ответчика OCSP, который сертификат называет внутри себя.

Это обычные сетевые запросы, поэтому их стоимость зависит от того, где находится ответчик. Когда он доступен только через туннель или его имя разрешается только через DNS-сервер за туннелем, проверка ждёт готовности туннеля. Visual Studio при запуске загружает множество подписанных сборок и расширений, и небольшая задержка на каждый образ становится заметной остановкой. Ничего не повреждено, и политика ведёт себя точно так, как настроена, поэтому удаление политики выглядит как исправление.

Каждый подписанный образ может вызвать сетевой запрос

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

certutil -verify -urlfetch C:\Tools\Contoso.Editor.dll
nslookup ocsp.contoso.example
Test-NetConnection ocsp.contoso.example -Port 80

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

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

Сократите задержку, не убирая контроль

Отключение политики или перевод её в режим аудита убирает задержку и снимает контроль, развёрнутый организацией, поэтому считайте это неправильным исправлением. Более узкие варианты — изменение маршрутизации, чтобы ответчик был доступен через туннель, исключение в раздельном туннелировании для хостов ответчика, исправление DNS, когда имя разрешается в недоступный адрес, или поддерживаемый кэширующий прокси для данных об отзыве. У каждого свой владелец: команда PKI отвечает за доступность ответчика, сетевая команда — за разделение туннеля, а команда конечных точек — за политику.

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

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

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

Get-WinEvent -LogName Microsoft-Windows-CodeIntegrity/Operational -MaxEvents 40 |
  Where-Object { $_.TimeCreated -gt (Get-Date).AddMinutes(-10) }
Get-ChildItem C:\Windows\System32\CodeIntegrity\CiPolicies\Active
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard

Исправленная конфигурация по-прежнему обращается к ответчику или использует кэширующий путь, одобренный вашей командой PKI, а журнал показывает, что проверка завершается, а не истекает по времени. Подтвердите, что недавно подписанное приложение всё ещё запускается, потому что политика, разрешающая всё, не является успешным исправлением. Проверьте также папку активной политики и состояние применения, чтобы было известно, что отлаживаемая политика — та, которая работает. Держите цепочку сертификатов, адрес ответчика и отметки времени запуска в одном тикете, потому что продление обычно перемещает ответчика и оставляет правило исключения или DNS устаревшим.

Похожие статьи