PR

WindowsServer 2025 総合ガイド 第09回

WindowsServer 2025 総合ガイド 第09回
リモート管理の設定 ― OpenSSHとWinRM

第8回では、イベントログとパフォーマンスカウンターを使ったトラブルシューティングの基本を学びました。第9回となる今回は、サーバー運用において不可欠な「リモート管理」について学びます。実務では、サーバーはデータセンターやクラウド上に配置されており、物理的にサーバーの前に座って操作することはほとんどありません。離れた場所からサーバーを安全かつ効率的に管理するための手段として、OpenSSH ServerとPowerShellリモーティング(WinRM)の設定方法を、基礎から実践的に習得していきましょう。

9.1 この記事で学ぶこと

  • リモート管理が必要な理由と、主要なリモート管理方式(RDP / SSH / WinRM)の違いを理解する
  • リモート管理におけるセキュリティ上の考慮事項を理解する
  • OpenSSH Serverをインストール・設定し、SSH経由でサーバーに接続できる
  • sshd_configを編集して、SSH設定をカスタマイズできる
  • PowerShellリモーティング(WinRM)を有効化し、Enter-PSSessionInvoke-Commandでリモートコマンドを実行できる
  • Windows Admin Centerの概要と、CLIベースの管理との使い分けを理解する

9.2 前提条件

  • 第8回完了(イベントログとパフォーマンス監視の基礎を理解している状態)
  • Windows Server 2025にリモートデスクトップ接続できる状態
  • PowerShell 7.4を管理者として起動できる状態
  • Windows Defender Firewallの基本操作ができる状態(第7回の内容)

9.3 リモート管理の概要

9.3.1 なぜリモート管理が必要か

これまでの学習では、リモートデスクトップ(RDP)でサーバーに接続し、その画面上でPowerShellを起動して操作を行ってきました。サーバーが1台であればこの方法でも問題ありませんが、実務では以下のような状況が一般的です。

  • サーバーが物理的に離れた場所にある: データセンターやクラウド上のサーバーに、毎回物理的にアクセスすることは現実的ではありません
  • 複数のサーバーを管理する: 実務では数台から数百台のサーバーを担当することがあります。1台ずつRDPで接続して操作するのは非効率です
  • 自動化・スクリプト化が求められる: 同じ作業を複数のサーバーに対して実行する場合、手動でのGUI操作は時間がかかり、ミスも発生しやすくなります
  • 帯域幅の節約: RDPはデスクトップ画面全体を転送するため、回線の帯域を多く消費します。CLIベースのリモート管理は通信量が少なく、低帯域の環境でも快適に操作できます

リモート管理の仕組みを整えることで、手元のPCからコマンドを送信するだけで、離れた場所のサーバーを安全に操作できるようになります。これはインフラエンジニアにとって基本中の基本となるスキルです。

9.3.2 リモート管理の方式

Windows Serverで利用できる主なリモート管理の方式は、以下の3つです。

方式 正式名称 概要 プロトコル / ポート
RDP Remote Desktop Protocol サーバーのデスクトップ画面を遠隔操作する。GUI操作が可能 TCP 3389
SSH Secure Shell 暗号化された通信経路でコマンドライン操作を行う。クロスプラットフォーム対応 TCP 22
WinRM Windows Remote Management WSManプロトコルを使用し、PowerShellのリモート実行に最適化されたWindows独自の仕組み TCP 5985 (HTTP) / 5986 (HTTPS)

9.3.3 方式の使い分け

3つの方式にはそれぞれ得意分野があり、状況に応じて使い分けます。

使用場面 推奨方式 理由
GUI操作が必要な場合 RDP デスクトップ画面を操作できる唯一の方式
Windows / Linux混在環境 SSH OSを問わず統一的な接続方式を使える
PowerShellで一括管理 WinRM PowerShellのリモーティング機能と深く統合されている
低帯域のネットワーク環境 SSH または WinRM テキストベースのため通信量が少ない
Active Directory環境 WinRM Kerberos認証との統合が容易
ファイル転送を伴う操作 SSH (SCP/SFTP) 標準でセキュアなファイル転送機能を備える

補足: 本シリーズの学習環境(ConoHa VPS)では、第1回でセットアップしたRDP接続を使ってサーバーにログインし、そのうえでPowerShellを操作してきました。今回は、RDP以外の2つの方式(SSH / WinRM)を新たに設定していきます。RDPは引き続き「GUI操作が必要な場面」で活用します。

9.4 セキュリティ上の考慮事項

リモート管理は便利な反面、ネットワーク越しにサーバーを操作できるということは、攻撃者にとっても魅力的な侵入経路になり得ます。設定を行う前に、セキュリティ上の考慮事項を理解しておきましょう。

9.4.1 リモート管理のリスク

  • 不正アクセス: リモート管理のポート(22番、3389番、5985番など)が外部に公開されていると、ブルートフォース攻撃(パスワードの総当たり攻撃)の標的になります
  • 通信の盗聴: 暗号化されていない通信経路を使うと、認証情報やコマンドの内容が第三者に傍受される恐れがあります
  • 権限の悪用: 管理者権限でリモート接続した場合、そのセッションが乗っ取られるとサーバー全体が危険にさらされます

9.4.2 リモート管理を安全に行うための原則

原則 具体的な対策
認証の強化 パスワード認証よりも公開鍵認証を優先する。強固なパスワードポリシーを適用する
通信の暗号化 SSH、WinRM over HTTPS など、暗号化されたプロトコルを使用する
ファイアウォールの適切な設定 必要なポートのみを開放し、接続元IPアドレスを制限する(第7回の内容)
最小権限の原則 リモート接続に使用するアカウントには、必要最小限の権限のみを付与する
ログの監視 リモート接続のログを定期的に確認し、不審なアクセスを検知する(第8回の内容)

VPS環境での注意: ConoHa VPSのようなインターネットに直接接続されたサーバーでは、SSHのポート(TCP 22)やRDPのポート(TCP 3389)に対して、世界中から自動的なブルートフォース攻撃が行われます。パスワードは必ず十分な長さと複雑さを確保してください。可能であれば、公開鍵認証への切り替えを強く推奨します。

9.5 OpenSSH Serverの設定

9.5.1 OpenSSHとは

OpenSSH(Open Secure Shell)は、SSH(Secure Shell)プロトコルのオープンソース実装です。SSHは、ネットワーク越しに暗号化された通信経路を確立し、安全にリモートコマンドの実行やファイル転送を行うためのプロトコルです。

もともとLinux/UNIXの世界で標準的に使われてきた技術ですが、Windows Server 2019以降ではオプション機能として標準対応し、Windows Server 2025ではデフォルトでインストール済みの状態で提供されています。ただし、インストールされていてもサービスは無効化されているため、利用するには明示的に有効化する必要があります。

OpenSSHが提供する主な機能は以下のとおりです。

  • リモートコマンド実行: SSHクライアントからサーバーにコマンドを送信して実行
  • セキュアなファイル転送: SCP(Secure Copy)やSFTP(SSH File Transfer Protocol)によるファイル転送
  • ポートフォワーディング: SSH経由で他のサービスのトラフィックをトンネリング
  • 公開鍵認証: パスワードを使わない、より安全な認証方式

9.5.2 OpenSSH Serverのインストール状態を確認する

Windows Server 2025では、OpenSSHがデフォルトでインストールされています。まず、現在のインストール状態を確認しましょう。

[実行環境: PowerShell 7.4 (管理者)]

# OpenSSHのインストール状態を確認
Get-WindowsCapability -Online |
    Where-Object -Property Name -Like 'OpenSSH*'

実行結果の例(インストール済みの場合)

Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : Installed

Windows Server 2025では、通常 StateInstalled と表示されます。もし NotPresent と表示された場合は、次の手順でインストールを行います。

9.5.3 OpenSSH Serverのインストール(未インストールの場合)

StateNotPresent と表示された場合は、以下のコマンドでインストールします。

[実行環境: PowerShell 7.4 (管理者)]

# OpenSSH Serverのインストール
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

実行結果の例

Path          :
Online        : True
RestartNeeded : False

RestartNeededFalse であれば、再起動なしでそのまま次の手順に進めます。

エラーが発生した場合: Add-WindowsCapability でエラーが出る場合、Windows Updateの保留中の操作が原因であることがあります。その場合は、まずサーバーを再起動してから再度実行してください。それでも解決しない場合は、DISM /Online /Cleanup-Image /RestoreHealth を実行してからリトライします。

9.5.4 sshdサービスの起動と自動起動設定

OpenSSH Serverがインストールされていても、サービスはデフォルトで停止しています。サービスを起動し、OS再起動時にも自動的に起動するよう設定します。

[実行環境: PowerShell 7.4 (管理者)]

# sshdサービスの現在の状態を確認
Get-Service -Name sshd

# sshdサービスを起動
Start-Service -Name sshd

# スタートアップの種類を「自動」に変更
Set-Service -Name sshd -StartupType Automatic

# 設定後の状態を確認
Get-Service -Name sshd | Select-Object -Property Name, Status, StartType

実行結果の例

Name Status StartType
---- ------ ---------
sshd Running Automatic

StatusRunningStartTypeAutomatic になっていれば正常です。

9.5.5 ファイアウォール規則の確認

OpenSSH Serverをインストールすると、OpenSSH-Server-In-TCP という名前のファイアウォール受信規則が自動的に作成されます。この規則がTCPポート22番への受信トラフィックを許可します。

[実行環境: PowerShell 7.4 (管理者)]

# OpenSSH関連のファイアウォール規則を確認
Get-NetFirewallRule -Name '*OpenSSH*' |
    Select-Object -Property Name, DisplayName, Enabled, Direction, Action

実行結果の例

Name        : OpenSSH-Server-In-TCP
DisplayName : OpenSSH SSH Server (sshd)
Enabled     : True
Direction   : Inbound
Action      : Allow

EnabledTrue であれば、ファイアウォールでSSH接続が許可されています。

重要: もしファイアウォール規則が存在しない場合は、手動で作成する必要があります。以下のコマンドで作成できます。

[実行環境: PowerShell 7.4 (管理者)]

# ファイアウォール規則が存在しない場合のみ実行
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' `
    -DisplayName 'OpenSSH SSH Server (sshd)' `
    -Enabled True `
    -Direction Inbound `
    -Protocol TCP `
    -Action Allow `
    -LocalPort 22

9.5.6 接続テスト

ローカルからの接続テスト

まず、サーバー自身からSSH接続ができるか確認します。これにより、ネットワークの問題を除外して、SSHサービスの動作のみを検証できます。

[実行環境: PowerShell 7.4 (管理者)]

# ポート22番がリッスンしているか確認
Test-NetConnection -ComputerName localhost -Port 22

実行結果の例

ComputerName     : localhost
RemoteAddress    : ::1
RemotePort       : 22
InterfaceAlias   : Loopback Pseudo-Interface 1
SourceAddress    : ::1
TcpTestSucceeded : True

TcpTestSucceededTrue であれば、SSHサービスがポート22番でリッスンしています。

続いて、ローカルでSSH接続を試みます。

[実行環境: PowerShell 7.4 (管理者)]

# ローカルへのSSH接続テスト
ssh Administrator@localhost

初回接続時には、サーバーのホスト鍵(フィンガープリント)を確認するメッセージが表示されます。

The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Administrator@localhost's password:

yes と入力してEnterキーを押し、パスワードを入力してログインできれば成功です。SSHセッションから抜けるには exit と入力します。

外部クライアントからの接続テスト

ローカルでの接続テストが成功したら、手元のPC(SSHクライアント)からサーバーへの接続を試みます。

Windowsの場合、コマンドプロンプトまたはPowerShellで以下のコマンドを実行します。macOS/Linuxの場合はターミナルを使用します。

# 外部クライアントからの接続(IPアドレスは環境に合わせて変更)
ssh Administrator@xxx.xxx.xxx.xxx

パスワードを入力してログインできれば、OpenSSH Serverの設定は完了です。

よくあるエラーと対処法

症状 原因 対処法
Connection timed out ファイアウォールでTCP 22がブロックされている ファイアウォール規則を確認し、TCP 22を許可する
Connection refused sshdサービスが起動していない Start-Service -Name sshd でサービスを起動する
Permission denied ユーザー名またはパスワードが間違っている 正しい資格情報を確認する。ユーザーがOpenSSH Usersグループに属しているか確認する
Host key verification failed サーバーのホスト鍵が変更された クライアント側の ~/.ssh/known_hosts から該当エントリを削除する

9.6 SSH設定のカスタマイズ

9.6.1 sshd_configの場所と構造

OpenSSH Serverの動作は、設定ファイル sshd_config で制御されます。Windows Server 2025では、以下の場所に配置されています。

C:\ProgramData\ssh\sshd_config

注意: C:\ProgramData は隠しフォルダです。エクスプローラーで表示するには、「表示」メニューから「隠しファイル」を有効にする必要があります。PowerShellからは直接パスを指定してアクセスできます。

設定ファイルを編集する前に、バックアップを作成しておきましょう。

[実行環境: PowerShell 7.4 (管理者)]

# 設定ファイルのバックアップを作成
Copy-Item -Path "$env:ProgramData\ssh\sshd_config" `
    -Destination "$env:ProgramData\ssh\sshd_config.bak"

9.6.2 主要な設定項目

sshd_config はテキスト形式の設定ファイルで、1行に1つの設定項目を記述します。# で始まる行はコメント(無効な行)です。設定を有効にするには、行頭の # を削除します。

以下に、初学者が知っておくべき主要な設定項目を説明します。

設定項目 デフォルト値 説明
Port 22 SSHサーバーが待ち受けるポート番号
PasswordAuthentication yes パスワードによる認証を許可するか
PubkeyAuthentication yes 公開鍵による認証を許可するか
PermitRootLogin prohibit-password Administratorアカウントでのログインを許可するか(Windowsでは管理者アカウントに相当)
MaxAuthTries 6 1回の接続で許可される認証の最大試行回数

9.6.3 ポート番号の変更

デフォルトのポート22番を変更することで、自動化された攻撃(ポートスキャン)を多少軽減できます。ただし、ポート番号の変更だけではセキュリティ対策として不十分であり、あくまで補助的な手段です。

[ファイル: C:\ProgramData\ssh\sshd_config]

# ポート番号を変更する場合(例: 22から2222に変更)
Port 2222

ポート番号を変更した場合は、ファイアウォール規則も合わせて更新する必要があります。

[実行環境: PowerShell 7.4 (管理者)]

# 新しいポートのファイアウォール規則を追加
New-NetFirewallRule -Name 'OpenSSH-Server-Custom-Port' `
    -DisplayName 'OpenSSH Server Custom Port (sshd)' `
    -Enabled True `
    -Direction Inbound `
    -Protocol TCP `
    -Action Allow `
    -LocalPort 2222

# 元のポート22の規則を無効化
Set-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -Enabled False

注意: ポート番号を変更する場合は、変更前に新しいポートでの接続テストを行い、接続が確認できてから元のポートの規則を無効化してください。接続手段を失わないよう、RDPセッションを維持した状態で作業することを推奨します。

9.6.4 パスワード認証と公開鍵認証

SSH認証には主に2つの方式があります。セキュリティの観点から、それぞれの特徴を理解しておくことが重要です。

項目 パスワード認証 公開鍵認証
仕組み ユーザー名とパスワードで認証 秘密鍵(クライアント)と公開鍵(サーバー)のペアで認証
セキュリティ ブルートフォース攻撃に弱い 秘密鍵がなければ認証できないため、非常に強固
利便性 設定が簡単。パスワードを覚えるだけ 初期設定が必要。鍵ファイルの管理が必要
推奨場面 テスト環境、初期設定時 本番環境、インターネット公開サーバー

公開鍵認証の設定手順

公開鍵認証を設定するには、まずクライアント側で鍵ペアを生成し、公開鍵をサーバーに配置します。

手順1: クライアント側で鍵ペアを生成

手元のPC(SSHクライアント)で以下のコマンドを実行します。

# クライアント側で鍵ペアを生成(Ed25519アルゴリズムを使用)
ssh-keygen -t ed25519 -C "your-comment"

パスフレーズの入力を求められます。パスフレーズを設定すると、秘密鍵が盗まれた場合でも、パスフレーズなしでは使用できなくなります。セキュリティを高めるために設定することを推奨します。

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\yourname/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\yourname/.ssh/id_ed25519
Your public key has been saved in C:\Users\yourname/.ssh/id_ed25519.pub

2つのファイルが生成されます。

  • id_ed25519: 秘密鍵(絶対に他人に渡してはいけません)
  • id_ed25519.pub: 公開鍵(サーバーに配置するファイル)

手順2: 公開鍵をサーバーに配置

生成した公開鍵の内容をサーバーに配置します。Windows Serverの場合、配置先は接続するユーザーによって異なります。

  • 一般ユーザー: C:\Users\ユーザー名\.ssh\authorized_keys
  • 管理者グループのユーザー: C:\ProgramData\ssh\administrators_authorized_keys

サーバー上で以下のように設定します。

[実行環境: PowerShell 7.4 (管理者)]

# 管理者用の公開鍵ファイルに公開鍵を追記
# 以下は公開鍵の内容を手動で貼り付ける例
Add-Content -Path "C:\ProgramData\ssh\administrators_authorized_keys" `
    -Value "ssh-ed25519 AAAA...(公開鍵の内容)... your-comment"

# ファイルのアクセス権を設定(管理者とSYSTEMのみにアクセスを制限)
$acl = Get-Acl -Path "C:\ProgramData\ssh\administrators_authorized_keys"
$acl.SetAccessRuleProtection($true, $false)
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "BUILTIN\Administrators", "FullControl", "Allow")
$systemRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "SYSTEM", "FullControl", "Allow")
$acl.SetAccessRule($adminRule)
$acl.SetAccessRule($systemRule)
Set-Acl -Path "C:\ProgramData\ssh\administrators_authorized_keys" -AclObject $acl

重要: administrators_authorized_keys ファイルのアクセス権が正しく設定されていないと、公開鍵認証は機能しません。このファイルには、Administratorsグループと SYSTEM アカウントのみがアクセスできるよう設定する必要があります。

手順3: パスワード認証を無効化(任意)

公開鍵認証が正常に動作することを確認した後、パスワード認証を無効化するとセキュリティがさらに向上します。

[ファイル: C:\ProgramData\ssh\sshd_config]

# 公開鍵認証を有効化(デフォルトで有効)
PubkeyAuthentication yes

# パスワード認証を無効化
PasswordAuthentication no

注意: パスワード認証を無効化する前に、必ず公開鍵認証で接続できることを確認してください。両方の認証方式が使えなくなると、SSHでサーバーにアクセスできなくなります。RDP接続は引き続き使用できるため、万が一の場合はRDPからリカバリが可能です。

9.6.5 設定変更後のサービス再起動

sshd_config の変更は、sshdサービスを再起動するまで反映されません。

[実行環境: PowerShell 7.4 (管理者)]

# sshdサービスの再起動
Restart-Service -Name sshd

# 再起動後の状態確認
Get-Service -Name sshd

実行結果の例

Status   Name               DisplayName
------   ----               -----------
Running  sshd               OpenSSH SSH Server

9.6.6 デフォルトシェルの変更(任意)

SSH接続時のデフォルトシェルは、Windows コマンドプロンプト(cmd.exe)です。PowerShell 7.4をデフォルトシェルに変更するには、以下のレジストリ設定を行います。

[実行環境: PowerShell 7.4 (管理者)]

# SSH接続時のデフォルトシェルをPowerShell 7.4に変更
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" `
    -Name DefaultShell `
    -Value "C:\Program Files\PowerShell\7\pwsh.exe" `
    -PropertyType String `
    -Force

この設定を行うと、SSH接続時に自動的にPowerShell 7.4が起動するようになります。

9.7 PowerShellリモーティング(WinRM)

9.7.1 WinRMとは

WinRM(Windows Remote Management)は、Microsoftが実装したWSMan(Web Services for Management)プロトコルに基づくリモート管理の仕組みです。PowerShellのリモーティング機能(Enter-PSSessionInvoke-Command など)のバックエンドとして動作します。

SSHとの主な違いは以下のとおりです。

項目 SSH WinRM
プロトコル SSH WSMan(HTTP/HTTPS上で動作)
ポート TCP 22 TCP 5985 (HTTP) / 5986 (HTTPS)
対応OS Windows, Linux, macOS Windowsのみ
Active Directory統合 限定的 Kerberos認証と統合されており、ドメイン環境に最適
PowerShell統合 -HostName パラメータで接続 -ComputerName パラメータで接続(従来からの標準)
Windows Serverでの状態 デフォルトでインストール済み(要有効化) デフォルトで有効

補足: Windows Server 2025では、WinRMによるPowerShellリモーティングはデフォルトで有効になっています。ただし、PowerShell 7.4 のリモーティングエンドポイントを利用するには、追加の設定が必要です。

9.7.2 PowerShellリモーティングの有効化

Windows Server 2025では、Windows PowerShell 5.1のリモーティングはデフォルトで有効ですが、PowerShell 7.4のエンドポイントは別途登録する必要があります。Enable-PSRemoting を PowerShell 7.4(pwsh)から実行します。

[実行環境: PowerShell 7.4 (管理者)]

# PowerShell 7.4のリモーティングを有効化
Enable-PSRemoting -Force

実行結果の例

WARNING: PowerShell remoting has been enabled only for PowerShell 6+ configurations and does not
affect Windows PowerShell remoting configurations. Run this cmdlet in Windows PowerShell to affect
all PowerShell remoting configurations.
WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.

この警告は、PowerShell 7.4用のリモーティング設定が Windows PowerShell 5.1 のリモーティング設定とは独立していることを示しています。問題ではありません。

Enable-PSRemotingが実行する内容

Enable-PSRemoting は内部で以下の処理を行います。何が設定されるかを理解しておくことは、トラブルシューティングの際に役立ちます。

  1. WinRMサービスの起動: WinRMサービスを起動し、スタートアップの種類を「自動」に設定
  2. リスナーの作成: すべてのIPアドレスでWSManリクエストを受け付けるリスナーを作成
  3. ファイアウォール例外の設定: WinRM通信(TCP 5985)を許可するファイアウォール規則を作成
  4. セッション構成の登録: PowerShell 7.4用のリモーティングエンドポイント(セッション構成)を登録
  5. セキュリティ記述子の設定: リモートアクセスを許可するようセッション構成のセキュリティを設定

9.7.3 WinRMサービスとリスナーの確認

リモーティングが正しく設定されているか確認します。

[実行環境: PowerShell 7.4 (管理者)]

# WinRMサービスの状態を確認
Get-Service -Name WinRM | Select-Object -Property Name, Status, StartType

実行結果の例

Name  Status  StartType
----  ------  ---------
WinRM Running Automatic

[実行環境: PowerShell 7.4 (管理者)]

# WinRMリスナーの確認
Get-ChildItem -Path WSMan:\localhost\Listener

実行結果の例

   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Listener

Type            Keys                                Name
----            ----                                ----
Container       {Transport=HTTP, Address=*}         Listener_1084132640

Transport=HTTPAddress=* と表示されていれば、すべてのIPアドレスでHTTP経由のWinRM接続を受け付けている状態です。

[実行環境: PowerShell 7.4 (管理者)]

# PowerShell 7.4のセッション構成を確認
Get-PSSessionConfiguration | 
    Where-Object -Property Name -Like 'PowerShell.7*' |
    Select-Object -Property Name, PSVersion

実行結果の例

Name              PSVersion
----              ---------
PowerShell.7      7.4
PowerShell.7.4.x  7.4

PowerShell.7 というセッション構成が登録されていれば、リモートからPowerShell 7.4のセッションに接続できます。

9.8 リモートセッションの使用

9.8.1 対話型セッション(Enter-PSSession)

Enter-PSSession は、リモートサーバーとの対話型セッションを開始するコマンドレットです。接続後は、ローカルのPowerShellと同じようにコマンドを実行できます。

WinRM経由での接続

[実行環境: PowerShell 7.4 (管理者)]

# ローカルでのリモーティングテスト(自分自身に接続)
Enter-PSSession -ComputerName localhost -ConfigurationName "PowerShell.7"

実行結果の例

[localhost]: PS C:\Users\Administrator\Documents>

プロンプトの先頭に [localhost]: が表示されていれば、リモートセッション内にいることを示しています。

# リモートセッション内でサーバー情報を確認
$PSVersionTable.PSVersion
hostname
Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
7      4      x

WIN-XXXXXXXXXX

セッションを終了するには、Exit-PSSession と入力するか、exit と入力します。

# リモートセッションの終了
Exit-PSSession

補足: -ConfigurationName "PowerShell.7" を省略すると、Windows PowerShell 5.1 のセッションに接続される場合があります。PowerShell 7.4のセッションを明示的に指定するために、このパラメータを付与することを習慣化してください。

SSH経由での接続

PowerShell 7.4では、SSH経由でもリモートセッションを確立できます。WinRMの代わりにSSHをトランスポートとして使用する場合は、-HostName パラメータを使います。

SSH経由のPowerShellリモーティングを使用するには、サーバー側の sshd_config にPowerShellサブシステムを登録する必要があります。

[実行環境: PowerShell 7.4 (管理者)] ※サーバー側で実行

# PowerShellサブシステムのシンボリックリンクを作成
# (OpenSSHのバグにより、パスにスペースを含むとサブシステムが認識されません)
New-Item -ItemType SymbolicLink `
    -Path "C:\ProgramData\ssh\pwsh.exe" `
    -Target (Get-Command pwsh.exe).Source

次に、sshd_config にサブシステムの設定を追記します。

[ファイル: C:\ProgramData\ssh\sshd_config]

# PowerShellサブシステムの追加(既存の Subsystem sftp 行の下に追記)
Subsystem powershell C:\ProgramData\ssh\pwsh.exe -sshs -NoLogo -NoProfile

設定後、sshdサービスを再起動します。

[実行環境: PowerShell 7.4 (管理者)]

# sshdサービスの再起動
Restart-Service -Name sshd

これで、SSH経由のPowerShellリモーティングが利用可能になります。

# SSH経由でのリモートセッション
# -HostName パラメータはSSHトランスポートを使用することを示す
Enter-PSSession -HostName xxx.xxx.xxx.xxx -UserName Administrator

WinRM と SSH の使い分け: Windows Server同士の接続では WinRM(-ComputerName)が標準的です。Windows と Linux の混在環境や、Active Directoryのない環境では SSH(-HostName)が便利です。

9.8.2 コマンドのリモート実行(Invoke-Command)

Invoke-Command は、対話型セッションを開始せずに、リモートサーバーでコマンドを実行し、結果をローカルに返すコマンドレットです。単発のコマンド実行や、複数サーバーへの一括実行に適しています。

[実行環境: PowerShell 7.4 (管理者)]

# リモートサーバーでコマンドを実行(自分自身に接続してテスト)
Invoke-Command -ComputerName localhost -ConfigurationName "PowerShell.7" -ScriptBlock {
    # リモートサーバーのホスト名とOS情報を取得
    [PSCustomObject]@{
        HostName    = hostname
        PSVersion   = $PSVersionTable.PSVersion.ToString()
        OS          = (Get-CimInstance -ClassName Win32_OperatingSystem).Caption
        Uptime      = (Get-Uptime).ToString()
    }
}

実行結果の例

HostName  : WIN-XXXXXXXXXX
PSVersion : 7.4.x
OS        : Microsoft Windows Server 2025 Datacenter
Uptime    : 3.05:22:10

複数サーバーへの同時実行

-ComputerName パラメータに複数のサーバー名を指定すると、それらのサーバーに対してコマンドを同時に実行できます。

# 複数サーバーへの同時実行(例)
Invoke-Command -ComputerName Server01, Server02, Server03 `
    -ConfigurationName "PowerShell.7" `
    -ScriptBlock {
        Get-Service -Name W32Time |
            Select-Object -Property PSComputerName, Name, Status
    }

実行結果の例

PSComputerName Name    Status
-------------- ----    ------
Server01       W32Time Running
Server02       W32Time Running
Server03       W32Time Stopped

この例では、3台のサーバーに対して同時にW32Timeサービスの状態を確認しています。結果には PSComputerName プロパティが自動的に追加されるため、どのサーバーからの結果かを識別できます。

9.8.3 セッションの管理

頻繁にリモート操作を行う場合、毎回接続・切断を繰り返すのは非効率です。New-PSSession で永続的なセッションを作成し、繰り返し使用できます。

[実行環境: PowerShell 7.4 (管理者)]

# 永続的なセッションを作成
$session = New-PSSession -ComputerName localhost -ConfigurationName "PowerShell.7"

# セッション情報の確認
$session

実行結果の例

 Id Name            Transport ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----            --------- ------------    ------------    -----    -----------------     ------------
  1 Runspace1       WSMan     localhost       RemoteMachine   Opened   PowerShell.7          Available
# 作成したセッションを使ってコマンドを実行
Invoke-Command -Session $session -ScriptBlock {
    Get-Date
}

# セッション内に入る
Enter-PSSession -Session $session

# セッションから抜ける
Exit-PSSession

# 現在のすべてのセッションを確認
Get-PSSession

# セッションの削除(使用後は必ず削除)
Remove-PSSession -Session $session

注意: セッションはサーバー側のリソースを消費します。使い終わったセッションは Remove-PSSession で必ず削除してください。削除せずに放置すると、サーバーのメモリを浪費し続けます。

9.9 信頼されたホストの設定

9.9.1 TrustedHostsの概念

Active Directoryドメインに参加しているサーバー同士であれば、Kerberos認証が自動的に利用され、追加設定なしでWinRMリモーティングが使えます。しかし、ドメインに参加していないサーバー(ワークグループ環境)や、ドメインの異なるサーバーに接続する場合は、WinRMの通信が拒否されます。

このような場合に使用するのが「TrustedHosts(信頼されたホスト)」の設定です。TrustedHostsリストに登録されたサーバーに対しては、Kerberos認証が利用できない場合でも、NTLM認証を使った接続が許可されます。

9.9.2 TrustedHostsの設定方法

[実行環境: PowerShell 7.4 (管理者)]

# 現在のTrustedHosts設定を確認
Get-Item -Path WSMan:\localhost\Client\TrustedHosts

実行結果の例

   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client

Type            Name                           SourceOfValue   Value
----            ----                            -------------   -----
System.String   TrustedHosts

Value が空の場合、TrustedHostsには何も登録されていません。

# 特定のサーバーをTrustedHostsに追加
Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.100"

# 複数のサーバーを登録する場合(カンマ区切り)
Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.100,192.168.1.101"

# 設定の確認
Get-Item -Path WSMan:\localhost\Client\TrustedHosts

セキュリティ上の警告: TrustedHosts*(ワイルドカード)を設定すると、すべてのホストへの接続が許可されます。これはテスト環境では便利ですが、本番環境では絶対に避けてください。NTLM認証ではサーバーの身元確認が十分に行われないため、中間者攻撃(MITM攻撃)のリスクがあります。必ず接続先のIPアドレスまたはホスト名を明示的に指定してください。

9.9.3 HTTPS経由でのWinRM(概念説明)

TrustedHostsよりも安全な方法として、HTTPS経由でのWinRM接続があります。これは、WinRMの通信をSSL/TLSで暗号化し、サーバーの証明書で身元を確認する方式です。

HTTPS経由のWinRM設定には以下が必要です。

  • サーバーにSSL証明書をインストールする
  • WinRMのHTTPSリスナーを作成する(TCP 5986)
  • ファイアウォールでTCP 5986を許可する
  • クライアント側で -UseSSL パラメータを指定して接続する

本シリーズでは詳細な手順は省略しますが、本番環境でワークグループ環境のサーバーにWinRM接続する場合は、TrustedHostsよりもHTTPS経由でのWinRMを検討してください。SSL/TLS証明書の設定については、第15回(DSC実践演習)で学ぶ自己署名証明書の知識が基礎となります。

9.10 Windows Admin Centerの紹介

9.10.1 Windows Admin Centerとは

Windows Admin Center(WAC)は、Microsoftが提供するWebブラウザベースのサーバー管理ツールです。ブラウザからGUI操作でサーバーを管理できるため、RDPの代替として、また複数サーバーの統合管理ツールとして利用されます。

Windows Admin Centerの特徴は以下のとおりです。

  • ブラウザベース: Microsoft EdgeやGoogle Chromeからアクセス可能。専用クライアントソフトは不要
  • 統合管理: 複数のWindows Serverを1つの画面から管理できる
  • モダンなUI: サーバーマネージャーの後継として位置づけられており、直感的なインターフェースを提供
  • バックエンドはWinRM: 内部的にはPowerShellリモーティングとWMIを使用してサーバーと通信する
  • Azure Arc統合: オンプレミスのサーバーをAzure Arcに接続し、Azureポータルから管理することも可能

9.10.2 インストール方法(概要)

Windows Admin Centerは、MSIインストーラーでWindows ServerまたはWindows 10/11にインストールします。最新バージョン(2511、2025年12月時点)は .NET Core 8 ベースのモダンなゲートウェイを採用しています。

基本的なインストール手順は以下のとおりです。

  1. Microsoftの公式サイトからMSIインストーラーをダウンロードする
  2. MSIファイルを実行し、インストールウィザードに従って設定する
  3. インストール完了後、ブラウザで https://サーバー名:ポート番号 にアクセスする

補足: Windows Admin Centerのインストールと詳細な使い方については、本シリーズの範囲を超えるため概要にとどめます。興味のある方は、Microsoft公式ドキュメントを参照してください。

9.10.3 CLI管理との使い分け

管理方式 得意な場面 不得意な場面
PowerShell (CLI) 自動化、スクリプト化、大量のサーバー管理、再現性の確保 視覚的な確認が必要な作業、複雑なGUI操作
Windows Admin Center (GUI) ダッシュボードでの一覧表示、視覚的な監視、初期設定の確認 大量のサーバーに対する同一操作の繰り返し
RDP デスクトップ全体の操作が必要な場面(アプリケーションのインストール等) 帯域幅の消費、スクリプト化が不可

本シリーズでは、自動化・再現性の観点からPowerShell(CLI)を主軸として学習を進めています。Windows Admin Centerは、PowerShellで設定した内容を視覚的に確認する補助ツールとして活用するとよいでしょう。

9.11 リモート管理方式の総合比較

本記事で学んだリモート管理方式を、さまざまな観点から比較します。

比較項目 RDP SSH WinRM
操作方式 GUI(デスクトップ画面) CLI(コマンドライン) CLI(PowerShell)
ポート番号 TCP 3389 TCP 22 TCP 5985 / 5986
暗号化 TLS SSH HTTP(平文)/ HTTPS(暗号化)
クロスプラットフォーム △(クライアントは各OS対応) ○(Windows / Linux / macOS) ×(Windowsのみ)
複数サーバー同時操作 × △(スクリプトで対応可能) ○(Invoke-Commandで標準対応)
帯域消費
AD統合 ○(Kerberos認証)
ファイル転送 クリップボード共有 SCP / SFTP Copy-Item -ToSession
自動化との親和性

9.12 よくあるエラーと対処法

エラーメッセージ 原因 対処法
WinRM cannot complete the operation WinRMサービスが停止している、またはファイアウォールでブロックされている Enable-PSRemoting -Force を実行し、ファイアウォール規則を確認する
The WinRM client cannot process the request ワークグループ環境でTrustedHostsが設定されていない 接続先をTrustedHostsに追加する。またはHTTPS接続を使用する
Cannot find the PowerShell.7 session configuration 接続先サーバーでPowerShell 7.4のリモーティングが有効化されていない 接続先サーバーで pwsh から Enable-PSRemoting -Force を実行する
Access is denied 使用しているアカウントに管理者権限がない 管理者アカウントで接続するか、-Credential パラメータで資格情報を指定する
ssh: connect to host ... port 22: Connection timed out ファイアウォールでSSHポートがブロックされている ファイアウォール規則を確認し、TCP 22(またはカスタムポート)を許可する
subsystem request failed on channel 0 SSH経由のPowerShellリモーティングで、サブシステムが設定されていない sshd_config にPowerShellサブシステムを追加し、sshdを再起動する

9.13 まとめ

第9回では、リモート管理の3つの方式と、OpenSSH Server・PowerShellリモーティング(WinRM)の設定方法を学びました。

  • リモート管理の方式
    • RDP(GUI操作)、SSH(クロスプラットフォーム)、WinRM(PowerShell統合)の3方式を状況に応じて使い分ける
    • セキュリティの観点から、認証の強化、通信の暗号化、ファイアウォール設定、最小権限の原則を常に意識する
  • OpenSSH Server
    • Windows Server 2025ではデフォルトでインストール済み。Start-Service -Name sshdSet-Service -Name sshd -StartupType Automatic でサービスを有効化
    • ファイアウォール規則 OpenSSH-Server-In-TCP がTCP 22を許可する
    • sshd_config でポート番号の変更、認証方式の設定、デフォルトシェルの変更が可能
    • パスワード認証よりも公開鍵認証の方がセキュリティが高い
  • PowerShellリモーティング(WinRM)
    • PowerShell 7.4で Enable-PSRemoting -Force を実行してリモーティングを有効化
    • Enter-PSSession で対話型セッション、Invoke-Command で単発のリモートコマンド実行
    • ワークグループ環境では TrustedHosts の設定が必要(ただしワイルドカードの使用は避ける)
    • セッションは使用後に Remove-PSSession で削除する
  • Windows Admin Center
    • ブラウザベースのGUI管理ツール。PowerShellでの管理を補完する視覚的な確認手段として活用

リモート管理のスキルは、インフラエンジニアの日常業務に直結する重要な基礎技術です。今回設定したOpenSSHとWinRMは、今後の学習でも引き続き活用していきます。

9.14 次回予告

第10回では「役割・機能の管理とタスクスケジューラ」と題して、Windows Serverの役割(Role)と機能(Feature)の概念、Get-WindowsFeatureInstall-WindowsFeature による機能の追加・削除、Windows Updateの管理方法、そしてタスクスケジューラによる定期実行の設定方法を学びます。サーバーに「何の役割を持たせるか」を理解し、必要な機能を追加・管理するスキルを身につけていきましょう。

9.15 参考リンク

Windows Server