Главная

Wednesday, 7 September 2022

Шифрование данных в PowerShell.

Всем привет.

С помощью PowerShell можно не только защитить конфиденциальные данные, но и использовать другие возможности командлетов, таких, как Invoke-Command или New-PSSession. Я покажу вам, насколько просто шифровать или дешифровать данные в PowerShell и как можно использовать зашифрованные данные для создания данных учетных записей.

В PowerShell командлеты ConvertTo-SecureString и ConvertFrom-SecureString можно использовать для шифрования и дешифрования стандартной строки System.String в System.Security.SecureString.

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

data = "This is some extremely important data"

$encryptedData = ConvertTo-SecureString -String $data -AsPlainText

Если мы введем имя переменной, содержащей зашифрованную строку, то увидим ее тип System.Security.SecureString

Мы также можем расшифровать данные, хранящиеся в объекте System.Security.SecureString, следующим образом:

ConvertFrom-SecureString -SecureString $encryptedData -AsPlainText


Ремарка - это справедливо для Powershell версии 7.2+.

Командлеты, которые определяют параметр Credential, позволяют нам указать учетные данные, под которыми должен запускаться командлет. Значение, передаваемое параметру Credential, должно быть объектом PSCredential. И для того, чтобы мы могли создать объект PSCredential, нам нужны имя пользователя и пароль в виде защищенной строки, что означает, что нам нужно будет зашифровать пароль.

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

Поэтому вместо этого пароль следует считывать со стандартного потока stdn и сохранять в переменной. Командлет Read-Host, который позволяет считывать данные со стандартного потока, имеет параметр AsSecureString, который преобразует для нас данные, считанные со стандартного потока, в System.Security.SecureString.

С помощью следующего кода PowerShell можно считывать данные со стандартного ввода и сохранять их в переменной в виде защищенной строки:

$password = Read-Host -AsSecureString

Затем мы можем взять эту безопасную строку и создать требуемый объект PSCredential:

$Cred = New-Object System.Management.Automation.PSCredential("domain\user", $password)

Теперь мы можем использовать этот объект PSCredential с командлетами, позволяющими указать параметр Credential. Вот как я выполняю командлет Invoke-Command на удаленной машине с WinRM от имени другого пользователя, используя созданный нами PSCredential:

Invoke-Command -Credential $Cred -ScriptBlock { whoami } -ComputerName AlienHost

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?