まずは、以下の .ps1 でパスワードをセキュアストリングにしてファイルに保存します。
< MakePasswordFile.ps1 >
# スクリプトのあるフルパス |
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 だと、-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)でパスワードをセキュアに使う(証明書編)
Copyright © MURA All rights reserved.