1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellスクリプトでパスワードを保存する方法

2022-01-04 20:17:56

はじめに

の作者は PowerShellリモート実行タスク の記事では、スクリプトでユーザー名とパスワードを使用する基本的な方法について言及しています。

$Username = 'xxxx'
$Password = 'yyyy'
$Pass = ConvertTo-SecureString $Password -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$Pass

なぜなら、ほんのわずかなセキュリティ要件でもある環境では、平文のパスワードは許されないからです。この記事では、PowerShellスクリプトでより安全な方法でパスワードを使用する方法について説明します。

パスワードをSecureStringに変換する

まず、次の2つの概念を理解することから始めましょう。

SecureString
Encrypted Standard String

SecureStringは.netの型の一つで、セキュリティのために特殊な文字列として設計されたものです。例えば、パスワードの文字列でSecureStringオブジェクトを作成すると、このオブジェクトで元のパスワードの文字列を復元することはできませんが、SecureStringオブジェクトをパスワードとして使用することは可能です。
Encrypted Standard Stringは、暗号化された文字列です。

ConvertTo-SecureString コマンドは、プレーンテキストの文字列から SecureString オブジェクトを作成します。

$SecurePwd = ConvertTo-SecureString "123456" -AsPlainText -Force

次に$SecurePwdを使用してCredentialなどのID情報を作成します。この方法は、筆者が入門編で使用したもので、スクリプトを閲覧できる人なら誰でもそこからパスワードが分かるので、安全ではありません。

SecureStringを暗号化文字列に変換する

ConvertFrom-SecureString コマンドを使用すると、SecureString オブジェクトを暗号化標準文字列に変換し、ファイルに保存できます。先に保存されたファイルは、クレデンシャルの作成時に直接使用されるため、システム上の平文パスワードを回避することができます。

$SecurePwd = ConvertTo-SecureString "123456" -AsPlainText -Force
ConvertFrom-SecureString $SecurePwd

上の画像は、ConvertFrom-SecureStringコマンドで生成された暗号化文字列をテキストファイルに保存したもので、これを

ConvertFrom-SecureString $SecurePwd | Out-File "D:\pwd.txt"

内容を見てください。

さて、次はpwd.txtファイルを使えばいいんですね。

もっと普通っぽい、安全なおすすめの使い方。

コピーコード コードは以下の通りです。
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "D:\pwd.txt"

この行のコマンドを実行すると、パスワードが要求されます:.

これは、平文のパスワード文字列の代わりに、キーボード入力を使用します。

ConvertFrom-SecureString コマンドの使用方法を紹介しましたが、ConvertTo-SecureString コマンドの別の使用方法として、暗号化された文字列を SecureString オブジェクトに変換することもできます。

$f = "D:\pwd.txt"
$SecurePwd = Get-Content $f | ConvertTo-SecureString
$SecurePwd.Length

今回は、ConvertTo-SecureString コマンドを使用して、pwd.txt ファイルの内容を SecureString オブジェクトに再生成しています。最後にパスワードの長さを Length プロパティで確認しました。

今回の主な用語とコマンドの関係を以下の図にまとめました。

<イグ

パスワードの正しいかけ方

スクリプトでパスワードを使用する際の推奨事項は以下のとおりです。

# Generate and save the password file
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "D:\pwd.txt"
# Create Credential information using the password file
$f = "D:\pwd.txt"
$Cred = New-Object -TypeName System.Management.Automation.PSCredential `
          -ArgumentList UserName, (Get-Content $f | ConvertTo-SecureString)

この使い方は、pwd.txtファイルを生成したマシンでしか使えないという欠点があります。他のマシンにコピーした場合、Get-Content $f | ConvertTo-SecureString を実行すると、以下のエラーが報告されます。

これはセキュリティ上の制限なので、他のマシンでpwd.txtを使いたい場合は、高度な使い方を理解する必要があるのです!

高度な遊び

ConvertTo-SecureString と ConvertFrom-SecureString の両コマンドは -Key オプションをサポートしており、パスワードを扱う際に Key オプションを使用することで追加のセキュリティを提供し、異なるコンテキストでパスワード ファイルを使用できるようにします。

-Keyオプションは、32ビットの鍵を生成し、ファイルAES.keyに保存するために使用されます。

$keyFile = "D:\aes.key"
$key = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($key)
$key | out-file $keyFile

パスワードファイルを生成して保存するには、Keyを使用します。

コピーコード コードは以下の通りです。

Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString -key $key | Out-File "D:\pwd.txt"

パスワードファイル作成とキーファイル作成でクレデンシャル情報を作成する。

$userName = "YourUserName"
$passwdFile = "D:\pwd.txt"
$keyFile = "D:\aes.key"
$key = Get-Content $keyFile
$Cred = New-Object -TypeName System.Management.Automation.PSCredential `
          -ArgumentList $userName, (Get-Content $passwdFile | ConvertTo-SecureString -Key $key)

pwd.txtとaes.keyのファイルを他のマシンにコピーすると、このように動作します。しかし、さらに鍵ファイルのセキュリティを維持する必要があります。これは一般的にファイルのアクセス権を設定することで行われます。

要約すると

PowerShellが提供するセキュリティオプションにより、平文のパスワードをスクリプトで直接使用することを避けることができ、パスワードを暗号化してファイルに保存することで、ファイルのパーミッションで制御できる利点があります。Key オプションを使うことで、上記のユースケースを拡張し、より多くのシナリオをサポートすることができます。しかし、欠点は、機密のKeyファイルを別に管理する必要があることです。この点から、いわゆるセキュリティは、実際にはセキュリティ機構とユーザーとが一緒になって保証していることがわかる! いくらセキュリティ機構が安全でも、ユーザが認証情報を漏らしてしまっては意味がありません。

今回は以上ですが、スクリプトハウスの学習とサポートに役立てていただければ幸いです。