Windows で SSH 公開鍵認証を設定|パスワードなし接続の手順

  • URLをコピーしました!
目次

はじめに

前回の記事では、Windows に OpenSSH Server をインストールし、外部から接続できるようにする手順を紹介しました(関連記事『Windows で OpenSSH Server を構築』)ただし、初期状態の「パスワード認証」のままインターネット等に公開するのは、機械的にパスワードを試し続けるブルートフォース攻撃(総当たり攻撃)に弱く、好ましくありません。

そこで本記事では、より強固な「公開鍵認証」への切り替え手順を解説します。これにより、秘密鍵を持つ端末からしか接続させない(安全性の向上)うえに、ログイン時のパスワード入力が不要になる(利便性の向上)というメリットが得られます。

この記事でわかること
  • 鍵ペア(公開鍵・秘密鍵)の作成方法(PowerShell の ssh-keygen)
  • サーバー側への公開鍵の設置場所(一般ユーザーと管理者で異なる点)
  • 管理者ユーザーで必要になる権限設定(つまずきやすい点)
  • パスワード認証の無効化

公開鍵認証の仕組み(概要)

公開鍵認証では、ペアになる「秘密鍵(Private Key)」と「公開鍵(Public Key)」を使います。秘密鍵は自分だけが厳重に持つ鍵、公開鍵はサーバーに置く鍵です。サーバーに置いた公開鍵に対応する秘密鍵を持つ端末だけが接続でき、秘密鍵そのものはネットワークを流れません。鍵は非常に長い暗号データのため、パスワードよりも総当たり攻撃に強くなります。

仕組みの詳細(対称鍵との違い、なぜ安全なのか、ハイブリッド暗号の考え方)は、関連記事『対称鍵と公開鍵の違い』で図解しています。本記事は設定手順に集中します。

公開鍵の導入手順

設定は、クライアントで鍵ペアを作成し、その公開鍵をサーバーに設置し、秘密鍵を持つ端末から接続する、という流れです。

STEP

鍵ペアの作成(クライアント側)

まず「操作する 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(公開鍵: サーバーに渡す方)です。

STEP

サーバー側への公開鍵の設置

作成した公開鍵(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"
STEP

パスワード認証の無効化(推奨)

鍵での接続を確認できたら、パスワード認証を無効化します。これにより、鍵を持たない接続を遮断できます。

サーバー側で、テキストエディター(メモ帳など)を「管理者として実行」し、C:\ProgramData\ssh\sshd_config を開きます。以下の行を探し、行頭の # を外して値を no に変更します。

# 変更前
#PasswordAuthentication yes

# 変更後
PasswordAuthentication no

設定を反映するため、PowerShell(管理者)でサービスを再起動します。

Restart-Service sshd

なお、パスワード認証を無効化する前に、鍵で接続できることを必ず確認してください。確認前に無効化すると、自分も接続できなくなる可能性があります。

STEP

接続確認

クライアント側から、パスワード入力なしで接続できるかをテストします。

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 Message

Accepted 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 のみに許可する。
  • 鍵で接続できてからパスワード認証を無効化する。
  • 仕組みの理解は公開鍵暗号の解説記事を参照する。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次