Обучение
Сертификация
Продемонстрировать основы безопасности данных, управления жизненным циклом, информационной безопасности и соответствия требованиям для защиты развертывания Microsoft 365.
Этот браузер больше не поддерживается.
Выполните обновление до Microsoft Edge, чтобы воспользоваться новейшими функциями, обновлениями для системы безопасности и технической поддержкой.
В этой статье объясняется, как управление приложениями для бизнеса защищает PowerShell и накладывает ограничения. Безопасное поведение PowerShell зависит от используемой версии Windows и PowerShell.
PowerShell обнаруживает как AppLocker, так и управление приложениями для бизнес-систем. AppLocker устарел. Управление приложениями — это предпочтительная система управления приложениями для Windows.
PowerShell использует устаревший API управления WldpGetLockdownPolicy
приложениями для обнаружения двух элементов:
None
, Audit
Enforce
None
( Audit
разрешено политикой), Enforce
(запрещено политикой)Все версии PowerShell (версии 5.1 — v7.x) поддерживают обнаружение этой политики управления приложениями.
Элемент управления приложениями представил новые API в последних версиях Windows. Начиная с версии 7.3 PowerShell использует новый WldpCanExecuteFile
API для определения того, как следует обрабатывать файл. Windows PowerShell 5.1 не поддерживает этот новый API. Новый API имеет приоритет над устаревшим API для отдельных файлов.
Однако PowerShell продолжает использовать устаревший API для получения конфигурации системной политики. Если новый API недоступен, PowerShell возвращается к старому поведению API.
Новый API предоставляет следующие сведения для каждого файла:
WLDP_CAN_EXECUTE_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
PowerShell может выполняться как в интерактивных, так и неинтерактивных режимах.
PowerShell выполняет команды в ConstrainedLanguage
режиме. Этот режим запрещает интерактивным пользователям выполнять определенные команды или выполнять произвольный код. Дополнительные сведения об ограничениях в этом режиме см . в разделе ограничений PowerShell в разделе политики блокировки этой статьи.
Когда PowerShell запускает скрипт или загружает модуль, он использует API управления приложениями для получения применения политики для файла.
PowerShell версии 7.3 или более поздней использует WldpCanExecuteFile
API, если он доступен. Этот API возвращает один из следующих результатов:
WLDP_CAN_EXECUTE_ALLOWED
: файл утвержден политикой и используется в FullLanguage
режиме с несколькими ограничениями.WLDP_CAN_EXECUTE_BLOCKED
: файл не утвержден политикой. PowerShell выдает ошибку при запуске или загрузке файла.WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
: файл не утвержден политикой, но он по-прежнему может быть запущен или загружен в ConstrainedLanguage
режиме.В Windows PowerShell 5.1 или если WldpCanExecuteFile
API недоступен, поведение PowerShell для каждого файла —
None
: файл загружается в FullLanguage
режиме с несколькими ограничениями.Audit
: файл выполняется или загружается в FullLanguage
режиме без ограничений. В PowerShell 7.4 или более поздней версии сведения об ограничениях политики записываются в журналы событий Windows.Enforce
: файл выполняется или загружается в ConstrainedLanguage
режиме.Если PowerShell обнаруживает, что система находится под политикой блокировки управления приложениями, она применяет ограничения, даже если скрипт является доверенным и запущен в FullLanguage
режиме. Эти ограничения препятствуют известному поведению PowerShell, что может привести к произвольному выполнению кода в заблокированной системе. Политика блокировки применяет следующие ограничения:
Определение точки модуля с ограничением экспорта функции подстановочных знаков
Любой модуль, использующий метод dot-sourcing и экспорт функций с помощью подстановочных знаков, приводит к ошибке. Блокировка экспорта подстановочных знаков предотвращает внедрение скрипта от вредоносного пользователя, который может посадить ненадежный скрипт, который получает dot-sourced в доверенный модуль. Затем вредоносный скрипт может получить доступ к частным функциям доверенного модуля.
Рекомендация по безопасности. Никогда не используйте dot-sourcing скрипта в модуле и всегда экспортируйте функции модуля с явными именами (без подстановочных знаков).
Вложенный модуль с ограничением экспорта функции подстановочного знака
Если родительский модуль экспортирует функции с помощью подстановочных знаков имени функции, PowerShell удаляет любое имя функции в вложенном модуле из списка экспорта функций. Блокировка экспорта подстановочных знаков из вложенных модулей предотвращает случайное экспорт опасных вложенных функций с помощью сопоставления имен подстановочных знаков.
Рекомендация по безопасности. Всегда экспортируйте функции модуля с явными именами (без подстановочных знаков).
Преобразование типа параметра интерактивной оболочки
Если система заблокирована, интерактивные сеансы PowerShell выполняются в ConstrainedLanguage
режиме, чтобы предотвратить произвольное выполнение кода. Доверенные модули, загруженные в сеанс, выполняются в FullLanguage
режиме. Если командлет доверенного модуля использует сложные типы для его параметров, преобразование типов во время привязки параметров может завершиться ошибкой, если преобразование не разрешено через границы доверия. Сбой возникает при попытке PowerShell преобразовать значение путем запуска конструктора типов. Конструкторы типов не могут выполняться в ConstrainedLanguage
режиме.
В этом примере преобразование типа привязки параметров обычно допускается, но завершается сбоем при выполнении в ConstrainedLanguage
режиме. Конструктор ConnectionPort
типов не допускается:
PS> Create-ConnectionOnPort -Connection 22
Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22"
value of type "System.Int32" to type "ConnectionPort".
Enter-PSHostProcess
Командлет запрещен
Командлет Enter-PSHostProcess
отключен и вызывает ошибку при использовании. Эта команда используется для сеансов присоединения и отладки. Он позволяет подключаться к любому другому сеансу PowerShell на локальном компьютере. Командлет отключен, чтобы предотвратить раскрытие информации и произвольное выполнение кода.
Скрипт или функция, которая не утверждена политикой управления приложениями, недоверена. При выполнении ненадежной команды PowerShell блокирует выполнение команды (новое поведение) или выполняет команду в ConstrainedLanguage
режиме. Следующие ограничения применяются к режиму ConstrainedLanguage
:
Add-Type
Командлет запрещен
Блокировка Add-Type
предотвращает выполнение произвольного кода .NET.
Import-LocalizedData
Ограниченный командлет
Блокировка параметра Import-LocalizedData
SupportedCommand предотвращает выполнение произвольного кода.
Invoke-Expression
Ограниченный командлет
Все блоки скриптов, передаваемые командлету Invoke-Expression
, выполняются в ConstrainedLanguage
режиме, чтобы предотвратить произвольное выполнение кода.
New-Object
Ограниченный командлет
Командлет New-Object
ограничен использованием только разрешенных типов .NET и COM, чтобы предотвратить доступ к ненадежным типам.
ForEach-Object
Ограничение командлета
Вызов метода type для переменных, передаваемых в него ForeEach-Object
, запрещен для любого типа .NET, не в утвержденном списке. Как правило, режим запрещает вызов любого метода объекта, ConstrainedLanguage
за исключением утвержденных типов .NET, чтобы предотвратить доступ к ненадежным типам .NET.
Export-ModuleMember
Ограничение командлета
Использование Export-ModuleMember
командлета для экспорта функций в файл скрипта вложенного модуля, в котором дочерний модуль не является доверенным, и родительский модуль является доверенным, приводит к ошибке. Блокировка этого сценария предотвращает экспорт вредоносных ненадежных модулей из доверенного модуля.
New-Module
Ограничение командлета
При выполнении New-Module
в доверенном скрипте любой блок скрипта, предоставленный ScriptBlock
параметром, помечается для запуска в ConstrainedLanguage
режиме, чтобы предотвратить внедрение произвольного кода в контекст доверенного выполнения.
Configuration
ключевое слово не разрешено
Ключевое Configuration
слово языка не допускается в ConstrainedLanguage
режиме предотвращения атак внедрения кода.
class
ключевое слово не разрешено
Ключевое class
слово языка не допускается в ConstrainedLanguage
режиме, чтобы предотвратить внедрение произвольного кода.
Ограничения области обработки блоков скриптов
Дочерние блоки скриптов не могут выполняться в области блоков родительского скрипта, если блоки скриптов имеют разные уровни доверия. Например, вы создаете дочерние отношения при создании одно из них в другой. Блокировка этого сценария предотвращает доступ к опасным функциям в области доверенных сценариев ненадежным скриптом.
Предотвращение обнаружения команд ненадежных функций скриптов
Обнаружение команд PowerShell не возвращает функции из ненадежного источника, например ненадежного скрипта или модуля, в надежную функцию. Блокировка обнаружения недоверенных команд предотвращает внедрение кода с помощью посадки команд.
Не разрешено преобразование хэш-файла в объект
ConstrainedLanguage
Режим блокирует хэш-таблицы преобразования объектов в Data
разделах файлов данных PowerShell,.psd1
чтобы предотвратить потенциальные атаки на внедрение кода.
Ограничение автоматического преобразования типов
ConstrainedLanguage
Режим блокирует автоматическое преобразование типов, за исключением небольшого набора утвержденных безопасных типов, чтобы предотвратить потенциальные атаки на внедрение кода.
Ограничение экспорта неявных функций модуля
Если модуль явно не экспортирует функции, PowerShell неявно экспортирует все определенные функции модуля автоматически в качестве удобной функции. В ConstrainedLanguage
режиме неявный экспорт больше не происходит при загрузке модуля через границы доверия. Блокировка неявного экспорта предотвращает непреднамеренное воздействие опасных функций модуля, не предназначенных для общедоступного использования.
Файлы скриптов не могут быть импортированы в виде модулей
PowerShell позволяет импортировать файлы скриптов (.ps1
) в виде модуля. Все определенные функции становятся общедоступными. ConstrainedLanguage
Режим блокирует импорт файла скрипта, чтобы предотвратить непреднамеренное воздействие опасных функций скрипта.
Установка ограничения переменных AllScope
ConstrainedLanguage
режим отключает возможность установки AllScope
переменных. Ограничение области переменных предотвращает вмешательство переменных в состояние сеанса доверенных команд.
Вызов метода Type не разрешен
ConstrainedLanguage
Режим не разрешает вызов метода для неутвержденных типов. Блокировка методов для неутвержденных типов предотвращает вызов методов типа .NET, которые могут быть опасными или разрешать внедрение кода.
Методы задания свойств type не разрешены
ConstrainedLanguage
режим ограничивает вызов методов задания свойств в неутвержденных типах. Блокировка наборов свойств для неутвержденных типов предотвращает атаки на внедрение кода.
Не разрешено создание типов
ConstrainedLanguage
Режим блокирует создание типа для неутвержденных типов, чтобы блокировать ненадежные конструкторы, которые могут разрешить внедрение кода.
Оператор области модуля не разрешен
ConstrainedLanguage
в режиме не допускается использование оператора области модуля. Например: & (Get-Module MyModule) MyFunction
. Блокировка оператора области модуля запрещает доступ к частным функциям и переменным модуля.
Отзыв о PowerShell
PowerShell — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Обучение
Сертификация
Продемонстрировать основы безопасности данных, управления жизненным циклом, информационной безопасности и соответствия требованиям для защиты развертывания Microsoft 365.
Документация
Использование элемента управления приложениями для защиты PowerShell - PowerShell
В этой статье объясняется, как настроить и использовать управление приложениями для защиты PowerShell.
Использование элемента управления приложениями для защиты PowerShell - PowerShell
В этой статье описываются функции управления приложениями, которые можно использовать для защиты среды PowerShell.
Функции безопасности PowerShell - PowerShell
В PowerShell доступно несколько функций, предназначенных для повышения безопасности среды написания скриптов.