PowerShellのダブルホップ問題を解決する方法:完全ガイド

リモートリソースにアクセスしようとした際、PowerShellリモーティングセッション内で frustratingなアクセス拒否の障害にぶつかったことはありませんか?この一般的な問題は「ダブルホップ」問題として知られており、現在のセッションから2台目のリモートマシンにアクセスするのを妨げます。

良いニュースは、過度に複雑な設定を行わずにダブルホップ問題を解決する方法があるということです。このチュートリアルでは、認証をシームレスに処理するカスタマイズされたセッションを構築し、時間と労力を節約しながらセキュリティを維持します。

セッション構成を使用してダブルホップを克服し、ワークフローを効率化しましょう!

異なるユーザーとしてPowerShellを実行する

リモートリソースに接続するスクリプトを使用している場合、ダブルホップ問題に直面することがあります。この問題は、リモート接続の最初のホップを超えて資格情報が認証されないときに発生します。

たとえば、UNCパスを使用してリモートコンピュータ上のサブディレクトリをカウントするスクリプトを考えてみましょう:

(Get-ChildItem -Path \\SRV2\c$ -Directory).Count

アクセス権がないユーザーとしてログインしている場合は、異なるユーザーアカウントでPowerShellを実行できます:

  1. スタートメニューでPowerShellを検索します。
  2. PowerShellショートカットを右クリックし、ファイルの場所を開くを選択します。
  3. ファイルエクスプローラーでShiftキーを押しながらショートカットを右クリックし、異なるユーザーとして実行を選択します。
  4. 必要な権限を持つユーザーの資格情報を入力します。

異なるユーザーとしてPowerShellを起動した後、コマンドは成功するはずです:

(Get-ChildItem -Path \\SRV2\c$ -Directory).Count

ヒント: 異なる認証情報でコマンドを頻繁に実行する場合は、Start-Process コマンドレットを -Credential パラメーターと共に使用することを検討してください。このアプローチにより、代替の認証情報を使用してコンソールから直接新しい PowerShell セッションを開くことができます。


リモート接続のテスト

複数のリモートシステムを操作しているときに、共有フォルダーのようなリモートリソースにローカルで正常にアクセスできることがあります。しかし、別のリモートコンピュータから同じコマンドを実行すると、「アクセス拒否」エラーが発生することに気付きました。

この不一致は混乱を招く可能性があり、特に認証情報に十分な権限があると確信しているときはなおさらです。

リモート接続をテストするには、別のコンピュータとのセッションを確立します:

Enter-PSSession -ComputerName SRV3

接続が完了したら、2台目のマシンで同じコマンドを実行してみてください:

(Get-ChildItem -Path \\SRV2\c$ -Directory).Count

このテストは、権限のあるアカウントを使用しても「アクセス拒否」エラーが発生することがよくあります。

現在のユーザーを確認するには、次のコマンドを実行します:

whoami

この動作(ダブルホップ)は、PowerShell が次のホップに認証情報を渡さないために発生します。このメカニズムは Kerberos 認証に組み込まれたセキュリティ機能ですが、複数のシステムを管理する際には大きな頭痛の種となることがあります。

セッション構成を使用したダブルホップ問題の解決

ダブルホップ問題の解決策の一つは、中間マシンにセッション構成を作成することです。

接続するコンピュータ、ここでは SRV3 にセッション構成を登録することから始めます。

次のコマンド:

  • セッション構成にNameを割り当てます(例:Admin)。
  • アカウント(RunAsCredential)を指定し、セッションがその下で実行されるようにします。
  • 構成が適用されることを保証し(Force)、WinRMサービスを再起動します。
Invoke-Command -ComputerName SRV3 -ScriptBlock {
    Register-PSSessionConfiguration -Name Admin -RunAsCredential 'psforsysadmins.local\adam' -Force
}

PowerShellは、リモートマシン上に安全に保存されるRunAsCredentialアカウントのパスワードを入力するように促します。構成が登録されると、WinRMサービスが再起動し、セッションが閉じられます。

構成が整ったので、ConfigurationNameパラメータを使用して接続できます:

Invoke-Command -ComputerName SRV3 -ScriptBlock {
    (Get-ChildItem -Path \\SRV2\c$ -Directory).Count
} -ConfigurationName Admin

このコマンドは、以前と同じ操作を実行します。ただし、指定された管理者アカウントの下で実行されるAdminセッション構成を指定します。


ヒント:Set-PSSessionConfigurationコマンドレットを使用して、ユーザーまたはグループ固有のアクセス権限を定義することで、セッション構成へのアクセスを制限します。これにより、承認されたユーザーのみが構成を利用できるようになります。


結論

このガイドでは、PowerShellリモーティングにおけるダブルホップ問題を見て解決しました。セッション構成を設定することで、ダブルホップ問題を解決し、認証情報が安全に渡されることを保証できます。

このソリューションは永続的であるため、再起動後も構成を再利用でき、リモートPowerShellセッションの管理において堅牢なアプローチとなります。これで、マルチホップのリモート操作を自信を持って管理し、セキュリティを損なうことなくワークフローを合理化できます。

ここからは、セッションアクセスの制限や証明書ベースの認証の実装など、高度なセキュリティオプションを検討してみてください。これらの強化策は、複雑な環境を柔軟に管理しながら、リモート接続のセットアップをさらに強化することができます。

Source:
https://adamtheautomator.com/powershell-double-hop-fix/