Windows 10 への SSH 接続

2021年12月2日

やりたいことは、標準機能だけで Windows 10 に SSH サーバを構成し、別の Windows 10 から公開鍵認証で SSH 接続するというものです。色々と Google 先生には情報あるのですが、バージョンの関連もあるのか少し嵌ったのでメモ代わりに残しておきます。環境は Windows 10 Pro 20H2 です。「Windows での OpenSSH」にある一連のマクロソフトのドキュメントを参考にしています。

SSH クライアント設定

ユーザーキーの作成

公開鍵認証にするので、最初にクライアント側( SSH 接続する側)でキーを作成しておくとわかりやすいです。コマンドプロンプトから以下のコマンドで公開鍵と秘密鍵を作成します。

ssh-keygen -t ed25519

最初に「Enter file in which to save the key」(キーファイルをどこに作りますか)と聞かれますが、デフォルトのままで OK です。次に「Enter passphrase (empty for no passphrase)」(パスフレーズを入力してください。まあ空でもいいけどね、、、)と聞かれます。ここには何かパスワード相当を入力するようにしてください。最後に「Enter same passphrase again」で同じパスフレーズを入力すると、デフォルトで “%HOMEPATH%\.ssh" 配下に以下が作成されます。

  • id_ed25519 :秘密鍵
  • id_ed25519.pub :公開鍵 → これは「SSH サーバの構成」で利用します

一連の実行イメージは以下のような感じです。

キーの作成

秘密鍵を ssh-agent へ登録する

「OpenSSH キーの管理」には以下とあります。秘密鍵を生ファイルのまま残しておくのは危険ってことですね。そりゃそうですね。

秘密キーを ssh-agent に追加した ““、セキュリティで保護された場所にバックアップしてから、ローカル システムから削除することを強くお勧めします。 この例の Ed25519 のように、強力なアルゴリズムが使用されているエージェントから秘密キーを取得することはできません。 秘密キーにアクセスできなくなった場合は、新しいキー ペアを作成し、操作するすべてのシステム上で公開キーを更新する必要があります。

「OpenSSH キーの管理」

ssh-agent はデフォルトで表示名「OpenSSH Authentication Agent」としてサービスに登録されていますが「無効」になっているので、これを「自動」に変更して、サービスも開始しておきます。

ssh-agent の起動

次に以下のコマンドで、秘密鍵を ssh-agent に登録します。

ssh-add %HOMEPATH%\.ssh\id_ed25519

また、秘密鍵が登録されたかどうかは以下で確認できます。

ssh-add -l

もし ssh-agent が起動していない場合は上記コマンドを実行すると「Error connecting to agent: No such file or directory」エラーになります。一連の実行イメージは以下のような感じです。

尚、秘密鍵( %HOMEPATH%.ssh\id_ed25519 )は最後の SSH 接続確認まで終わったら削除しておきましょう。

SSH サーバの構成

SSH サーバーインストール

サーバー側( SSH 接続される側)の作業です。デフォルトでは、SSH サーバはないので「設定」→「アプリ」→「オプション機能」にて「機能の追加」から『OpenSSH サーバー』をインストールします。

SSH サーバーインストール

sshd_config の編集

インストールされたら"%PROGRAMDATA%\ssh"(=C:\ProgramData\ssh)フォルダ配下にある SSHサーバーの設定ファイルである"sshd_config"を編集します。ちなみにオリジナルは
 "C:\Windows\System32\OpenSSH\sshd_config_default"
にあります。設定は公開鍵暗号方式のみを許すように設定した場合は、以下のような差分になるはずです。

sshd_config の編集

PubkeyAuthentication (公開鍵認証)を yes にしておき、PasswordAuthentication (パスワード認証)および PermitEmptyPasswords(パスワード空を許す)をいずれも no にしておきます。

公開鍵の登録

SSH サーバに接続するクライアント側で作成した公開鍵を登録します。今回登録するユーザは管理者ユーザ(=administrators グループに所属するユーザ)であるため、"%PROGRAMDATA%\ssh" フォルダ配下に「administrators_authorized_keys」というファイルを作成します。(標準ユーザのケースは割愛します)

ファイルの中身は、SSHクライアント設定で作成した公開鍵( id_ed25519.pub )の中身と全く同じものです。つまり、初めての登録であれば “id_ed25519.pub" をそのまま “administrators_authorized_keys" というファイル名にリネームしても良いということです。

大事なのはこの"administrators_authorized_keys"ファイルのパーミッションです。これを正しく行ってないとSSH接続の際に「Permission denied (publickey)」エラーになります。まあ、他の設定間違ってても同じエラーなので結構悩まされるところなんですが。

該当ファイルの「プロパティ」→「セキュリティ」→「詳細設定」から設定します。SYSTEM, Admistrators 以外のアクセス権を削除し、継承の無効化を実行します。

公開鍵の登録(1)

ちなみに、これをコマンドでやる場合は以下です。

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

SSH サーバの起動

ここまでで設定が終わりましたので、SSH サーバを起動します。インストール時に表示名「OpenSSH Server」としてサービス登録されていますので、こちらを「自動」起動に変更し、サービスも開始します。

SSH サーバの起動

SSH 接続確認

いよいよ SSH 接続してみます。SSH クライアントを設定した側の Windows から以下のコマンドで接続してみます。ssh-agent に秘密鍵を登録しているので、接続先のホスト名(または IP アドレス)だけで良いです。

ssh 《接続先ホスト名 または IP アドレス》

相手サーバに接続できれば OK です。

ちなみに、接続エラー等が発生した場合は、SSH サーバ側のイベントログに出力される(はず)なのですが、普通のログに出力したい場合は、SSH サーバ側の sshd_config を以下のように修正します。

sshd_config の編集

SyslogFacility に LOCAL0 をすることでファイル出力、LogLevel は出力したいログのレベルで一番細かいのが VERBOSE です。ログの出力先は「%PROGRAMDATA%\ssh\logs\sshd.log」です。

今回接続したユーザについては、いずれの Windows にも同じマイクロソフトアカウントでログインしている状態でした。ローカルアカウントだったらどうなってたのかとか色々と気になるところはありますが、とりあえず変に苦労したのをメモ代わりに残すということが目的でしたので、これにて終わります。

WindowsSSH

Posted by takmaru