PowerShell для использования сборки WinSCP .NET с безопасными учетными данными

Я пытаюсь использовать сборку WinSCP .NET с безопасными учетными данными, когда пароль защищен во внешнем файле.

# Load WinSCP .NET assembly
Add-Type -Path "D:\WinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp

# Env
$sessionOptions.HostName = "blabla.com"
$sessionOptions.UserName = "UUUU"
#$sessionOptions.Password = "PPPP"
$sessionOptions.SshHostKeyFingerprint = "XXXXXXXXX"
$remotePath = "/home/UUUU/"

С жестко закодированным паролем он работает. Если я хочу использовать безопасную строку для пароля, как мне это сделать?

Я пытался:

read-host -assecurestring | convertfrom-securestring | out-file D:\securestring.txt

Чтобы сохранить безопасный пароль в файле. Затем в своем скрипте я возвращаю его:

$sessionOptions.Password = get-Content D:\securestring.txt | convertto-securestring

$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $sessionOptions.UserName, $sessionOptions.Password}

Но не работает ...


person yaniv    schedule 05.10.2014    source источник


Ответы (3)


Начиная с WinSCP 5.7, сборка принимает SecureString с использованием SessionOptions.SecurePassword.

См. https://winscp.net/eng/docs/library_sessionoptions.

Спасибо за вдохновение для этого улучшения.

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

person Martin Prikryl    schedule 09.10.2014

Как указано в @Matt, сборка WinSCP .Net не принимает защищенные строки или объекты учетных данных. Вам необходимо передать пароль в виде простой текстовой строки. Однако вы можете сохранить защищенную строку в файле:

Read-Host 'Enter password' -AsSecureString |
  ConvertFrom-SecureString |
  Out-File 'C:\password.txt'

и используйте объект PSCredential для получения дешифрованного пароля из защищенной строки после того, как вы прочитаете его из файла:

$un   = 'username'
$pw   = Get-Content 'C:\password.txt' | ConvertTo-SecureString
$cred = New-Object Management.Automation.PSCredential $un, $pw

try {
  Add-Type -Path 'WinSCPnet.dll'

  $opt = New-Object WinSCP.SessionOptions
  $opt.Protocol = [WinSCP.Protocol]::Sftp
  $opt.HostName = 'example.org'
  $opt.UserName = $cred.UserName
  $opt.Password = $cred.GetNetworkCredential().Password
  $opt.SshHostKeyFingerprint = 'ssh-rsa 2048 ...'

  $sftp = New-Object WinSCP.Session

  $sftp.Open($opt)
  ...
} catch {
  ...
} finally {
  if ($sftp) { $sftp.Dispose() }
}

Пример кода WinSCP взят из документации.

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

person Ansgar Wiechers    schedule 05.10.2014
comment
Сборка WinSCP .NET уже поддерживает SecureString, см. мой ответ. - person Martin Prikryl; 02.06.2015
comment
Этого не было в тот момент, когда я писал свой ответ, до того, как вы добавили SecureString поддержку. ;) Большое спасибо за вашу работу, BTW. - person Ansgar Wiechers; 02.06.2015

Согласно WinSCP свойство пароля просто поддерживает строку. Таким образом, попытка передать безопасную строку не сработает. Если вы действительно хотите сохранить пароль в файле, вы можете попытаться сохранить его как защищенную строку, но это действительно плохая идея в целом, так как ее можно так же легко снять с защиты (также не уверен, возможно ли это). Рекомендую следующий вариант.

# Only stored in memory which is safer.
$sessionOptions.Password = read-host

Если вы настроены на что-то еще, вы можете попробовать это. Просто знайте, по предыдущим причинам я не одобряю это. Также мне нужно посмотреть, работает ли это вообще, потому что похоже, что вы не можете вывести securestring в файл.

read-host | out-file D:\securestring.txt
$sessionOptions.Password = get-Content D:\securestring.txt

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

person Matt    schedule 05.10.2014
comment
Сборка WinSCP .NET уже поддерживает SecureString, см. мой ответ. - person Martin Prikryl; 02.06.2015