2014-10-05 8 views
2

외부 파일에 암호가 설정된 경우 보안 자격 증명으로 WinSCP .NET 어셈블리를 사용하려고합니다. 하드 코드 된 암호의 작업으로PowerShell이 ​​보안 자격 증명으로 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/" 

. 암호에 securestring을 사용하려면 어떻게해야합니까?

내가 시도 :

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} 

를하지만 암호 속성은 문자열을 지원 WinSCP에 따르면 ...

답변

1

을 작동하지 않습니다 : 그런 다음 내 스크립트에, 나는 그것을 다시 얻을. 보안 문자열을 전달하려고하면 작동하지 않습니다. 이 실제로 인 경우 암호를 파일에 저장하려는 경우 보안 문자열로 저장하려고 시도 할 수 있지만 일반적으로는 쉽게 보안되지 않을 수도 있으므로 일반적으로 really bad idea입니다 (가능한 경우 확실하지 않음). 나는 다음의 옵션을 추천한다.

# 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 

Ansgar가 내가 모르는 것을 설명합니다. 보안 문자열을 파일에 저장하고 다른 곳에서 사용할 수 있습니다.

+0

WinSCP .NET 어셈블리는 이미 'SecureString'을 지원합니다. [my answer] (http://stackoverflow.com/a/26279430/850848)를 참조하십시오. –

2

@Matt으로 지적했듯이 WinSCP .Net 어셈블리는 보안 문자열이나 자격 증명 개체를 허용하지 않습니다. 비밀번호를 일반 텍스트 문자열로 전달해야합니다.

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

를하고 파일에서 읽어 후 보안 문자열에서 해독 된 암호를 검색 할 PSCredential 객체를 사용 : 당신은하지만, 파일에 secure string를 저장할 수

$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에 documentation에서 가져온 샘플 코드

그러나 암호는 해당 사용자의 암호에서 파생되므로 SFTP PowerShell 스크립트를 실행하는 사용자가 암호를 저장해야합니다.

+0

WinSCP .NET 어셈블리는 이미 'SecureString'을 지원합니다. [my answer] (http://stackoverflow.com/a/26279430/850848)를 참조하십시오. –

+0

'SecureString' 지원을 추가하기 전에 제가 대답을 쓰고있는 시점에 있지 않았습니다. ;) 당신의 일에 대해 대단히 감사합니다. –

+0

그것이 내가 "이미"쓴 이유입니다. :) –

3

WinSCP 5.7 이후 어셈블리는 SessionOptions.SecurePassword을 사용하여 SecureString을 허용합니다.

this improvement 영감을위한 https://winscp.net/eng/docs/library_sessionoptions

감사를 참조하십시오.

어셈블리는 암호를 메모리에 암호화 된 상태로 유지하지만 암호를 해독해야합니다. 암호 해독 된 암호의 내부 사본을 제한하는 개선이 보류 중입니다.