🔑

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 公開鍵の登録手順をおさらいします。

  1. クライアント側で鍵ペア(秘密鍵と公開鍵)を生成します。
    ssh-keygen -t ed25519
    
  2. サーバーにログインし、ホームディレクトリに .ssh フォルダと authorized_keys ファイルを作成し、適切なパーミッションを設定します。
    # サーバー側での操作 (Linux/macOSの場合)
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
  3. ~/.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 に公開鍵を登録する

デフォルトの設定に従い、指定されたファイルに公開鍵を登録します。

  1. ファイルを作成し、公開鍵を追記する
    管理者権限で PowerShell を開き、以下のコマンドを実行します。ssh-ed25519 AAAA... の部分は自分の公開鍵に置き換えてください。

    Add-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value "ssh-ed25519 AAAA..."
    

    ファイルがまだ存在しない場合は、このコマンドで自動的に作成されます。

  2. 適切なアクセス権を設定する
    このファイルは重要なので、適切なユーザーのみが読み書きできるようにicaclsset-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の設定を変更します。

  1. 管理者権限で C:\ProgramData\ssh\sshd_config を開きます。

  2. ファイルの末尾にある Match Group administrators ブロックをコメントアウトします。

    # Match Group administrators
    #        AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
    
  3. 設定を保存し、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_configMatch Group administratorsをコメントアウトすること。

参考

https://github.com/PowerShell/Win32-OpenSSH/wiki/Setup-public-key-based-authentication-for-windows
https://learn.microsoft.com/en-us/windows-server/administration/OpenSSH/openssh-server-configuration#authorizedkeysfile
https://qiita.com/hiro_f/items/090165465202a3edf572
https://github.com/PowerShell/Win32-OpenSSH/issues/1942#issuecomment-1145579119

Discussion