Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellリモーティング(WinRM)をHTTPSで構成する完全ガイド|SSL証明書の発行から接続まで

はじめに:なぜHTTPSトランスポートが必要か

デフォルトでは、PowerShellリモーティング(PSRemoting)セッションの通信は、HTTP(TCP/5985)とHTTPS(TCP/5986)のどちらのトランスポートプロトコルを使用していてもAES-256キーによって暗号化されます。しかし、ADフォレスト外やワークグループ環境のコンピューターに接続する場合、Kerberosによる信頼関係を確立できないため、中間者攻撃(MITM)のリスクにさらされます。そのため、Microsoftはサードパーティのコンピューターに接続する際には、常にHTTPSトランスポートを使用することを推奨しています。

この記事で解説すること

本記事では、SSL証明書を使用してHTTPS経由のPowerShell Remotingを構成する手順を詳しく解説します。HTTPS経由のPSRemotingセッションを利用すると、ADドメイン/フォレスト外のコンピューターに接続する際に、より高いセッションセキュリティレベルを実現できます。

以下の手順は、PowerShell Remoting over HTTPSで接続される側(リモートデバイス)となるWindowsマシン上で実行します。

前提条件の確認

まず、Windowsのネットワークロケーションが「プライベート」または「ドメイン」に設定されていることを確認します。

Get-NetConnectionProfile

次のコマンドでWinRMとPSRemotingを有効化します。

Enable-PSRemoting -Force

なお、ドメイン環境ではGPO(グループポリシー)を使ってWinRMを一括構成することも可能です。

ステップ1:SSL証明書の作成

WinRMでHTTPSを構成するには、まず接続先のコンピューター上にSSL証明書を作成する必要があります。この証明書はWinRMトラフィックの暗号化に使用されます。PowerShellで自己署名証明書を作成するのが最も簡単な方法です。ドメイン環境では、自動登録(Auto-Enrollment)を利用してWinRM証明書を自動的に発行することもできます。

証明書のDNS名として、コンピューター名とそのIPアドレスの両方を指定します(DNSサーバーが存在しないネットワーク環境でも便利です)。両方の値をサブジェクト代替名(SAN)として取得し、次のように自己署名証明書を生成します。

$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert

新しく作成されたSSL証明書は、コンピューターの個人証明書ストアに表示されます。

ステップ2:WSManリスナーの構成

Windowsでは、PowerShell Remoting用にデフォルトで異なるポート上に2つのリスナーが作成されます。

  • HTTP:ポート5985
  • HTTPS:ポート5986

アクティブなWSManリスナーの一覧は、次のコマンドで確認できます。

Get-ChildItem wsman:\localhost\Listener

まず、デフォルトのHTTPおよびHTTPSリスナーを削除します。

Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse

次に、新しいHTTPSリスナーを作成し、作成した証明書をバインドします。

New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force

ステップ3:ファイアウォール規則の作成とサービスの再起動

WinRM HTTPSトラフィック(TCP/5986)を許可するWindowsファイアウォール規則を作成します。すでに規則が存在する場合は、有効になっていることを確認してください。

New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP

続いて、WinRMサービスを再起動して設定を反映させます。

Restart-Service WinRM

WinRM HTTPSリスナーにどの証明書の拇印(Thumbprint)がバインドされているかは、次のコマンドで確認できます。

WinRM e winrm/config/listener

これでリモートホスト側の構成は完了です。

ステップ4:証明書のエクスポートと暗号化設定の確認

次に、作成したSSL証明書をCERファイルとしてエクスポートします。

Export-Certificate -Cert $srvCert -FilePath c:\PS\SSL_PS_Remoting.cer

ここで注意すべき点として、WinRMのサーバーおよびクライアント構成では、デフォルトで暗号化されていない接続が許可されていません。以下のコマンドで現在の設定を確認できます。

dir WSMan:\localhost\Service | ? Name -eq AllowUnencrypted
dir WSMan:\localhost\Client | ? Name -eq AllowUnencrypted

必要に応じて、次のコマンドで暗号化されていない接続を明示的に無効化しておきましょう。

winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}'

ステップ5:管理コンピューターへの証明書インポート

エクスポートしたCERファイルを管理用コンピューターにコピーし、次のコマンドで信頼されたルート証明機関ストアにインポートします(または、GPOを利用して複数のコンピューターへ証明書を展開することも可能です)。

Import-Certificate -FilePath c:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\

ステップ6:HTTPS経由でリモートホストに接続する

WinRM HTTPSを使ってリモートのWindowsホストに接続するには、Enter-PSSessionおよびInvoke-Commandコマンドレットで-UseSSL引数を指定する必要があります。

次の例では、PowerShellコンソールからIPアドレスを指定してリモートホストに接続します(このIPアドレスはTrustedHostsに追加していない点に注意してください)。

$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption

IPアドレスで接続する際にSkipCNCheckオプションを指定しないと、次のエラーが発生します。

The SSL certificate contains a common name (CN) that does not match the hostname

これは、証明書のCN(共通名)と接続先のホスト名が一致しないためです。なお、SkipCNCheckはCN検証をスキップするオプションであるため、テスト環境以外での使用は避け、実運用ではDNS名で接続するか、正しいCNを持つ証明書を発行することを推奨します。

まとめ

HTTPS経由のPowerShell Remotingを構成することで、ADドメイン外やワークグループ環境のコンピューターに対しても、中間者攻撃のリスクを大幅に低減した安全なリモート管理が可能になります。ポイントは以下の通りです。

  • 接続先コンピューターで自己署名証明書(またはCA発行証明書)を作成する
  • WSManのHTTPSリスナー(TCP/5986)に証明書をバインドする
  • ファイアウォールでTCP/5986を許可する
  • クライアント側に証明書をインポートし、-UseSSLオプションで接続する
  1. BITSとPowerShellを活用して低速・不安定なネットワーク経由で大容量ファイルを確実にコピーする方法

    ローカルネットワークやインターネット上でファイルを転送する場合、一般的にはSMB、FTP、HTTPといったプロトコルが使用されます。しかし、これらのプロトコルには大きな課題があります。それは、大容量ファイルのダウンロード再開(レジューム)が苦手という点です。ネットワークが低速だったり不安定だったりすると、この問題はさらに深刻になります。さらに、これらのプロトコルでファイルをコピーすると、サーバーと受信側の間で利用可能な帯域幅をすべて消費してしまうため、ネットワーク全体のパフォーマンスや他のアプリケーションの動作に悪影響を及ぼすことがあります。ネットワーク機器側で適切なQoSポリシーを設定できる

  2. Windows 10でDNS over HTTPS(DoH)を有効化する方法【レジストリ設定手順】

    DNS over HTTPS(DoH)とは?DNS over HTTPS(DoH)のサポートは、Windows 10 2004ビルド(2020年5月アップデート)から搭載されました。これにより、Windows 10は内蔵のDoHクライアントを使用して、HTTPS経由でDNS名前解決を行えるようになっています。通常、パソコンがDNSサーバーに接続して名前解決を行う際、DNSのリクエストやレスポンスは平文(暗号化されていない状態)でインターネット上を送受信されます。そのため、攻撃者にトラフィックを傍受されれば、どのサイトにアクセスしたかが盗み見られたり、中間者攻撃(Man-in-the-Middl