この記事を作った動機

 Linux 環境ばっかりで SSH を使っていて、今まで Windows 環境では SSH クライアントは使ったことがあっても、SSH サーバーは使ったことがないということがあり、慣れていないところがあったので記録をしたい。主に、How to Enable and Configure SSH Server on Windows with OpenSSH | Windows OS Hub参考にした。

 設定としては、パスワード認証は許可せず、全て公開鍵認証をさせるようにしている。そのため、クライアントにて SSH 接続用の公開鍵を作成し、その公開鍵の部分を SSH サーバーとなる Windows 機にて設定する必要がある。基本的に設定は全体として管理者権限を付与して行っていることを前提とする。

手順

OpenSSH をインストールする

 Releases · PowerShell/Win32-OpenSSHによりインストーラをダウンロードし、実行する。インストールされているときと、されていないときで、sshd(SSH サーバ) の設定ファイルが存在するかどうかが変わる。

ダウンロード

  • インストールされていないとき
ls C:\Programdata\ssh\sshd_config
# ls : パス 'C:\Programdata\ssh\sshd_config' が存在しないため検出できません。
# 発生場所 行:1 文字:1
# + ls C:\Programdata\ssh\sshd_config
# + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#     + CategoryInfo          : ObjectNotFound: (C:\Programdata\ssh\sshd_config:String) [Get-ChildItem], ItemNotFoundException
#     + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
  • インストールされているとき
 ls C:\Programdata\ssh\sshd_config
# 
#     ディレクトリ: C:\Programdata\ssh
# 
# Mode                 LastWriteTime         Length Name
# ----                 -------------         ------ ----
# -a----        2025/10/22     19:12           2230 sshd_config

OpenSSH を設定する

 エディタはなんでもいいが、とにかくC:\Programdata\ssh\sshd_configを開いて編集する。管理者権限が必要である。設定内容は各自調整が必要である。以下は簡易的にテスト用に用意した設定であり、適切ではないと思われる。

code C:\Programdata\ssh\sshd_config
# ルート(管理者権限を持ったアカウント)でログインさせない
PermitRootLogin no

# 公開鍵によるユーザ認証を許可する
PubkeyAuthentication yes

# パスワードによるユーザ認証は許可しない
PasswordAuthentication no

# OpenSSH(Win版) ダウンロード時にデフォルトで有効になっている設定である。
# 管理者アカウントをOpenSSHデフォルトの設定で管理する場合、クライアントの公開鍵のパスは以下のようになる
# __PROGRAMDATA__/ssh/administrators_authorized_keys
# C:\ProgramData\ssh\administrators_authorized_keys
# 管理者アカウントであってもユーザー配下のホームディレクトリに公開鍵の設定を配置したい場合、以下の記述を削除するとできる。できれば避けたほうがいいかもしれない。
Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

OpenSSH のサービスを有効化する

 Windows 版 Systemd のようなコマンドを操作する。管理者権限が必要である。

コマンドライン (PowerShell)

# 起動時に自動的に SSH サーバーが立ち上がるようにする
set-service sshd -StartupType Automatic

# 初回起動時
start-service sshd

# 設定を反映するために再起動する
restart-service sshd

# 起動している様子を確認する
get-service

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

# SSH サーバーをを停止する
stop-service sshd

GUI

 サービスなどと検索して管理画面を開き、設定を行う。

GUIによるサービス起動設定
GUIによるサービス起動設定

ファイヤウォールを設定する

 SSH 接続ができるようにファイヤウォールに穴をあける(ポート開放)の設定が必要である。この操作をする際は PC が接続されている LAN などが安全であることを確認する必要がある。例えば、グローバルネットワーク(インターネット)に直接如何なるファイヤウォールとかもなしにつながっている PC 等では、設定を突き詰める必要があり、攻撃対象となりやすくセキュリティーの観点から推奨できないように見受けられる。

 OpenSSH をインストールした時点ですでに有効(疎通ができる状態)になっている場合もあるようである。

firewall設定-GUI
firewall設定-GUI
firewall設定-GUI
firewall設定-GUI
firewall設定-GUI

SSH の公開鍵を登録する

 注意事項として、Windows で管理者アカウントに対しては SSH したい場合、ユーザアカウントのホームディレクトリ配下ではなく、専用の決められた場所に公開鍵を保存する必要がある。ここでいう公開鍵とは、**SSH 接続をするクライアント(接続元)**となる PC 上においてあらかじめ生成しておいた公開鍵と秘密鍵のペアのうちの、秘密鍵ではないほうのことである。

  • ユーザ配下に配置される SSH サーバーの公開鍵設定の場所
# [UserName] は適宜置き換えること
C:\Users\[UserName]\.ssh\authorized_keys
  • Administrators グループに属しているアカウントにおける SSH サーバーの公開鍵設定の場所
C:\ProgramData\ssh\administrators_authorized_keys
  • 登録する公開鍵の例 (ファイル名に.pubとついているもの)  以下のような内容を登録する。間違っていると認証が通らない。以下は例示として一部を改変したものである。
# "..." の部分は省略を意味する
ssh-ed25519 AAA...PLdz [ユーザ名]@[ホスト名]

SSH 接続を行う

前提条件

  • 管理者アカウントに SSH でログインしようとしている
  • SSH クライアント(接続元) と SSH サーバー(接続先) 同一の LAN など、同じネットワークに属していること
  • SSH のクライアントとサーバーとなる PC 間において、Ping などの疎通確認ができていること
  • SSH 接続するユーザ名を test とする

接続の様子

  • SSH サーバーとなる Win 機において、IP アドレスを確認
ipconfig

# Windows IP 構成
# 
# イーサネット アダプター イーサネット:
# 
#    接続固有の DNS サフィックス . . . . .: example.com
#    リンクローカル IPv6 アドレス. . . . .: 
#    IPv4 アドレス . . . . . . . . . . . .: 192.168.1.35
#    サブネット マスク . . . . . . . . . .: 255.255.255.0
#    デフォルト ゲートウェイ . . . . . . .: 192.168.1.1
  • アカウント名を確認
whoami
[PCのホスト名]\test
  • SSH クライアントとなる PC からアクセスを試みる
ssh test@192.168.1.35

Microsoft Windows [Version 10.0.26200.9457]
(c) Microsoft Corporation. All rghts reserved.

test@[PCのホスト名] C:\Users\test>exit
Connection to 133.54.220.136 closed.

おまけ(躓いたこと)

Ping が通らない

 Windows 機に対して Ping をすることで疎通確認したいとき、以下の項目を許可するだけでは Ping が通らないことがあることが分かった。ファイヤウォール設定の開き方はファイヤウォールを設定するを参照すること。

元々していたPing設定
 追加で以下の項目も有効にしたところ Ping が通るようになった。セキュリティー上の懸念がある場合は、必要な時以外は無効化することが考えられる。
追加で行ったPing設定

SSH 接続できない

 今回の場合は、管理者権限を持つアカウントの場合authorized_keysの配置が通常とは異なり、sshd_configを以下のようにしている場合(OpenSSH デフォルト)、専用の場所に保存されていることが問題の背景としてあった。修正としては、ユーザのホームディレクトリではなく、専用の場所に公開鍵を正しく配置することが必要である。

# ...
Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
# ...
  • ユーザ配下に配置される SSH サーバーの公開鍵設定の場所
# [UserName] は適宜置き換えること
C:\Users\[UserName]\.ssh\authorized_keys
  • Administrators グループに属しているアカウントにおける SSH サーバーの公開鍵設定の場所
C:\ProgramData\ssh\administrators_authorized_keys

確認したほうがよさそうなファイヤウォール設定

 Windows では、ネットワークをパブリックとプライベートの2つに分けて設定を使い分けられるようになっている。接続がうまくいかない場合、SSH サーバーとしている Win 機のネットワーク接続設定にて既存の接続をプライベート扱いにすることによって信頼するように設定したり、以下の画像に示すようなファイヤウォールの設定を追加でした方がよいかもしれない。

ファイヤウォール設定でさらに確認したほうがよさそうな項目
ファイヤウォール設定でさらに確認したほうがよさそうな項目
ファイヤウォール設定でさらに確認したほうがよさそうな項目
ファイヤウォール設定でさらに確認したほうがよさそうな項目

関係ありそうな記事

使った画像とか

参考にしたサイトとか