среда, 29 января 2020 г.

Экспорт и импорт учётных данных в PowerShell

При использовании PowerShell для автоматизации процессов очень удобным инструментом является снипет подобного вида:
$credentials = @{
    production = Get-Credential -Message 'Please enter production server credentials'
    testing = Get-Credential -Message 'Please enter testing server credentials'
    development = Get-Credential -Message 'Please enter development server credentials'
}
$credentials | Export-Clixml -Path "${env:\userprofile}\passwd.xml"
Он позволяет хранить учётные данные за пределами основного скрипта в зашифрованном виде. Для получения данных сохранённых в файле passwd.xml можно в основном скрипте использовать подобную конструкцию:
$credentials = Import-Clixml -Path "${env:\userprofile}\passwd.xml"
$devUserName = $credentials."development".UserName
$devPassword = $credentials."development".Password
У такого подхода есть только один недостаток, для шифрования паролей используются идентификаторы текущего компьютера и пользователя, что делает невозможным перенос файла с паролями на другой компьютер или передачу его другому пользователю.
Я не первый, кто задумался о необходимости подобного функционала, поэтому воспользуемся результатами чужого труда для достижения необходимых результатов.
Для создания файла с паролями нужно выполнить вот такой скрипт:
$passwdFile = "${env:\userprofile}\passwd.xml"
Function Export-Credential {
    Param ([PSCredential] $Credential)
    $Key = New-Object Byte[](32)
    $Rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::Create()
    $Rng.GetBytes($Key)
    return New-Object PSObject -Property @{
        Username = $Credential.UserName
        Password = ConvertFrom-SecureString -SecureString $Credential.Password -Key $Key
        Key = $Key
    }
}
$credentials = @{
    production = Export-Credential (Get-Credential -Message 'Please enter production server credentials')
    testing = Export-Credential (Get-Credential -Message 'Please enter testing server credentials')
    development = Export-Credential (Get-Credential -Message 'Please enter development server credentials')
}
$credentials | Export-Clixml $passwdFile
Он запросит учётные данные у пользователя, зашифрует их и сохранит в файл passwd.xml
Для импорта сохранённых подобным образом данных в основном скрипте используется следующий код:
$passwdFile = "$PSScriptRoot\passwd.xml"
$rawCredentials = Import-Clixml $passwdFile
$devCredentials = New-Object System.Management.Automation.PSCredential($rawCredentials.'development'.Username, (ConvertTo-SecureString -String $rawCredentials.'development'.Password -Key $rawCredentials.'development'.Key))
Не стоит быть уверенным, что пароли сохранённые подобным образом, будь они зашифрованы с использованием идентификатора пользователя или же собственным ключом, абсолютно безопасно использовать где угодно. В обоих случаях можно получить пароль в открытом виде, выполнив команду
$devCredentials.GetNetworkCredential().password
Так что нужно очень аккуратно подходить к тому, где хранится файл с сохранёнными паролями и насколько хороший пароль от вашей учётной записи и записи Администратора домена (компьютера).

Комментариев нет:

Отправка комментария