Windows の OpenSSH の公開鍵を管理者アカウントで登録する際の注意点
結論
- Windows の OpenSSH Server (sshd) のデフォルト設定では、管理者アカウントの SSH 公開鍵は
C:\Users\ユーザー名\.ssh\authorized_keys
ではなくC:\ProgramData\ssh\administrators_authorized_keys
に登録する必要がある。 - これは、
sshd_config
の以下の設定が原因。
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
- 対策は 2 種類
-
C:\ProgramData\ssh\administrators_authorized_keys
に公開鍵を追記し適切なアクセス権を設定する -
sshd_config
を編集して前述の設定をコメントアウトする
-
はじめに
Windows の OpenSSH Server において、Linux と同じ感覚で、管理者ユーザーのホームディレクトリ(C:\Users\ユーザー名\.ssh\authorized_keys
)に公開鍵を設置したのに、なぜかパスワード認証を求められてしまい、「あれ?」となった経験はないでしょうか?
本記事では、この Windows OpenSSH Server 特有の「管理者アカウントにおける公開鍵の登録」の注意点と、その解決策について解説します。
一般的な公開鍵の登録方法
まず、一般的な OS(Linux や macOS、あるいは Windows の一般ユーザー)における SSH 公開鍵の登録手順をおさらいします。
- クライアント側で鍵ペア(秘密鍵と公開鍵)を生成します。
ssh-keygen -t ed25519
- サーバーにログインし、ホームディレクトリに
.ssh
フォルダとauthorized_keys
ファイルを作成し、適切なパーミッションを設定します。# サーバー側での操作 (Linux/macOSの場合) mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
-
~/.ssh/authorized_keys
ファイルに、クライアントの公開鍵(id_ed25519.pub
など)の内容を追記します。
管理者アカウントの落とし穴
多くの場合、この手順で公開鍵認証による SSH 接続が可能になります。
しかしながら、Windows においてAdministrators
グループに所属するユーザーで SSH ログインしようとする場合、上記と同じように C:\Users\ユーザー名\.ssh\authorized_keys
に公開鍵を設置しても、公開鍵認証は用いられず、パスワード認証が求められてしまいます。
なぜなら、Windows 版の OpenSSH Server は、セキュリティと管理の観点から、管理者グループに所属するユーザーに対して特別な設定を適用しているからです。
原因は sshd_config
その設定は、OpenSSH Server の設定ファイルであるsshd_config
に記述されています。
このファイルは通常、C:\ProgramData\ssh\sshd_config
にあります。
ファイルの中身を確認すると、末尾に以下のような記述が見つかります。
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
この設定を読み解いてみましょう。
-
Match Group administrators
:administrators
グループに所属するユーザーが SSH 接続してきた場合に、このブロック内の設定を適用するという意味です。 -
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
: 公開鍵が格納されているファイルのパスを指定するAuthorizedKeysFile
ディレクティブが、通常とは異なるパスに上書きされています。
__PROGRAMDATA__
は、Windows の環境変数%ProgramData%
(通常はC:\ProgramData
)に解決されるトークンです。
つまり、管理者グループのユーザーがログインする際は、C:\ProgramData\ssh\administrators_authorized_keys
というファイルを公開鍵の置き場所として参照するように設定されてます。
正しい公開鍵登録手順
この問題を解決するには、2 つの方法があります。推奨されるのは方法 1 です。
方法 1: administrators_authorized_keys に公開鍵を登録する
デフォルトの設定に従い、指定されたファイルに公開鍵を登録します。
-
ファイルを作成し、公開鍵を追記する
管理者権限で PowerShell を開き、以下のコマンドを実行します。ssh-ed25519 AAAA...
の部分は自分の公開鍵に置き換えてください。Add-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value "ssh-ed25519 AAAA..."
ファイルがまだ存在しない場合は、このコマンドで自動的に作成されます。
-
適切なアクセス権を設定する
このファイルは重要なので、適切なユーザーのみが読み書きできるようにicacls
やset-acl
などで適切なパーミッションを設定する必要があります。
おすすめはC:\ProgramData\ssh\ssh_host_rsa_key
などの既存のホスト鍵のパーミッション設定をコピーする方法です。Get-Acl "C:\ProgramData\ssh\ssh_host_rsa_key" | Set-Acl "C:\ProgramData\ssh\administrators_authorized_keys"
方法 2: sshd_config を編集する
各管理者ユーザーが自身のホームディレクトリで公開鍵を管理できるようにしたい場合は、sshd_config
の設定を変更します。
-
管理者権限で
C:\ProgramData\ssh\sshd_config
を開きます。 -
ファイルの末尾にある
Match Group administrators
ブロックをコメントアウトします。# Match Group administrators # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
-
設定を保存し、
sshd
サービスを再起動して変更を適用します。Restart-Service -Name sshd
この設定変更後は、管理者アカウントも一般ユーザーと同様に
C:\Users\ユーザー名\.ssh\authorized_keys
を参照するようになるので、従来通りの方法で公開鍵を管理できます。ただし、この方法では各管理者が自身の鍵を管理することになり、サーバー全体のアクセスキーを一元管理できなくなるため、セキュリティポリシーや運用ルールによっては推奨されません。
逆にいえば、自宅の PC など、管理者アカウントが 1 つだけで運用している場合は、この方法が手軽です。
まとめ
- Windows の OpenSSH Server で管理者アカウントの公開鍵を設定する際は、一般的な
~/.ssh/authorized_keys
ではなく、デフォルトでC:\ProgramData\ssh\administrators_authorized_keys
が使われる。 - 原因は
sshd_config
にあるMatch Group administrators
の設定。 - 解決策は、
administrators_authorized_keys
に公開鍵を追記し適切なアクセス権を設定するか、sshd_config
のMatch Group administrators
をコメントアウトすること。
参考
Discussion