はじめに
前回の記事では、Windows に OpenSSH Server をインストールし、外部から接続できるようにする手順を紹介しました(関連記事『Windows で OpenSSH Server を構築』)ただし、初期状態の「パスワード認証」のままインターネット等に公開するのは、機械的にパスワードを試し続けるブルートフォース攻撃(総当たり攻撃)に弱く、好ましくありません。
そこで本記事では、より強固な「公開鍵認証」への切り替え手順を解説します。これにより、秘密鍵を持つ端末からしか接続させない(安全性の向上)うえに、ログイン時のパスワード入力が不要になる(利便性の向上)というメリットが得られます。
- 鍵ペア(公開鍵・秘密鍵)の作成方法(PowerShell の ssh-keygen)
- サーバー側への公開鍵の設置場所(一般ユーザーと管理者で異なる点)
- 管理者ユーザーで必要になる権限設定(つまずきやすい点)
- パスワード認証の無効化
公開鍵認証の仕組み(概要)
公開鍵認証では、ペアになる「秘密鍵(Private Key)」と「公開鍵(Public Key)」を使います。秘密鍵は自分だけが厳重に持つ鍵、公開鍵はサーバーに置く鍵です。サーバーに置いた公開鍵に対応する秘密鍵を持つ端末だけが接続でき、秘密鍵そのものはネットワークを流れません。鍵は非常に長い暗号データのため、パスワードよりも総当たり攻撃に強くなります。
仕組みの詳細(対称鍵との違い、なぜ安全なのか、ハイブリッド暗号の考え方)は、関連記事『対称鍵と公開鍵の違い』で図解しています。本記事は設定手順に集中します。
公開鍵の導入手順
設定は、クライアントで鍵ペアを作成し、その公開鍵をサーバーに設置し、秘密鍵を持つ端末から接続する、という流れです。

鍵ペアの作成(クライアント側)
まず「操作する PC(クライアント側)」で鍵ペアを作成します。Windows 10/11 では、PowerShell で ssh-keygen が使えます。
ssh-keygen -t ed25519アルゴリズムを指定しない場合の既定も Ed25519 です。RSA を使う場合は、ssh-keygen -t rsa -b 3072 のように 3072 ビット以上を指定することをおすすめします。
参考: Microsoft Learn「Key-based authentication in OpenSSH for Windows」
“If you don’t specify an algorithm, Ed25519 is used”
(アルゴリズムを指定しない場合は Ed25519 が使われる)
https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
コマンドを実行すると、いくつか質問されます。保存場所は、何も入力せず Enter(既定の .ssh フォルダーに保存)で構いません。パスフレーズは、秘密鍵自体にパスワードをかけたい場合に入力します(自動化したい場合は空のまま Enter、安全性を優先するなら設定を推奨)。
作成が完了すると、C:\Users\ユーザー名\.ssh\ に 2 つのファイルができます。id_ed25519(秘密鍵: 他人に渡さず厳重に管理)と、id_ed25519.pub(公開鍵: サーバーに渡す方)です。
サーバー側への公開鍵の設置
作成した公開鍵(id_ed25519.pub)の中身を、サーバー側の許可リストに登録します。ここが注意点で、Windows 版 OpenSSH Server では、ログインするユーザーが一般ユーザーか管理者かで、置く場所が異なります。
まず、クライアント側で id_ed25519.pub をメモ帳などで開き、中の文字列(ssh-ed25519 AAAA... から始まる 1 行)をすべてコピーします。
A. 一般ユーザーでログインする場合
Linux と同じ標準的な場所に配置します。
- 配置パス:
C:\Users\ユーザー名\.ssh\authorized_keys - ファイル名は複数形の
authorized_keysです。ファイルがなければ新規作成します。
B. 管理者ユーザー(Administrators)の場合
ユーザーフォルダーではなく、システム全体のフォルダーを使います。これは sshd_config に既定で入っている Match Group administrators の指定によるものです。
- 配置パス:
C:\ProgramData\ssh\administrators_authorized_keys - ファイル名は
administrators_authorized_keysです(authorized_keysではありません)
そして管理者ユーザーで特に重要なのが、このファイルの権限設定です。継承を外し、Administrators と SYSTEM だけにアクセスを許可する必要があります。これを行わないと、公開鍵を正しく置いても認証が通らず、パスワードを求められ続けます。PowerShell(管理者)で次を実行します。
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
パスワード認証の無効化(推奨)
鍵での接続を確認できたら、パスワード認証を無効化します。これにより、鍵を持たない接続を遮断できます。
サーバー側で、テキストエディター(メモ帳など)を「管理者として実行」し、C:\ProgramData\ssh\sshd_config を開きます。以下の行を探し、行頭の # を外して値を no に変更します。
# 変更前
#PasswordAuthentication yes
# 変更後
PasswordAuthentication no設定を反映するため、PowerShell(管理者)でサービスを再起動します。
Restart-Service sshdなお、パスワード認証を無効化する前に、鍵で接続できることを必ず確認してください。確認前に無効化すると、自分も接続できなくなる可能性があります。
接続確認
クライアント側から、パスワード入力なしで接続できるかをテストします。
ssh ユーザー名@サーバーのIPアドレスパスワードを求められずにログインできれば成功です。鍵を明示的に指定する場合は、ssh -i C:\Users\ユーザー名\.ssh\id_ed25519 ユーザー名@サーバーのIPアドレス のように指定します。Permission denied (publickey). と表示される場合は、設置場所・ファイル名・権限設定を見直します。
うまく接続できないときは(トラブルシューティング)
公開鍵認証がうまくいかないときは、上から順に確認すると切り分けやすくなります。
- 管理者ユーザーなのに、一般ユーザー用の
authorized_keysに置いていないか(管理者はadministrators_authorized_keysを使います)。 administrators_authorized_keysの権限設定(icacls)が未実施でないか。管理者で最も多いつまずきです。- ファイル名やパスの誤りがないか(
authorized_keysの複数形、拡張子なし)。 - 公開鍵の文字列が、改行や欠落で壊れていないか。クライアントの
.pubとサーバー側ファイルの内容が、1 文字も違わず一致しているかを見比べます。
原因の特定には、サーバー側のログ確認も役立ちます。
Get-WinEvent -LogName "OpenSSH/Operational" -MaxEvents 10 | Select-Object -ExpandProperty MessageAccepted publickey が記録されていれば成功、権限に関するメッセージが出ていれば設置場所や ACL を見直します。古い鍵タイプを使っている場合は、Ed25519 などへの更新も検討します。
参考: Microsoft Learn「OpenSSH Client Can’t Connect To a Server via SSH」
“Replace legacy RSA keys with stronger keys (minimum 3072-bit RSA or ED25519)”
(古い RSA 鍵は、より強力な鍵(最低 3072 ビット RSA または ED25519)に置き換える)
https://learn.microsoft.com/en-us/troubleshoot/windows-server/system-management-components/open-client-can-not-connect-server
まとめ
本記事では、Windows 版 OpenSSH での公開鍵認証の設定と、パスワード認証の無効化を解説しました。鍵を持つ端末だけが接続でき、総当たり攻撃のリスクを下げられます。特に管理者ユーザーでは、公開鍵の設置場所と権限設定に注意が必要です。
- 鍵ペアは ssh-keygen で作成し既定は Ed25519
- 秘密鍵は端末に保管し公開鍵をサーバーへ置く。
- 一般ユーザーは .ssh\authorized_keys に設置する。
- 管理者は administrators_authorized_keys を使う。
- 管理者用ファイルは Administrators と SYSTEM のみに許可する。
- 鍵で接続できてからパスワード認証を無効化する。
- 仕組みの理解は公開鍵暗号の解説記事を参照する。
以上、最後までお読みいただきありがとうございました。
