Вопрос или проблема
У меня есть политика AppLocker, которая позволяет выполнять только скрипты, подписанные сертификатом моей компании. Это единственная политика для скриптов, никакая стандартная политика не создана.
Когда я запускаю консоль Windows PowerShell 5.1 или PowerShell 7 (пробовал все это в консоли и терминале) на машине с Windows 11, $ExecutionContext.SessionState.LanguageMode
возвращает правильно ConstrainedLanguage
(PowerShell 7 отображает эту информацию непосредственно при запуске)
У меня есть очень простой неподписанный скрипт:
$ExecutionContext.SessionState.LanguageMode
[System.Console]::WriteLine("Hello")
Когда я ввожу во второй строке консоли [System.Console]::WriteLine("Hello")
, я получаю ожидаемую ошибку:
Невозможно вызвать метод. Вызов метода поддерживается только на основных типах в этом режиме языка.
На строке:1 символ:1
+ [System.Console]::WriteLine("Hello")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodInvocationNotSupportedInConstrainedLanguage
Но когда я запускаю скрипт, вот вывод:
FullLanguage
Hello
Если я протестирую правило AppLocker с помощью
Get-AppLockerPolicy -Effective |
Test-AppLockerPolicy -Path C:\Tests\test.ps1 -User Install #("Install" - это мой тестовый пользователь)
Это возвращает правильно:
FilePath PolicyDecision MatchingRule
-------- -------------- ------------
C:\Tests\test.ps1 DeniedByDefault
Если я добавлю новое правило AppLocker, которое запрещает всем доступ ко всем путям, это правильно возвращается:
FilePath PolicyDecision MatchingRule
-------- -------------- ------------
C:\Tests\test.ps1 Denied *
и когда я запускаю скрипт, я получаю тот же результат, скрипт выполняется в режиме FullLanguage.
Если я вызываю скрипт внутри другого (или даже самого себя), несмотря на то, что первый скрипт все еще выполняется в режиме FullLanguage
, я получаю ожидаемое поведение для вызова скрипта:
C:\Tests\test.ps1: C:\Tests\test.ps1:3
Line |
3 | C:\Tests\test.ps1
| ~~~~~~~~~~~~~~~~~
| Термин 'C:\Tests\test.ps1' не распознается как имя командлета, функции, скриптового файла или исполняемой
| программы. Проверьте правильность написания имени, или, если был указан путь, убедитесь, что путь правильный, и попробуйте
| снова.
Если я применю политику Device Guard UMCI, сохранив свою политику AppLocker, скрипт корректно выполняется в режиме ConstrainedLanguage
. Это противоречит заявлению Microsoft (заблокированные скрипты вызывают ошибку 8007 в журнале событий, но выполняются в ограниченном режиме). Скриптовые файлы не являются участниками политики Device Guard UMCI, только подписывающий сертификат, и подписанные скрипты также выполняются в ContrainedLanguage
… но они должны выполняться в FullLanguage
…
Какая-либо идея, почему этот скрипт выполняется в режиме FullLanguage
несмотря на то, что он не подписан, и почему с политикой UMCI подписанный скрипт выполняется в режиме ContrainedLanguage
, несмотря на то, что подписывающий сертификат является частью обеих политик (UMCI и AppLocker)?
Спасибо
Ответ или решение
Вопрос о том, почему режим ограниченного языка PowerShell (Constrained Language Mode) не работает в скриптах, требует глубокого анализа настройки политик безопасности в Windows и поведения PowerShell. Рассмотрим все аспекты, связанные с вашей проблемой.
1. Контекст выполнения скрипта в PowerShell
Вы правильно указали, что режим языка PowerShell может изменяться в зависимости от контекста. Когда вы работаете в интерактивной сессии PowerShell, режим языка определяется настройками безопасности на уровне системы. В этом случае, если вы проверяете $ExecutionContext.SessionState.LanguageMode
и получаете значение ConstrainedLanguage
, это означает, что ваша текущая сессия действительно находится в ограниченном режиме.
Однако, при запуске скрипта PowerShell могут влиять дополнительные настройки, такие как правила AppLocker и политики UMCI (User Mode Code Integrity). Ваша проблема, когда скрипт выполняется в режиме FullLanguage
, несмотря на ожидания, может быть связана с тем, как AppLocker применяет свои правила.
2. Политики AppLocker и UMCI
Вы указали, что у вас есть политика AppLocker, которая разрешает только подписанные скрипты. Однако вы также заметили, что когда вы запускаете не подписанный скрипт, он выполняется в режиме FullLanguage
. Это может происходить, если AppLocker по какой-то причине не применяет свои ограничения должным образом.
Политики AppLocker контролируют выполнение приложений, включая PowerShell-скрипты, однако их реализация может зависеть от различных факторов, включая порядок применения правил. Убедитесь, что никаких конфликтующих правил не существует и что ваше правило действительно применимо к окружению, в котором вы работаете.
Политики UMCI также играют значительную роль. Если они настроены на блокировку определенного кода, это может привести к конфликтам с тем, что и как запускается из PowerShell. Когда вы вводите команду Get-AppLockerPolicy -Effective | Test-AppLockerPolicy
, это позволяет вам проверить, какие политики применяются и как они работают. Ожидание получения статуса DeniedByDefault
подразумевает, что ваши настройки AppLocker функционируют правильно.
3. Почему скрипт запускается в режиме FullLanguage
?
Причины, по которым ваш скрипт выполняется в режиме FullLanguage
, могут быть следующими:
- Кэширование или ошибка в политике AppLocker: Возможно, изменения в политике не были должным образом применены. Попробуйте перезагрузить систему, чтобы сбросить кэш и применить последние изменения.
- Проблемы с контекстом запуска: Убедитесь, что скрипт действительно запускается в контексте пользователя, который подчиняется всем правилам. Например, если вы работаете в режиме администратора, некоторые политики могут не применяться ожиданием.
- Конфликты с UMCI правилами: Поскольку вы упомянули, что применяете политику UMCI, это может создать дополнительные слои контроля, которые в конечном итоге влияют на запуск кода.
4. Заключение
Подводя итог, можно сказать, что необходимо проверить:
- Политики AppLocker на наличие конфликтов.
- Правила UMCI и их влияние на запуск скриптов.
- Возможные ошибки и кэш в привилегиях запуска.
Эти аспекты могут повлиять на режим, в котором выполняется скрипт PowerShell. Рекомендуется также использовать логирование и отладку, чтобы понять, каким образом и в какой момент нарушается ожидание применения режима ConstrainedLanguage
. В случае необходимости можно обратиться к документации Microsoft или сообществу, чтобы получить помощь по специфическим вопросам вашей конфигурации.