PowerShellスクリプトで特権を使用したい。
だけどパスワードを埋め込みたくない…!!
よしんば自分の端末だけで利用するならともかく、
利用者の使用する端末で管理者権限実行したい!でもパスワードは秘密にしたい!
そういう状況があったので色々やってみました。
以下忘備録
【他ユーザが復号できる形でパスワードを暗号化】
PowerShell
パスワード:p@ssw0rd
# パスワードをSecure-Stringにして保存
$Secure = ConvertTo-SecureString -String "p@ssw0rd" -AsPlainText -Force
# 暗号化用のバイト配列を作成(192bit)
# 今回は8bit*24個で192bitを用意。復号にも利用するため保管しておく。
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
#セキュアストリングを暗号化された標準文字列に変換
$encrypt = ConvertFrom-SecureString -SecureString $Secure -key $EncryptedKey
#暗号化された標準文字列をテキストに出力
$encrypt | Out-File c:\temp\encrypted.txt
# ちなみに、txtの中身はこんな感じ。
PS C:> $encrypt
76492d1116743f0423413b16050a5345MgB8AGEAQgBEAGcASQBBAGgAbABsAG0AagBqAEUAZwBhAGUARQA3AEgAYQBwAHcAPQA9AHwAOABmADYAYgAxAGM
AZQAxAGQAZgAxAGMAZgBmAGIAYQA1ADcAYwBkAGEAZgAxAGMAZABlAGMAYQAwAGYANQBhADYAOQAxADUAMwA2ADcAMwBlAGYANgBlADAAOQA4ADcAMgAxAG
MAMwA2ADUAZQBjADIAYwA4ADMAYgAwADUAMQA=
最初にSecure-Stringに変換したパスワードを
PowerShell
$encrypt = ConvertFrom-SecureString -SecureString $secure
で標準文字列にするパターンもあるが、それだと他のユーザが複合した際にエラーが出る。
【復号する】
PowerShell
暗号化パスワードファイルパス: C:\temp\encrypted.txt
#暗号化で使用したバイト配列を用意
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
#暗号化された標準文字列を読み込んで、Secure-Stringに変換
$importSecureString = Get-Content C:\temp\encrypted.txt | ConvertTo-SecureString -key $EncryptedKey
#Secure-Stringから文字列を取り出す
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($importSecureString)
$StringPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
#標準出力
write-host $StringPassword
p@ssw0rd
やったぜ。
そして平文にできた喜びから、平文にしたパスワード情報を使用してGet-Credentialで認証情報を作成しようとすると
PowerShell
$credential = New-Object System.Management.Automation.PsCredential "<MyDomain\User>", $StringPassword
New-Object : "PSCredential" のオーバーロードで、引数の数が "2" であるものが見つかりません。
発生場所 C:\Users\hogehoge\Runas.ps1:29 文字:9
+ $cred = New-Object System.Management.Automation.PsCredential $user,$S ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object]、MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
と、上記のようにエラーを吐くため注意。
ちゃんとSecure-Stringを使ってあげればOK。
参考になったサイト:https://github.com/senkousya/usingEncryptedStandardStringOnPowershell