Server CoreのWindowsサーバインスタンスにCLIでリモート接続
Windows Server Core をクラウド上で運用する場合、GUI を使わず CLI でリモート管理したい場面も多いでしょう。本記事では、WinRM、PowerShell Remoting、SSH などを利用して Windows Server Core にコマンドラインで接続する方法をまとめます。
クラウド上の Windows サーバは、通常 RDP(リモートデスクトップ)で管理されることが多いでしょう。AWS の EC2 でも、Windows インスタンスを作成するとデフォルトで TCP 3389 を許可するセキュリティグループが設定され、RDP による接続が可能になっています。
Server CoreのWindowsサーバに対してもRDPで接続することはできますが、せっかくのServer Coreなので、CLIで接続したいものです。特に、XのインストールしていないLinuxからWindowsに接続するには、CLI以外の方法はありません。
CLIで接続するには、主に4つの方法があります。
-
WinRS / WinRM
-
Powershell Remoting over WinRM
-
SSH
-
Powershell Remoting over SSH
1. WinRS / WinRM
WinRSは、WinRM(Windows Remote Management)のコマンドラインツールでWindowsにデフォルトでインストールされていますが、Windows環境でしか利用できません。LinuxやmacOS、WSLでは利用できません。
WinRMは、HTTPとHTTPSをサポートしており、それぞれTCPポートの5985と5986を使用します。しかし、HTTPS利用の場合サーバ側に証明書を導入する必要があり手間がかかってしまいます。HTTPでの通信であっても通信の中身をきちんと暗号化してくれます(ドメイン環境ではKerberos/AES-256、それ以外はNTLM/RC4で)ので、通常HTTPを選択しても問題ありません。Windows Server 2022でも、デフォルトでHTTPのみ有効になっています。しかし、セキュリティにシビアな環境での利用はHTTPSを選択したほうが無難でしょう。
一方、HTTP利用の場合クライアント側で明示的にサーバのIPアドレスを信頼ホスト(TrustedHost)に追加する必要があります。ここではHTTPで接続する場合の手順を説明します。
AWS側の設定
AWSでは、インスタンスに対して「WinRM-HTTP(5985番ポート)」もしくは「WinRM-HTTPS(5986番ポート)」を開放します。
サーバ側の設定
Windows ServerはデフォルトでWinRMのサービスが立ち上がっており有効になっています。また、ファイアウォールのPrivateとDomainプロファイルにおいて、下記のようにWinRMのポートが開放済みの状態です。そのため、ドメイン環境であればサーバに一度もログインしなくてもリモート接続は可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
しかしPublicプロファイルではこのポートが開放されていないため、インターネット越しなどドメイン以外の環境の場合、下記コマンドでポートを開放しておく必要があります。いったんRDPでログインしてから、コマンドを実行します。
1 | |
クライアント側の設定
HTTPの場合クライアント側の信頼ホスト(TrustedHost)を設定する必要がありますが、残念ながら設定用のコマンドはWinRMのサービスが起動しないとエラーを吐きます。クライアント側の設定をするのにサービスを起動しなければならないのは非常におかしいので、マイクロソフトが別の方法を用意してくれています:直接レジストリをいじる方法です。
ただし、レジストリをいじることは、特にエンタープライズ環境では避けるべきなので、ここでコマンドで設定する方法を説明します。「winrm quickconfig」コマンドでサービスを起動してから、「winrm set」コマンドで信頼ホスト(TrustedHost)を追加する内容です。コマンドにある「x.x.x.x」は、WindowsインスタンスのパブリックIPアドレスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
接続してみる
以下のコマンドでリモート接続します。
1 2 3 4 5 6 7 8 | |
このように、コマンドを実行できるようになります。またPowershellも起動できcmdletを実行できます。
2. Powershell Remoting over WinRM
Powershell Remotingには、2つの方式があります。1つはWinRMベースでもう1つはSSHベースです。
WinRMベースのPowershell Remotingは、Windows OSからの接続しかサポートしません(WinRMがWindows OS上にしか存在しないため)。一方、SSHベースのPowershell Remotingはクロスプラットフォームであり、WindowsからLinux、LinuxからWindowsなどをサポートしています。しかし、SSHベースはWindows Powershellをサポートしておらず、Powershell(つまりPowershell Core)を動作要件としているため、サーバ側にのPowershellのインストールが必要です(名前がややこしいですが、Windows PoweshellとPowershellは別物です)。
WinRMベースのPowershell Remotingは、前述のWinRMの仕組みをそのまま流用しているため、サーバ側・クライアント側とも同様に事前設定が必要です。また、EC2側のポート開放(5985もしくは5986)も忘れずにしておきましょう。接続する際に、winrsコマンドの代わりに、Powershellで「Enter-PSSession」を利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
ちなみにHTTPSで接続する場合は以下のコマンドを利用します。
1 2 | |
3. SSH
最新のWindowsサーバのリモートCLI管理は、SSHが最も簡単な方法です。Windows Server 2019以降、またWindows 10以降のWindows OSは、標準でOpenSSHをサポートしています。デフォルトでSSHサーバがインストールされているわけではありませんが、コマンド1つでインストールと構成ができるので複雑な設定は要りません。
まずは念のためOpenSSHのクライアント、サーバのインストール状況を確認します。
1 2 3 4 5 6 7 | |
OpenSSHのサーバがインストールされていないので、インストールします。
1 2 3 4 5 | |
sshdサービスを起動し、自動起動に設定します。
1 2 | |
以上でサーバ側の設定は完了です。AWS上でSSHの22番ポートを開放すれば、クライアントからSSHで接続できるようになるはずです。
4. Powershell Remoting over SSH
SSHベースのPowershell Remotingは、クライアント側もサーバ側もWindows Powershellではなく、Powershell 6.0(=Powershell Core)以降のバージョンを必要とします。Server Coreで最新のPowershellをインストールするには、MSIパッケージを利用すると良いです。
1 2 3 4 5 | |
また、SSHベースのPowershell RemotingはSSHを前提としているので、先述の手順でOpenSSHサーバをインストールしておきます。インストールしたあと、sshd_configファイルを編集して、SSHのSubsystemを設定しておきます。
1 | |
こちらの公式手順に従って、「Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo」を追記します。
設定ファイルを保存して、sshdを再起動します。
1 | |
サーバ側の設定は以上で完了です。では、クライアントから接続してみます。
1 2 3 4 5 6 7 8 | |
ここで注意してほしいのは、Enter-PSSessionコマンドはover WinRMとover SSHの両方をサポートしており、パラメータでどちらを使うかが決まっています。例えば下記2つのコマンドについて、前者がover WinRMで後者がover SSHとなります。
1 2 | |

