WinRM を使用して HTTPS で PowerShell リモート処理を構成する方法

SSL証明書を使用してHTTPS経由でPowerShellリモート処理を設定する方法

PowerShell リモート処理をネットワーク経由で適切に動作させることは、必ずしも簡単ではありません。Active Directory ドメインの外部またはワークグループ内のマシンに接続しようとする場合、信頼の問題のために状況が少し危険になります。確かに、トラフィックは HTTP (TCP/5985) または HTTPS (TCP/5986) のどちらを使用していても AES-256 で暗号化されますが、信頼されていない環境や外部の環境に接続する場合は、中間者攻撃のリスクが急増します。そのため、Microsoft は、特にサードパーティ製システムやリモート システムを扱う場合には、より安全で、正直に言って、よりプロフェッショナルであるため、HTTPS トランスポートの使用を推奨しています。HTTPS 経由で PowerShell リモート処理を構成することは、単にスイッチを切り替えるだけではありません。リモート マシンで SSL 証明書を作成してバインドする必要があります。証明書の扱いに慣れていない場合、これは少し難しいように思えるかもしれません。このガイドでは、PowerShell を使用して自己署名 SSL 証明書を生成し、WinRM リスナーを設定し、接続を適切に保護する方法について詳しく説明します。WinRM と証明書を適切に設定せずに操作すると、特に厄介な CN 不一致などの厄介な接続エラーが発生する可能性があります。適切に設定すれば、リモートホストへの接続がはるかにスムーズになり、セッションの安全性が向上します。特に信頼済みネットワークの外部では顕著です。ただし、最初からすべてがスムーズに進むとは限りません。証明書の拇印の不一致やファイアウォールルールによるトラフィックのブロックなど、途中でいくつかの問題が発生する可能性があります。しかし、正しく構成すれば、暗号化された堅牢な PowerShell Remoting 設定が実現し、信頼性が大幅に向上し、盗聴されにくくなります。

Windows で PowerShell リモート処理を HTTPS 経由で修正する方法

方法1: WinRM用の自己署名SSL証明書を生成する

これが最初のステップです。有効な SSL 証明書がないと、HTTPS 接続は失敗します。トラフィックを暗号化し、リモート ホストが正当であることを確認するために証明書が必要です。最も簡単な方法は、PowerShell を使用して自己署名証明書を作成することです。CA 発行の証明書を展開するのは、単純なリモート管理にはやり過ぎになる可能性があるからです。これを行うには、構成しているリモート ホストで PowerShell プロンプトを管理者として実行します。次に、次のようなコマンドを使用します。 powershell $hostName = $env:COMPUTERNAME $hostIP = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_. PrefixOrigin -eq ‘Dhcp’}).IPAddress # 静的 IP の場合は、代わりに IP を手動で指定する必要がある場合があります $srvCert = New-SelfSignedCertificate -DnsName $hostName, $hostIP -CertStoreLocation Cert:\LocalMachine\My このコマンドは、ローカル マシンの個人用証明書ストアに格納されている証明書を出力します。 なぜホスト名と IP の両方を含めるのでしょうか。ネットワークでDNSを使用していない場合、IPアドレス経由で接続するには証明書のSAN(Subject Alternative Name)に記載されているIPアドレスが必要になります。設定によっては、特に後で接続しようとした際にホスト名またはIPアドレスが証明書に記載されているものと一致しない場合、ホスト名の不一致に関するエラーが発生することがあります。そのため、SANに入力する情報には注意してください。

方法 2: SSL 証明書を使用するように WinRM リスナーを構成する

証明書が取得できたら、それをHTTPSリスナーとしてWinRMにバインドする必要があります。まず、証明書のサムプリントを取得します: powershell $srvCert. Thumbprint 次に、現在のリスナーを確認します: powershell Get-ChildItem -Path WSMan:\localhost\Listener デフォルトのHTTPリスナー(ポート5985)とHTTPSリスナー(ポート5986)が表示されるはずです。デフォルトのリスナーを削除するには(競合を回避するため)、次のコマンドを実行します: powershell Get-ChildItem -Path WSMan:\localhost\Listener | Where-Object { $_. Keys -like ‘Transport=HTTP*’ } | Remove-Item -Recurse Get-ChildItem -Path WSMan:\localhost\Listener | Where-Object { $_. Keys -like ‘Transport=HTTPS*’ } | Remove-Item -Recurse 次に、証明書を使用して新しいHTTPSリスナーを作成します。powershell New-Item -Path WSMan:\localhost\Listener -Transport HTTPS -Address ‘*’ -CertificateThumbPrint $srvCert. Thumbprint -Force これでSSL証明書がポート5986にバインドされます。とても便利ですね。ちなみに、WinRM HTTPSトラフィックの受信を許可するファイアウォールルールも忘れずに設定してください。powershell New-NetFirewallRule -DisplayName ‘WinRM – HTTPS’ -Direction Inbound -LocalPort 5986 -Protocol TCP -Action Allow そして、これらの変更を反映させるため、WinRMを再起動します。powershell Restart-Service WinRM 使用されている証明書を確認するには、次のコマンドを実行します。powershell winrm e winrm/config/listener 証明書に一致するサムプリントを探します。

方法3: 証明書をエクスポートして展開する

SSL証明書の設定とローカルでの動作が完了したら、他のコンピューターへの展開やクライアントの信頼のために証明書をエクスポートします。powershell Export-Certificate -Cert $srvCert -FilePath C:\PS\SSL_PS_Remoting.cer を実行します。この`.cer`ファイルを管理者またはクライアントマシンにコピーします。クライアントがリモートホストの証明書を信頼するには、信頼されたルートストアに証明書をインポートします。powershell Import-Certificate -FilePath C:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\Root 実行するには、昇格した権限が必要になる場合があります。この手順を実行しないと、クライアントマシンで「ホストの証明書が信頼されていません」などのエラーが発生する可能性があります。

新しい HTTPS 設定で PowerShell を使用して接続する

すべてが整ったら、`-UseSSL` を指定して `Enter-PSSession` または `Invoke-Command` で接続できます。IP アドレスで接続している場合(証明書に IP アドレスのみが記載されていてホスト名が記載されていない場合)、CN の不一致に関するエラーが発生する可能性があります。これを回避するには、PowerShell に CN チェックを一時的にスキップするよう指示します。powershell $sessionOption = New-PSSessionOption -SkipCNCheck Enter-PSSession -ComputerName 192.168.13.4 -UseSSL -Credential-SessionOption $sessionOption 注: この方法は本番環境では推奨されませんが、トラブルシューティングには役立ちます。適切な設定を行うには、IPアドレスをSANに設定するか、証明書と一致するホスト名を使用してください。

まとめ

  • リモート マシンで PowerShell を使用して自己署名 SSL 証明書を作成します。
  • その証明書をポート 5986 のリスナーとして WinRM にバインドします。
  • ファイアウォールがポート 5986 の受信トラフィックを許可していることを確認します。
  • 必要に応じて、証明書を信頼できるストアにエクスポートおよびインポートします。
  • 接続時には `-UseSSL` を使用し、DNS が完全に設定されていない場合は `-SkipCNCheck` を検討してください。

まとめ

PowerShell Remoting over HTTPS のセットアップは、特に証明書やネットワーク制限を扱う場合は、少々面倒な作業になることがあります。私の経験では、自己署名証明書を生成し、慎重にバインドし、クライアントがそれを信頼していることを確認することで、ほとんどの問題は解決します。最初からすべてが完璧というわけではありません。WinRM リスナーがすぐに登録されなかったり、ポート 5986 を明示的に許可するまでファイアウォールがブロックしたりすることもあります。しかし、一度動作するようになれば、セキュリティ対策だけでも十分に価値があります。この情報が、セットアッププロセスの効率化、あるいは少なくとも舞台裏で実際に何が起こっているのかを少しでも理解するのに役立つことを願っています。セキュリティ対策はプロセスであり、一度で済むものではないことを忘れないでください。頑張ってください!