複数のサーバーに対して自動化ツールを介して実行されるPowershellスクリプトがあります。リモートコールはツールのサービスアカウントを使用するため、コードで資格情報を要求したり公開したりする必要がないため、Windowsマシンでは正常に機能します。このスクリプトは、SharpSSHパッケージを使用してSSH経由でLinuxマシンに対しても実行されます。 SharpSSHはPowershellユーザーの資格情報を自動的に使用しませんが、ユーザー名とパスワード、RSAキーファイル、またはPSCredentialオブジェクトのいずれかが必要です。 Get-Credentialは自動化ツールを介して実行されるため、Get-Credentialを使用して資格情報を要求することはできません。ユーザー名とパスワードをコードで公開したり、RSAキーをそこに置いたりしたくありません。現在のPowershellユーザー(サービスアカウント)からPSCredentialオブジェクトを構築したいと思います。 [System.Net.CredentialCache] :: DefaultNetworkCredentialsを試すと空白が表示され、[System.Security.Principal.WindowsIdentity] :: GetCurrent()は必要なオブジェクトまたは情報を提供しません。
現在のユーザーからPSCredentialオブジェクトを作成する方法はありますか?それとも、この問題の完全に異なる選択肢ですか?
どうもありがとう!
Windows APIは必要な情報を公開しないため、Powershellはそれらにアクセスできません。セキュリティサブシステムの意図的な機能。これが機能するための唯一の方法は、Linuxマシンが呼び出し側マシンを信頼することです。たとえば、Active Directory(または実際にKerberosのセットアップ)にそれらを参加させることです。
それとは別に、何らかの形でこの情報を保存して渡す必要があります。
RSAキーをユーザーのキーストアに保存し、実行時に(.NET Crypto/Keystore libsを使用して)抽出できるため、コードと共にキーを保存することはありません。これにより、キー自体がOSによって保護され、呼び出し元のユーザーが認証された場合にのみ使用可能になります。もう1つインストールする必要がありますが、目的を達成する唯一の方法かもしれません。
サービスアカウントの暗号化キーを使用してパスワードを暗号化する方法は?
簡単な例:
PowerShellをサービスアカウントとして実行し、次を実行して、出力をテキストファイルに保存します(または、スケジュールされたタスク呼び出しに埋め込みます)。
$String = '<PASSWORD>'
ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force)
パスワードを復号化して利用するには、スケジュールされたタスクで次を使用します。
$EncryptedString = '<ENCRYPTED PASSWORD FROM ABOVE>'
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString)))
これでうまくいくはずです。ただし、暗号化されたパスワードを別のコンピューターで再利用したり、何らかの理由でローカルキーストアを破壊したりすることはできません。
パスワードはクレデンシャルオブジェクトからプレーンテキストで取得できるため、プロンプトを表示せずにパスワードを取得できるとは思えません。