it-swarm-ja.com

CredSSPを使用したPowerShellRemotingが壊れている

最近、PowerShellがCredSSPと完全に連携していましたが、CredSSPを使用してリモートセッションを確立しようとするたびに、次のエラーが発生します。

Enter-PSSession:リモートサーバーserver01.contoso.comへの接続が次のエラーメッセージで失敗しました:WinRMクライアントはHTTPサーバーエラーステータス(500)を受け取りましたが、リモートサービスには失敗の原因に関するその他の情報が含まれていませんでした。詳細については、about_Remote_Troubleshootingヘルプトピックを参照してください。行:1文字:1 + Enter-PSSession -ComputerName server01.contoso.com -Credential $ cred -Authentication C ... + ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~ + CategoryInfo:InvalidArgument:(server01.contoso.com:String)[Enter-PSSession]、PSRemotingTransportException + FullyQualifiedErrorId:CreateRemoteRunspaceFailed

winrm invoke restore winrm/configを使用してwinrmサービスをリセットしようとしました

PowerShellリモート処理の無効化、CredSSP(クライアントとサーバー)の無効化、PowerShellリモート処理の再有効化、CredSSPの再有効化、WinRMと資格情報の委任の構成に関連するGPOの無効化を試しましたが、何も機能しませんでした。何が起こっているのかを理解するためにこれをさらに掘り下げる方法はありますか?

これは、明らかにPowerShellv3を実行しているラボ環境のすべてのWindowsServer2012システムに影響しています。

client側では、Windowsリモート管理イベントログにこれが表示されます:WSMan operation CreateShell failed, error code 2150859120

サーバーの構成

  • Disable-PSRemoting -Force;
  • Disable-WsmanCredssp -Role Client;
  • Disable-WsmanCredssp -Role Server;
  • Enable-PSRemoting -Force;
  • Set-WSmanQuickConfig -UseSSL -Force;
  • Enable-WsmanCredSSP -Role Server -Force;

クライアントの構成

  • Disable-PSRemoting -Force;
  • Disable-WsmanCredssp -Role Client;
  • Disable-WsmanCredssp -Role Server;
  • Enable-PSRemoting -Force;
  • Set-WSmanQuickConfig -UseSSL -Force;
  • Enable-WsmanCredssp -Role Client -DelegateComputer *.contoso.com -Force;

クライアントとサーバーを構成した後、以下を実行します。

$cred = Get-Credential;
Enter-PSSession -ComputerName server.contoso.com -Credential $cred -Authentication CredSSP;

これにより、エラーが一貫して再現されます。

3
Trevor Sullivan

クイックサマリー

この問題を体系的に解決する方法を探している他の人にとっては、基本的に、NT AUTHORITY\NETWORKSERVICEになりすましているlsass.exeによってアクセスされるファイルACEを変更することになります。

詳細

1)このエラーが発生した場合は、リモート処理用のWinRMが正しくセットアップされていることを示します。そうでない場合、500以外のhttpエラーが発生します。

2)私の問題は、ローカルホストを使用することに限定され、次のPSコマンドを使用して同じマシン上の両方のクライアント/サーバー部分をテストしました。

$cred = Get-Credential 
Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp

3)次のPSコマンドを使用して自己署名証明書を生成しました。
注:山かっこ<>を付けずに<hostname>を実際のホスト名に置き換えます。マシンがドメインの一部である場合は、FQDNをリストに追加します。

$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname <hostname>, localhost -notafter $3years -CertStoreLocation cert:\LocalMachine\My

4)上記の証明書は、秘密鍵とともにローカルコンピューターのOS証明書ストアに追加されます。

\Personal\Certificates

Certlm.mscを使用して、証明書を(秘密鍵で)エクスポートしてから、[-はい]の下にインポートします。2つのコピーがあります。

\Trusted Root Certificate Authorities\Certificates

5)New-SelfSignedCertificateは拇印を出力します。この値が、次の2つのWinRMの場所にCertificateThumbprintとして保存されていることを確認してください(レジストリを介してWinRM値を簡単に更新する方法については以下を参照してください)

winrm e winrm/config/listener
Look for the CertificateThumbprint under the HTTPS transport
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Listener\*+HTTPS\certThumbprint]

winrm get winrm/config/service
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service\credssp_thumbprint]

6)PSトレースを有効にして、サーバーによってスローされた正確なエラーメッセージをキャプチャします。

Enable-PSWsmanCombinedTrace
Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp
Disable-PSWsmanCombinedTrace

7)結果のトレースファイルをイベントビューアで開きます。

C:\Windows\System32\WindowsPowerShell\v1.0\Traces\PSTrace.etl

8)この場合、エラーはサーバー応答処理として報告されました:

Sending HTTP error back to the client due to a transport failure.
The HTTP status code is 500
The error code is 2148074253

これは、0x8009030DまたはSEC_E_UNKNOWN_CREDENTIALSとして表すこともできます。

9)Sysinternals Process Monitorを使用して、プロセスlsass.exeのアクセスが拒否された正確なファイルを見つけます。

C:\ProgramData\Microsoft\Crypto\Keys\
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

10)次のicaclsコマンドを使用して、ファイルのACEを更新します。

icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\<###> /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
icacls C:\ProgramData\Microsoft\Crypto\Keys\<###> /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"

11)すべてがうまくいくはずです

Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp
Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp -UseSSL


便利なコマンド

(A)現在のWinRM構成情報を表示するには

winrm get winrm/config
winrm e winrm/config/listener

上記の構成情報はレジストリに保存されており、値は下の場所からその場で簡単に変更でき、上記のコマンドですぐに更新されます。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN

(B)ネットワークが「パブリック」の場合、PSリモーティングを有効にし、「障害」をバイパスします

Enable-PSRemoting -SkipNetworkProfileCheck -Force

(C)現在のCredSSP構成を調べます

Get-WSManCredSSP

(D)サーバーとクライアントの両方の役割に対してCredSSPを有効にする

Enable-WSManCredSSP -Role "Server"
Enable-WSManCredSSP -Role "Client" -DelegateComputer "localhost", "127.0.0.1", "<hostname>", "<FQDN>"
1
Jeffrey Hyson

私は問題を見つけたかもしれないと思います。

私はもともとHTTPSリスナーで問題に遭遇していました。明示的なIPを使用したかったのですが、これはSSLを使用している場合にのみ使用できます。次の方法でSSLリスナーを設定します。

Set-WSManQuickConfig -UseSSL -Force

または

winrm quickconfig -transport:https -Force

サーバー上でリスナーを構成しますが、-UseSSLパラメーターを使用してクライアントから接続すると失敗します。

私はIPをあきらめて、マシン名の使用に戻りました。スクリプトでHTTPSを設定する試みを残しましたが、認証にCredsspを使用すると、500の応答で発生する問題が発生しました。

最後に、一度に1つのことを試すことにしました。 HTTPS設定を削除するとすぐに、問題は解決しました。

私の完全なスクリプトは次のようになります。

# Disable/revoke winrm/remoting
Start-Service winrm
winrm invoke restore winrm/config

Disable-PSRemoting -Force
Disable-WSManCredSSP -Role Client
Disable-WSManCredSSP -Role Server
Stop-Service winrm

# Enable remoting
Enable-PSRemoting -Force
Enable-WSManCredSSP -Role Server -Force
Enable-WSManCredSSP -Role Client -DelegateComputer "*.mydomain.com" -Force
winrm enumerate winrm/config/listener

Set-Item WSMan:\localhost\Client\TrustedHosts "*.mydomain.com" -Force

確かに理想的ではありませんが、お役に立てば幸いです。

1
Kieranties