PowerShellで暗号化したパスワードファイルを作成する方法

こんにちは。
けいぞうです。

今回は、「PowerShellで暗号化したパスワードファイルを作成する方法」に関する記事です。

「プログラム中にパスワードを直書きすると良くないけど、どうやって暗号化して外だししたらいいんだろう?」

こんな疑問に答えていきたいと思います。

PowerShellの認証情報の保持方法について

PowerShellには「PSCredential」という型のオブジェクトが存在していて、これはズバリ認証情報を持つためのオブジェクトです。

このPSCredentialオブジェクトに、ユーザーのユーザー名とパスワードを保持させます。

使い方は以下のような感じになります。

$Credential = Get-Credential

この「Get-Credential」コマンドレットで取得できる情報が資格情報、すなわち「PSCredential」になります。このコマンドを実行すると、以下のようなポップアップが表示されて、ユーザー名とパスワードを入力することができます。

入力すると、$Credentialに資格情報が保持されるということです。繰り返しになりますが、$Credentialの方は「PSCredential」です。

ではこの、$Credentialの中身を見てみましょう。

たとえば、このダイアログにユーザー名「keizou」で、パスワード「password」と入れたとします。

その状態で、$Credentialの中身を見てみると、このように見えます。

このように、UserNameは見えますが、Passwordは「SecureString」となっていて、見ることができません。

「PSCredential」はこのように、パスワードを渡してあげたら、セキュアな状態で保持してくれるオブジェクトなのです。

PSCredentialのパスワードを平文に戻すには「GetNetworkCredential()」というメソッドを使います。

パスワードファイルの作成方法

では、この資格情報を使って、暗号化されたパスワードをパスワードファイルとして外だしする方法を見ていきます。

以下、サンプルスクリプトになります。

# 認証情報の生成
$Credential = Get-Credential
# パスワードファイルパス
$PasswordFile = "C:\work\PasswordFile.pass"
# パスワードファイルの生成
$Credential.Password | ConvertFrom-SecureString | Set-Content $PasswordFile

「$Credential.Password」のままだと、SecureStringと表示されるだけで、いわゆ保護された状態なので、これをファイル出力すると意味のない文字列になってしまいます。

これを、標準的な暗号化された文字列に変換するコマンドが「ConvertFrom-SecureString」になります。

これを「Set-Content」で渡してあげれば、指定した場所に暗号化した文字列として、ファイルにパスワードを外だしすることができます。

パスワードファイルからパスワードを複合する方法

今度は逆にファイルに保存されたパスワードファイルの暗号されている文字列を取得して、複合する方法です。

以下、サンプルスクリプトです。

# パスワードファイルパス
$PasswordFile = "C:\work\PasswordFile.pass"
# パスワードファイルからセキュアなパスワードを取得
$SecurePassWord = Get-Content $PasswordFile | ConvertTo-SecureString
# 認証情報を生成(ユーザー名はダミー)
$Credential = New-Object System.Management.Automation.PSCredential \"dummy\", $SecurePassword
# 平文を取得
$Credential.GetNetworkCredential().Password

逆に標準的な暗号化されたパスワードを、SecureStringに変換するコマンドレットが「ConvertTo-SecureString」になります。

これを、PSCredentialに一旦戻してあげているのが、8行目です。

ユーザー名は一旦何でもいいので、dummyとしています。

後は、最初の章で説明した「GetNetworkCredential()」メソッドを実行してあげれば、パスワードファイルから取得した文字列を平文に戻すことができます。