SecureString в файле "случайно" перестает работать - PullRequest
6 голосов
/ 03 марта 2020

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

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

Write-Output "Please enter the username of the SFTP user."
$username = Read-Host
Write-Output "Please enter the password of the SFTP user"
$password = Read-Host -AsSecureString
$username | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "$scriptroot\Credentials.dat"
$password | ConvertFrom-SecureString | Out-File -Append "$scriptroot\Credentials.dat"

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

Я не понимаю, почему это перестает работать снова и снова, и я не уверен, что делать об этом. Кто-нибудь знает способ выяснить, почему дешифрование перестает работать из-за моего выхода из системы? Скрипт даже не запускается под моим собственным пользователем, он выполняется как запланированное задание, которое выполняется под совершенно другим пользователем AD.

Я также читал, что Microsoft больше не рекомендует использовать SecureString для новых проектов, но что потом альтернатива, которая может быть использована вместо? Как еще я должен безопасно хранить учетные данные пользователя в файле, не имея какого-либо ключа расшифровки в виде простого текста, хранящегося в сценарии или в другом файле где-нибудь?

1 Ответ

1 голос
/ 03 марта 2020

Действительно странно, что дешифрование просто перестает работать, это звучит экологично. Однако, почему вы делаете это, вот так ...

Write-Output "Please enter the username of the SFTP user."
$username = Read-Host
Write-Output "Please enter the password of the SFTP user"
$password = Read-Host -AsSecureString
$username | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "$scriptroot\Credentials.dat"
$password | ConvertFrom-SecureString | Out-File -Append "$scriptroot\Credentials.dat"

... против того, чтобы идти по этим маршрутам.

$UserCreds = Get-Credential -Message 'Please enter the username of the SFTP credentials'
$UserCreds.GetNetworkCredential().UserName
$UserCreds.GetNetworkCredential().Password
<#
# Results

postanote
password
#>

Или вот так,

Get-Credential -Message 'Please enter the username of the SFTP credentials.' | 
Export-Clixml -Path 'D:\temp\SFTPUserCreds.xml'
Get-Content -Path 'D:\temp\SFTPUserCreds.xml'
<#
# Results

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">postanote</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb01000000bd0a9dd27ffa41419fb2b289838ebe6400000000020000000000106600000001000020000000ad2e4c96413a3e93e461f600e98f72aa5
e3493bde41ac40491bfd4bedc462152000000000e8000000002000020000000e0016657a9f6e545b55876fa8095143c08046f1361baec0f693a1e823cc6ee0d200000006949857c09b23099dab66fdc3a7e4f7637970dbd3aa13
be11fda7c8de63df70e40000000f9a266cbb34440f64d9a2bdeaaec3a6cda483138e0be29323ca0a523ac475e169793557e74dd208e3d4292aa4fbe5b90fc7023d41c4dd6d01f819366e0587885</SS>
    </Props>
  </Obj>
</Objs>
#>

расшифровка не требуется, просто передайте имена переменных

($UserCreds = Import-Clixml -Path 'D:\Temp\SFTPUserCreds.xml')
<#
# Results

UserName                      Password
--------                      --------
postanote System.Security.SecureString
#>

Или вот так

Get-Credential -Message 'Please enter the username of the SFTP credentials.' | 
Export-PSCredential -RegistryPath 'HKCU:\software\SFTP' -Name SFTPUserCreds
$UserCred = Import-PSCredential -RegistryPath 'HKCU:\Software\SFTP' -Name SFTPUserCreds

# Or just use Windows Credential Manager
Find-Module -Name '*CredentialManager*' | Format-Table -AutoSize

Version Name                          Repository Description                                                                        
------- ----                          ---------- -----------                                                                        
2.0     CredentialManager             PSGallery  Provides access to credentials in the Windows Credential Manager                   
...

Так что, даже исходя из того, что вы прочитали о SecureString, это все еще вещь для большинства людей, хотя на основании того, что я показываю выше, я не уверен, почему.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...