PowerShell
秘密と資格の取り扱い
サーチ…
前書き
Powershellでは、パスワードを平文で保存するのを避けるため、さまざまな暗号化方法を使用し、安全な文字列として保存します。キーまたはセキュアキーを指定していない場合、これは同じコンピュータ上の同じユーザーがKeys / SecureKeysを使用していない場合にのみ暗号化された文字列を復号化できるようになります。同じユーザーアカウントで実行されるプロセスは、その同じマシン上でその暗号化された文字列を復号化することができます。
資格情報の入力を求めるプロンプト
資格情報を要求するには、ほとんどの場合、 Get-Credential
コマンドレットを使用する必要があります。
$credential = Get-Credential
あらかじめ入力されたユーザー名:
$credential = Get-Credential -UserName 'myUser'
カスタムプロンプトメッセージを追加する:
$credential = Get-Credential -Message 'Please enter your company email address and password.'
プレーンテキストパスワードへのアクセス
信任状オブジェクトのパスワードは暗号化された[SecureString]
です。最も簡単な方法は、暗号化されたパスワードを保存しない[NetworkCredential]
を取得することです。
$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password
ヘルパーメソッド( .GetNetworkCredential()
)は、 [PSCredential]
オブジェクト上にのみ存在します。
[SecureString]
を直接処理するには、.NETメソッドを使用します。
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
ストアドクレデンシャルの操作
暗号化された資格情報を簡単に保存して取得するには、PowerShellの組み込みXMLシリアル化(Clixml)を使用します。
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
再インポートするには:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
重要なことは、デフォルトではWindowsのデータ保護APIを使用し、パスワードを暗号化するために使用されるキーは、コードが実行されているユーザーとマシンの両方に固有のことです。
その結果、暗号化された信任状は、別のユーザーや別のコンピュータの同じユーザーによってインポートされません。
実行中の異なるユーザーと異なるコンピューターで同じ信任状の複数のバージョンを暗号化することにより、複数のユーザーが同じシークレットを使用できるようになります。
ユーザー名とコンピュータ名をファイル名に入れることで、暗号化されたすべての秘密を、同じコードがハードコーディングなしで使用できるように格納することができます。
Encrypter
# run as each user, and on each computer
$credential = Get-Credential
$credential | Export-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
保存された資格情報を使用するコード:
$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
実行中のユーザーのファイルの正しいバージョンが自動的にロードされます(または、ファイルが存在しないために失敗します)。
暗号化されたフォームに資格情報を格納し、必須のときにパラメータとして渡す
$username = "[email protected]"
$pwdTxt = Get-Content "C:\temp\Stored_Password.txt"
$securePwd = $pwdTxt | ConvertTo-SecureString
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored and you can pass it wherever you want.
## Import Password with AES
$username = "[email protected]"
$AESKey = Get-Content $AESKeyFilePath
$pwdTxt = Get-Content $SecurePwdFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Key $AESKey
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored with AES Key and you can pass it wherever you want.