Unixには、ネットワークを介して、他のマシンを使うためのリモートシェル(rsh)やリモートログイン(rlogin)、テキスト通信(telnet)といった機能があった。インターネット初期のソフトウェアであるため、平文で通信を行っていた。世界がインターネットでつながると、その分、危険も増え、平文でパスワードを送るなんてことは危険な行為になった。IPsecやVPNのように通信全体を暗号化してその中で従来のプロトコルを使うという手法が使われたが、管理がかなり面倒だった。Windowsにもtelnetとtelnetサーバーがあったが事情は同じだった。

そんな中、暗号化通信を行う「Secure Shell」が1995年に開発された。これは、リモートシェルのように他のマシンに接続してシェル操作を可能にするものだが、接続、認証から暗号通信までを自分自身で管理するプログラムだった。一時、商業ソフトウェアであり、多数の実装があった。しかし、2006年にRFCとなり、オープンソース版のOpenSSHが開発されてからは、OpenSSHのソースコードをベースにした各プラットフォーム向けの「移植版」が作られ、接続問題はほとんど見られなくなった。

SSHはWindows 10で標準搭載されたが、当初の実装はLinux/Unixで使われていたOpenSSHとは、大きく異なるものだった(図01)。というのも当時のWindowsのコンソールには、Linux/Unixのpty(Pseudo TTY)に相当する疑似コンソール(ConPTY。Console Pseudo TTY)機能がなく、コンソール・アプリケーションであるシェルの画面バッファを操作してSSHサーバー側を実現していたからだ。

図01: Windows 10 Ver.1809以前、Windows 10のSSHサーバーは、コンソールウィンドウを読み出し、キーコードを送って、シェルを操作させていたWindows Command-Line: Introducing the Windows Pseudo Console (ConPTY) - Windows Command Line

WindowsのConPTYは、オープンソース・プロジェクトであるWindows Terminalと並行して開発された。ConPTYが搭載されたのは、Windows 10 Ver.1809からだ。仮想コンソールが有効になったため、シェルなどのコンソール・アプリケーションの仮想コンソールにSSHサーバーなど別のソフトウェアを接続可能になった。これにより、WindowsのSSHは特殊なものではなく、OpenSSHの多数ある移植版とほぼ同じ構造になった。

とはいえ、古い技術でもあり、インターネットには大量のWindowsとSSHの記事があり、情報が古いままのものが少なくない。また、作業を単純化するあまり、危険なやり方をしているものもある。そこで、Windows 11(Ver.23H2)でのOpenSSHの基本設定に関して、基本的な解説しておくことにしよう。

現在のWindows 11には、他のマシンにSSHでログインするための「OpenSSHクライアント」(ssh.exe)が標準で搭載されている。他のマシンからのログインを可能にする「OpenSSHサーバー」は、Windowsのオプション機能として有効化できる。また、公開鍵によるログインを行うためのSSH-Agentサービスも搭載されているが、標準状態では停止状態である。

他のマシンにSSHで接続するためには、該当のマシンの証明と認証で使う「暗号化キー」を作る必要がある。それには、PowerShellから以下のコマンドを使って「Ed25519」形式の公開鍵暗号キーを作る。

ssh-keygen.exe -t ed25519

ed25519とは奇妙な名前だが、「2^255-19」(2の『255』乗マイナス『19』)という素数にちなんで付けられたもの。SSHの古いドキュメントなどを見るとssh-keygenをデフォルトで使うとか、-tオプションでrsaを指定するなどの記述があるが、これから使うのであればed25519を使うべきである。

ssh-keygen.exeコマンド実行すると、ファイルパスを聞いてくるがこれは、何も指定せずエンターキーで先に進める。デフォルト値は、ユーザーフォルダ下の.sshフォルダである。コマンドでは、最後にパスフレーズを聞いてくる。これは、長めのパスワードだと思い意味のある文を入れる。確認のため同じものをもう一回入れる。パスフレーズはこのあと、ssh-addコマンドに入力したら、秘密鍵の再設定以外にはもう使う機会はない。

標準では、ユーザーフォルダの下にある.sshフォルダ($env:Userprofile\.ssh)に公開鍵(id_ed25519.pub)と秘密鍵(id_ed25519)が作られる。まずは、この2つのファイルをUSBメモリなど安全な場所にバックアップしておくことをお勧めする。作業としては、公開鍵の内容をSSHサーバー側にコピー(次回解説)し、秘密鍵をssh-addコマンドでssh-agentに登録する。以後の作業は、カレントディレクトリがここになっていると想定する。

秘密鍵を管理させるためには、以下のコマンドを使ってssh-agentサービスを起動させる必要がある(要管理者権限)。GUIの「サービス」アプリケーションを使うこともできる。

Set-Service -StartupType AutomaticDelayedStart ssh-agent

Start-Service ssh-agent

このあと、生成した秘密鍵をssh-agentに管理させる。それには、PowerShellから

ssh-add .\id_ed25519

とする。このとき、ssh-keygen.exeで設定したパスフレーズを入力する。コマンドが終了したらクライアントから秘密鍵ファイルを削除する。Windowsを再インストールするなどしてssh-agentに登録した秘密鍵を失ったら、バックアップを使うか、ssh-keygenで公開鍵、暗号鍵を再度作り直す。こういう場合に「詰まない」ように、SSHサーバーマシンには常に複数のマシンからログインできるようにしておく。次回は、このOpenSSHサーバーのインストールと公開鍵の登録方法を解説する。

今回のタイトルネタは、E・E・スミスの「Subspace Explorers」(1960年。邦題 大宇宙の探求者。創元SF文庫)である。本作はレンズマンやスカイラークシリーズで有名なスミス、晩年の作品の1つ。E・E・スミスの最初の「E」はエドワードの「E」であり、暗号化方式の名称ed25519は、米国の数学者ハロルド・『エドワーズ』が研究した楕円曲線(エドワーズ曲線)を使うという「こじつけ」で選んだ。