Home > Windows にまつわる e.t.c.

スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(セキュアストリング編)


パスワードをセキュア ストリングとして保存する

まずは、以下の .ps1 でパスワードをセキュアストリングにしてファイルに保存します。

< MakePasswordFile.ps1 >

# スクリプトのあるフルパス
$CurrentDir = Split-Path $MyInvocation.MyCommand.Path -Parent

# パスワードファイルのフルパスを生成
$PasswordFile = Join-Path $CurrentDir "password.txt"

# ID/Password の入力
$Credential = Get-Credential

# パスワードファイルの生成
$Credential.Password | ConvertFrom-SecureString | Set-Content $PasswordFile

 

クレデンシャルを生成する(PowerShell 3.0 以降)

PowerShell 3.0 以降であれば、-Credential オプションが様々なコマンドレッドで使えるので、セキュアストリングに保存したパスワードからクレデンシャル($Credential)を作成して、-Credential オプションに渡します。

$CurrentDir = Split-Path $MyInvocation.MyCommand.Path -Parent
$PasswordFile = Join-Path $CurrentDir "password.txt"

# セキュアストリングとしてパスワードを取り出す
$SecurePassword = Get-Content $PasswordFile | ConvertTo-SecureString

# クレデンシャルの生成
$Credential = New-Object System.Management.Automation.PSCredential "BatchUser",$SecurePassword

Get-HogeHoge -Credential $Credential
 

 

セキュアストリングから平文のパスワードを取り出す(PowerShell 2.0)

ところが、PowerShell 2.0 だと、-Credential オプションが使えないコマンドレッドが多くて悩ましいです。

例えば、スケジュールジョブで「\\192.168.1.100\Common」とかの共有にアクセスして Test-Path したいとか、Get-ChildItem したいとかことごとくアウトです orz

折角セキュアストリングが使えるのだから、何とかならないかといろいろ物色していたら、お仲間が良いコンテンツ書いているじゃないですか !!

< HIRO's.NET | SecureStringから文字列を取得する >
http://hiros-dot.net/PowerShell/myfunction/myfunction06.htm

 

こいつパクらせていただいて、net use とか平文でパスワードを受け取るコマンドでセキュアにパスワードを扱うことにします。

先ほど保存したセキュアストリングのパスワードファイルから、スケジュールジョブの net use 用に平文のパスワードを取ってきます。

$CurrentDir = Split-Path $MyInvocation.MyCommand.Path -Parent
$PasswordFile = Join-Path $CurrentDir "password.txt"

$SecurePassWord = Get-Content $PasswordFile | ConvertTo-SecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassWord)
$Password = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($BSTR)

$HostIPC = "\\192.168.1.100"

net use $HostIPC $Password /user:"BatchUser" /PERSISTENT:NO

 

これで接続先に認証されたので、スケジュールジョブ PowerShell から \\192.168.1.100\Common とか普通にアクセスできます。

共有アクセスが不要になったら(通常は終了処理)で

net use * /delete /yes

と後始末します。

 

パスワードファイルをセキュアに運用する

さて、このパスワードファイルなのですが、セキュアストリングを作成したユーザーでログインしていれば、セキュアストリングから平文のパスワードが取り出せるので、暗号化してあるといっても安全な状態ではありません。(パスワードを平文で .ps1 に書くよりマシな程度)

対策として、「バッチ処理専用のアカウント」(スクリプトサンプルの"BatchUser")を作成し、そのアカウントでスケジュールジョブを実行するサーバーにログインし、パスワードファイルを作成します。

んで、スケジュールジョブの実行アカウントにこのアカウントを指定し、パスワードを非公開にすれば、セキュアにパスワード運用する事が可能となります。

更に、スケジュールジョブとして実行される .ps1 にコード署名をして、Set-ExecutionPolicy AllSigned にしておけば、スクリプトに細工をしてパスワード見られるってのも防止できますね。

コード署名についてはこちらをどうぞ

AD CS でコード証明書を発行する
http://www.vwnet.jp/Windows/WS08R2/ADCS/CodeSigningCert.htm

 

セキュアストリングではなく、証明書を使ったパスワードハンドリングはこちらをどうぞ

スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(証明書編)

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.