4

データベースへの接続に使用するパスワードを復号化する必要があるビルド プロセスがあります。PowerShell を使用して、データ保護 API (DPAPI) を使用して、ビルド サーバーのマシン スコープでパスワードを暗号化しています (自分のドメイン アカウントでログインしています)。

[Security.Cryptography.ProtectedData]::Protect( $passwordBytes, $null, [Security.Cryptography.DataProtectionScope]::LocalMachine );

復号化は、ビルド ユーザーとして実行される CruiseControl.NET によって実行される PowerShell スクリプトでも行われます。

 [Security.Cryptography.ProtectedData]::Unprotect( $encryptedbytes, $null, [Security.Cryptography.DataProtectionScope]::LocalMachine );

ただし、への呼び出しUnprotectは失敗し、次のメッセージが表示されます。 docs によると、このエラーは偽装を使用して発生する可能性があり、偽装コードはユーザーのプロファイルをロードする必要があります。

セキュリティ上の理由から、ビルド ユーザーは、ターミナル サービスを介してログオンする権利を拒否されています。この問題をテストするために、ビルド サーバーに自分自身としてログインし、runas を使用してビルド ユーザーとして PowerShell プロンプトを開きました。

runas /profile /user:DOMAIN\BUILDUSER powershell.exe

次に、PowerShell スクリプトを実行してパスワードの保護を解除/復号化すると、同じエラーが発生します。

Process Monitorを使用して障害やアクセス拒否イベントを監視しましたが、何もありませんでした。

自分のドメイン アカウントでログインすると、パスワードを解読できます。

どうしたの?ビルド ユーザーのプロファイルが読み込まれていませんか? これを有効にするために、私が知らないセキュリティ設定がどこかにありますか? パスワードを解読できないのはなぜですか?

4

2 に答える 2

3

開発者エラー。LocalMachine スコープではなく、CurrentUser スコープで暗号化していたことがわかりました。スクリプトを更新したところ、すべてが機能しています。

于 2011-06-06T20:38:44.463 に答える
1

暗号化された ByteArray をファイルにコーディングする方法に注意を払っていますか。ここでは、サーバーの1つで接続文字列を取得する方法を抽出します(ここでは、入力した文字列に置き換えます)

Base64に変換して設定ファイルに入れる

Clear-Host

Add-Type -assembly System.Security

$passwordASCII = Read-Host -Prompt "Enter Password"

$bakCryptedPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Protect( $passwordASCII.tochararray(), $null, [System.Security.Cryptography.DataProtectionScope]::LocalMachine )

Set-Content -LiteralPath c:\Temp\pass.txt -Value ([Convert]::ToBase64String($bakCryptedPWD_ByteArray))

ANSI 文字の大文字と小文字を区別する文字列に戻ります (パスワードに特殊文字が含まれる場合があります)

Clear-Host

Add-Type -assembly System.Security

$resCryptedPWD_ByteArray = [Convert]::FromBase64String((Get-Content -LiteralPath c:\Temp\pass.txt))

$clearPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Unprotect( $resCryptedPWD_ByteArray, $null, [System.Security.Cryptography.DataProtectionScope]::LocalMachine )

$enc = [system.text.encoding]::Default

$enc.GetString($clearPWD_ByteArray)
于 2011-06-03T14:20:36.740 に答える