WindowsのOpenSSHで鍵認証ログインを安定させる設定ポイントとトラブル対処

WindowsのOpenSSHで鍵認証ログインを安定させる近道は、authorized_keys の置き場所をユーザー種別で正しく分け、NTFSのACLを最初に整え、Linux向けの設定例をそのまま流用しないことです。特に管理者ユーザーは通常ユーザーと鍵ファイルの場所が違うため、そこを外すだけで Permission denied (publickey) になりやすくなります。さらに、Windows標準搭載版には使えないディレクティブがあり、バージョン差やPATH競合まで含めて見ないと「設定は合っているのに不安定」という状態になりがちです。 (Microsoft Learn)

この記事では、WindowsのOpenSSHで鍵認証を安定させるための設定順序、詰まりやすいポイント、切り分け手順、代替策までを実務目線で整理します。ローカルアカウントとActive Directoryアカウントの違い、管理者ユーザーの注意点、古いクライアントとの互換問題もまとめて把握できます。 (Microsoft Learn)

目次

まず押さえるべき3つの結論

  • 標準ユーザーなら公開鍵は C:\Users\<ユーザー名>\.ssh\authorized_keys、管理者グループ所属ユーザーなら %ProgramData%\ssh\administrators_authorized_keys が既定です。ここを取り違えると、他が正しくても鍵認証は通りません。 (Microsoft Learn)
  • WindowsではLinuxの chmod / chown よりもACLが重要です。特に administrators_authorized_keys は SYSTEM と Administrators だけが扱える状態に整える必要があります。 (Microsoft Learn)
  • Windows標準搭載版のOpenSSHでは、StrictModes や AuthorizedKeysCommand など、Linux解説でよく出てくる設定が使えないものがあります。Linux記事をそのまま写すより、Windowsの仕様差を前提にした方が安定します。 (Microsoft Learn)

WindowsのOpenSSHで鍵認証が不安定になりやすい理由

管理者ユーザーだけ鍵の置き場所が変わる

Windows版OpenSSHの大きな落とし穴は、管理者グループ所属ユーザーだけ公開鍵の置き場所が変わることです。通常ユーザーはホーム配下の .ssh\authorized_keys を使いますが、管理者は %ProgramData%\ssh\administrators_authorized_keys を使います。Linuxの感覚で全員 C:\Users\<user>\.ssh\authorized_keys にそろえると、管理者ユーザーだけ失敗します。 (Microsoft Learn)

不安定に見える原因の多くはACL

Windowsでは、鍵認証の失敗が「鍵が違う」よりも「ファイルの権限が広すぎる・違う場所にある」で起きやすいです。Microsoft Learn でも、管理者用の administrators_authorized_keys は NT Authority\SYSTEM と BUILTIN\Administrators だけの権限構成にするよう案内しています。まずACLを直す、という順番にするだけで切り分けがかなり楽になります。 (Microsoft Learn)

標準搭載版と最新GitHub版で前提がズレる

Windows標準搭載版のOpenSSHはMicrosoftサポートの対象で安定しやすい一方、更新はWindows Updateのタイミングに寄るため、GitHub版のWin32-OpenSSHより機能や修正が遅れやすい傾向があります。記事や検証メモによって前提バージョンが違うと、同じ設定でも再現性がずれます。 (Microsoft Learn)

失敗しにくい構築手順

日常運用は、できるだけ標準ユーザーから始める

鍵認証を安定させたいだけなら、最初の構築対象は標準ユーザーの方がシンプルです。公開鍵の保存先がユーザーごとに閉じるため、管理者共通ファイルのACLや鍵の棚卸しで悩みにくくなります。WindowsのOpenSSHの鍵認証は、ローカルWindowsアカウントとActive Directoryアカウントで使えますが、Microsoft Entra ID アカウントは対象外です。 (Microsoft Learn)

管理者ユーザーで直接入る構成は、緊急保守や初期構築では便利です。ただし、運用が長くなるほど「誰の鍵が入っているか」「不要な鍵が残っていないか」を追いにくくなります。日常作業や自動化は標準ユーザー、必要時だけ昇格、という分け方の方が安定しやすいです。

公開鍵は .pub の1行をそのまま登録する

authorized_keys は1行に1本の公開鍵を置く形式です。コメント欄は識別用に使えますが、認証の本体ではありません。貼り付けるのは秘密鍵ではなく、あくまで .pub 側です。標準ユーザーなら C:\Users\<ユーザー名>\.ssh\authorized_keys、管理者なら C:\ProgramData\ssh\administrators_authorized_keys に登録します。 (OpenBSD Manual Pages)

クライアント側の鍵生成では、ssh-keygen でアルゴリズム指定を省略すると Ed25519 が使われます。新しめのOpenSSH同士であれば、まずはこの既定値で始めるのが無難です。パスフレーズを付けたうえで ssh-agent と ssh-add を併用すると、毎回の入力負荷を抑えつつ安全性も落としにくくなります。 (Microsoft Learn)

管理者用ファイルのACLは最初に固定する

管理者ユーザーで鍵認証するなら、公開鍵の登録よりACLの固定を先にやった方が安定します。最低限、次の形を基準にしてください。

icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

Microsoft Learn でも、administrators_authorized_keys には SYSTEM と Administrators 以外の権限を残さない構成が案内されています。日本語OSなどでグループ名の表記差分に引っかかる場合は、Administrators の代わりに SID 形式 *S-1-5-32-544 を使う方法も案内されています。 (Microsoft Learn)

sshd_config は最小限から始める

Windowsで安定させたいときほど、sshd_config は最小限にした方が成功しやすいです。ファイルは %ProgramData%\ssh\sshd_config にあり、変更はサービス再起動まで反映されません。 (Microsoft Learn)

最初は次のような構成で十分です。

# C:\ProgramData\ssh\sshd_config

PubkeyAuthentication yes
PasswordAuthentication yes

# トラブル調査時だけ一時的に使う
# SyslogFacility LOCAL0
# LogLevel VERBOSE

# 接続対象を絞る例
# AllowGroups sshusers

ここで大事なのは、最初から AuthorizedKeysFile をいじらないことです。Windowsは既定で、通常ユーザーと管理者ユーザーで鍵ファイルの扱いを分けています。グローバルに AuthorizedKeysFile を上書きすると、そのWindows固有の既定動作を自分で壊しやすくなります。 (Microsoft Learn)

また、AllowUsers や AllowGroups を使うなら、アカウント名・グループ名は小文字で書く前提です。WindowsのドメインユーザーやグループにはWindows固有の表記ルールがあるため、まずはローカルグループで通ることを確認し、その後にAD連携へ広げる方が失敗しにくいです。 (Microsoft Learn)

変更後は必ず構文確認してから再起動する

設定変更後にいきなり再接続するのではなく、まずサーバー側で構文確認を入れます。

sshd -t
Restart-Service sshd

クライアント側は、少なくとも最初の検証では詳細表示つきで接続します。

ssh -v user@server

sshd -t はMicrosoft LearnでもWindowsでの確認手順として案内されています。ログを増やしたいときは LogLevel VERBOSE から始め、必要に応じてファイル出力へ切り替えるのが現実的です。OpenSSHのマニュアルでも、DEBUG系は出力が過剰でプライバシー上の注意が必要とされています。 (Microsoft Learn)

実務で多い失敗パターンと直し方

Permission denied (publickey) が出る

このエラーが出たら、確認順はほぼ決まっています。

  • 対象ユーザーは管理者グループ所属ではないか。所属しているなら、鍵は %ProgramData%\ssh\administrators_authorized_keys 側に置く必要があります。 (Microsoft Learn)
  • administrators_authorized_keys のACLが崩れていないか。余計な継承や権限が残っていないかを見ます。 (Microsoft Learn)
  • AllowUsers / AllowGroups / DenyUsers / DenyGroups で弾いていないか。Windowsではこれらの評価順が決まっており、名前は小文字で書く前提です。 (Microsoft Learn)
  • そもそも sshd_config の変更が再起動前で止まっていないか。Windows版はサービス起動時に設定を読み込みます。 (Microsoft Learn)

パスワード認証は通るのに、鍵認証だけ失敗する

この症状はネットワークではなく、鍵ファイルの場所・内容・ACLの問題であることが多いです。公開鍵は .pub の1行をそのまま入れ、通常ユーザーと管理者ユーザーの保存先を混同しないことが最優先です。Microsoftのトラブルシュートでも、authorized_keys 不在や権限不備は典型原因として挙げられています。 (OpenBSD Manual Pages)

Connection refused やポート未到達になる

これは鍵認証以前の問題です。Get-Service sshd、netstat -an | findstr :22、ファイアウォールの OpenSSH-Server-In-TCP、Event Viewer の Applications and Services Logs > OpenSSH を確認してください。ここが通っていない状態で鍵だけ見直しても前に進みません。 (Microsoft Learn)

古いクライアントだけ接続できない

OpenSSH 8.8 以降では、セキュリティ上の理由で ssh-rsa が既定で無効になっており、レガシー環境だけ失敗することがあります。どうしても暫定対応が必要なら、次の追加で回避できるケースがあります。

PubkeyAcceptedAlgorithms +ssh-rsa
HostKeyAlgorithms +ssh-rsa

ただし、これは恒久策ではありません。実務では、まず古いクライアントやサーバーの更新余地を確認し、やむを得ない場合だけ一時的に有効化する方が安全です。 (Microsoft Learn)

鍵認証では入れるのに、共有フォルダや別サーバーの統合認証が使えない

これは「鍵認証が不安定」ではなく、Windows版OpenSSHの仕様です。鍵ベースで開いたリモートセッションには、そのユーザーの資格情報が関連付かないため、ログイン後のセッションはそのままユーザーとしてのアウトバウンド認証ができません。共有フォルダや別サーバーへの統合認証まで必要な運用では、認証設計そのものを見直した方が早いです。 (Microsoft Learn)

認証後すぐ切れる

認証そのものが成功しているなら、鍵よりも既定シェルを疑う場面があります。Windowsでは、OpenSSHの既定シェルを HKLM\SOFTWARE\OpenSSH の DefaultShell で設定できます。PowerShellを既定シェルにしたい場合も、Microsoft Learn に設定例があります。 (Microsoft Learn)

再起動後だけ入れなくなる

初回の検証中は入れていたのに、再起動後に急に接続できなくなるなら、sshd サービスの起動種類を確認してください。Microsoft Learnでは Start-Service sshd に加え、Set-Service -Name sshd -StartupType Automatic が推奨されています。 (Microsoft Learn)

Linux向けの記事をそのまま適用しない

Windows標準搭載版のOpenSSHでは、Linuxの記事でよく見かける設定の一部がそのまま使えません。ここを知らないまま調整すると、設定を増やすほど不安定になります。 (Microsoft Learn)

  • StrictModes は、Windowsに標準搭載されるOpenSSHでは未対応です。ACLの問題を StrictModes yes/no で解決しようとしない方が安全です。 (Microsoft Learn)
  • AuthorizedKeysCommand と AuthorizedKeysCommandUser も、標準搭載版では使えません。Linuxのように外部コマンドで動的に鍵を引く前提は、そのままでは乗りません。 (Microsoft Learn)
  • PermitRootLogin はWindowsでは意味が違います。管理者のログイン制御は DenyGroups Administrators の考え方で設計します。 (Microsoft Learn)

ここでのコツは、Windows固有の既定動作を崩さないことです。問題が出たときほど設定を増やしたくなりますが、まずは既定の保存先・既定の動作・正しいACLで通る状態を作る方が近道です。

使い回し鍵ではなく、用途別に絞ると事故が減る

鍵認証が安定してきたら、次は「通ればいい」から一歩進めて、鍵の用途を絞ると運用事故が減ります。OpenSSHの authorized_keys では、from= で接続元IPを制限し、command= で実行コマンドを固定し、restrict でポート転送やPTYをまとめて抑制できます。バックアップ専用鍵や自動化鍵では、ここまでやっておくと後から効きます。 (OpenBSD Manual Pages)

Windowsでも、この考え方は有効です。たとえば「社内CIサーバーからの配布だけ」「指定コマンドだけ許可」「対話シェル不要」といった自動化アカウントは、鍵認証の成功率だけでなく、失敗時の影響範囲まで小さくできます。

標準搭載版とGitHub版、どちらを使うべきか

結論からいうと、まずは標準搭載版で素直に動く構成を作るのがおすすめです。Microsoftサポートの範囲で動かせて、Windows Updateで維持しやすいからです。一方で、より新しい暗号方式や修正、新機能が必要なら、GitHub版のWin32-OpenSSHを検討する価値があります。Microsoft Learnでも、GitHub版は最新機能と修正を持つ一方で、手動更新が必要と説明されています。 (Microsoft Learn)

ただし、アップグレードは本番でいきなりやらない方が安全です。Microsoft Learn でも、アップグレード時は sshd が一時停止し、アクティブなSSHセッションが切断されるため、RDPやコンソールなど代替アクセス手段を確保し、まずステージング環境で検証するよう案内しています。 (Microsoft Learn)

アップグレード後や混在環境では、どの ssh.exe / sshd.exe を使っているかまで確認してください。Microsoft Learn でも、ssh -V と Get-Command ssh.exe | Select-Object Source で実体を確認し、古いフォルダがPATHの先頭に残っていないかを見るよう案内しています。PATH競合は、設定が正しいのに挙動だけおかしいときの見落としポイントです。 (Microsoft Learn)

迷ったときの判断基準

  • 日常の運用や自動化なら、まずは標準ユーザー + ユーザープロファイル配下の authorized_keys から始める。これが一番切り分けしやすいです。 (Microsoft Learn)
  • 管理者で直接入る必要があるなら、administrators_authorized_keys とACL整備をセットで考える。片方だけだと安定しません。 (Microsoft Learn)
  • Active Directoryでアクセス制御をかけるなら、AllowUsers / AllowGroups の小文字ルールとWindows固有の表記を意識する。鍵より先にここで落ちることがあります。 (Microsoft Learn)
  • ログイン後に別サーバーや共有フォルダへ統合認証したいなら、鍵認証セッション単体では要件を満たしにくいと考える。設計段階で別の認証経路を検討した方が早いです。 (Microsoft Learn)
  • 動的な鍵配布や最新機能が必要なら、標準搭載版の制約を認めたうえで、構成管理による配布やGitHub版の評価に進む。 (Microsoft Learn)

最後にやること

最初の一歩は、難しい設定を足すことではありません。対象ユーザーが管理者かどうかを確認し、正しい鍵ファイルの場所に公開鍵を置き、ACLを整えたうえで sshd -t と Restart-Service sshd を回す。これだけで、WindowsのOpenSSHの鍵認証はかなり安定します。 (Microsoft Learn)

そのうえで、ssh -v、Event Viewer の OpenSSH > Operational、必要なら %ProgramData%\ssh\logs を使って事実ベースで切り分けてください。まだ不安定なら、アルゴリズム互換、PATH競合、既定シェル、標準搭載版の制約の順に見ると、遠回りしにくくなります。 (Microsoft Learn)

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次