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-PSSessionやInvoke-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では、通常 State が Installed と表示されます。もし NotPresent と表示された場合は、次の手順でインストールを行います。
9.5.3 OpenSSH Serverのインストール(未インストールの場合)
State が NotPresent と表示された場合は、以下のコマンドでインストールします。
[実行環境: PowerShell 7.4 (管理者)]
# OpenSSH Serverのインストール
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
実行結果の例
Path :
Online : True
RestartNeeded : False
RestartNeeded が False であれば、再起動なしでそのまま次の手順に進めます。
エラーが発生した場合:
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
Status が Running、StartType が Automatic になっていれば正常です。
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
Enabled が True であれば、ファイアウォールで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
TcpTestSucceeded が True であれば、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-PSSession、Invoke-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 は内部で以下の処理を行います。何が設定されるかを理解しておくことは、トラブルシューティングの際に役立ちます。
- WinRMサービスの起動: WinRMサービスを起動し、スタートアップの種類を「自動」に設定
- リスナーの作成: すべてのIPアドレスでWSManリクエストを受け付けるリスナーを作成
- ファイアウォール例外の設定: WinRM通信(TCP 5985)を許可するファイアウォール規則を作成
- セッション構成の登録: PowerShell 7.4用のリモーティングエンドポイント(セッション構成)を登録
- セキュリティ記述子の設定: リモートアクセスを許可するようセッション構成のセキュリティを設定
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=HTTP、Address=* と表示されていれば、すべての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 ベースのモダンなゲートウェイを採用しています。
基本的なインストール手順は以下のとおりです。
- Microsoftの公式サイトからMSIインストーラーをダウンロードする
- MSIファイルを実行し、インストールウィザードに従って設定する
- インストール完了後、ブラウザで
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 sshdとSet-Service -Name sshd -StartupType Automaticでサービスを有効化 - ファイアウォール規則
OpenSSH-Server-In-TCPがTCP 22を許可する sshd_configでポート番号の変更、認証方式の設定、デフォルトシェルの変更が可能- パスワード認証よりも公開鍵認証の方がセキュリティが高い
- Windows Server 2025ではデフォルトでインストール済み。
- PowerShellリモーティング(WinRM)
- PowerShell 7.4で
Enable-PSRemoting -Forceを実行してリモーティングを有効化 Enter-PSSessionで対話型セッション、Invoke-Commandで単発のリモートコマンド実行- ワークグループ環境では
TrustedHostsの設定が必要(ただしワイルドカードの使用は避ける) - セッションは使用後に
Remove-PSSessionで削除する
- PowerShell 7.4で
- Windows Admin Center
- ブラウザベースのGUI管理ツール。PowerShellでの管理を補完する視覚的な確認手段として活用
リモート管理のスキルは、インフラエンジニアの日常業務に直結する重要な基礎技術です。今回設定したOpenSSHとWinRMは、今後の学習でも引き続き活用していきます。
9.14 次回予告
第10回では「役割・機能の管理とタスクスケジューラ」と題して、Windows Serverの役割(Role)と機能(Feature)の概念、Get-WindowsFeature や Install-WindowsFeature による機能の追加・削除、Windows Updateの管理方法、そしてタスクスケジューラによる定期実行の設定方法を学びます。サーバーに「何の役割を持たせるか」を理解し、必要な機能を追加・管理するスキルを身につけていきましょう。
9.15 参考リンク
- Get started with OpenSSH Server for Windows – Microsoft Learn
- OpenSSH Server configuration for Windows – Microsoft Learn
- PowerShell Remoting Over SSH – Microsoft Learn
- Enable-PSRemoting – Microsoft Learn
- Enter-PSSession – Microsoft Learn
- Invoke-Command – Microsoft Learn
- Windows Admin Center – Microsoft Learn
- OpenSSH key management for Windows – Microsoft Learn
