PowerShellスクリプトでパスワードを保存する方法
はじめに
の作者は 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ファイルを使えばいいんですね。
もっと普通っぽい、安全なおすすめの使い方。
この行のコマンドを実行すると、パスワードが要求されます:.
これは、平文のパスワード文字列の代わりに、キーボード入力を使用します。
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ファイルを別に管理する必要があることです。この点から、いわゆるセキュリティは、実際にはセキュリティ機構とユーザーとが一緒になって保証していることがわかる! いくらセキュリティ機構が安全でも、ユーザが認証情報を漏らしてしまっては意味がありません。
今回は以上ですが、スクリプトハウスの学習とサポートに役立てていただければ幸いです。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android携帯のwifiプロキシを自動設定するPowerShellスクリプト
-
powershellで仮想マシンを作成する
-
What-ifのためのPowershellエラー処理
-
PowerShell は、現在のスクリプトランタイムによって消費されるメモリの動的フェッチを実装しています。
-
PowerShellの条件付きパイプライン終了方法
-
PowerShell の実装は、ファイルを開くデフォルトのアプリケーションを照会する
-
PowerShell正規表現(Regex)の右から左へのマッチング方式のコード例
-
Powershellで定数を定義する方法
-
PowershellでWebサイトのレスポンスを確認し、実行時間を計算する例
-
タイプ別ソートのPowershell実装