Насколько безопасно использовать ConvertTo-SecureString в PowerShell?

Рейтинг: 1Ответов: 1Опубликовано: 07.02.2023

Я делаю функцию в PowerShell. В ней вызывается команда, в которую нужно вставить пароль.

Сейчас пароль задается так:

$Password = Read-Host -AsSecureString "Password"

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

$Password = ConvertTo-SecureString "PasswordStringFromFunctionParameter" -AsPlainText -Force

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

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

Можете объяснить насколько вообще опасно появления строкового пароля в логах? Что именно за логи? Если это какие-то логи запущенного PowerShell'а, которые отчищаются после перезапуска, то вроде звучит достаточно безопасно.

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

Ответы

▲ 1Принят

Давайте предположим, что наступила временная дисфункция системы выполнения PS-скриптов по ряду причин, и функция ConvertTo-SecureString перестала корректно работать. Например, добавьте любой лишний параметр в Вашем примере. На выходе исполнения можно наблюдать текст:

строка:1 
знак:13 + $Password = ConvertTo-SecureString "PasswordStringFromFunctionParameter ... 

То есть в лог ошибок может легко попасть результат вызова функции вместе с параметрами.

Также каждый процесс во время работы хранит строку запуска: command line, а параллельные процессы могут получить доступ к этим данным. Пример получения доступа:

Get-WmiObject Win32_Process | select name, commandline

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