Windows 10 RS3では、ベータ版としてWindowsのオプション機能で用意されていたOpenSSHが、RS4では正式版となった。プログラム自体は、以前本連載でも紹介した「OpenSSH」なのだが、クライアントについては最初からインストールされている状態。SSHサーバは、必要に応じてユーザーがインストールできる。

インストール自体は、以前に紹介したものに比べて、ずっと簡単だが、使いこなすためにはちょっとしたコマンドを実行する必要がある。もっとも以前はPowershellを利用していたが、RS4ではOpenSSHの標準コマンドだけでほぼなんとかなる。そこで今回の記事では、そもそもSSHがどのように動作して、それぞれのコマンドはどんな働きをするのかを解説し、次回具体的な設定を解説する。

そもそもSSHって何？

SSHは、もともとUNIX系OSで使われていたrshやrloginの後継にあたるプログラムだ。rshはremote Shellの略で、ネットワークを介して、他のマシンにログインしてコマンドラインシェルを使うものだ。同様にrloginはremote loginで、ネットワークを介して他のマシンにログインするもの。これらは便利なので多く使われていたが、平和な時代に作られたため、セキュリティに関してはほとんど考慮されていなかった。

SSHではセキュリティを考えた設計になっており、接続時に相手が正しいかどうかを認証し、通信を暗号化する。

また、サーバがクライアントを認証することも可能で、このようにすることで、成りすましや途中に入って通信を盗聴することを防ぐことができる。

このときに使われる技術が「公開鍵暗号」だ。公開鍵暗号の原理については、いろいろと参考書もあるし、インターネットに文書もあるのでここでは解説を省くが、「秘密鍵」「公開鍵」の2つの暗号化鍵があり、片方で暗号化したものは、もう一方でないと解読できない。

このために「秘密鍵」を使った暗号文は、「公開鍵」でしか解読できない。もし、相手から送られてきた暗号文が公開鍵で解読できるなら、相手は秘密鍵を持っている正しい通信相手であることがわかる。逆に公開鍵を使った暗号文は、秘密鍵でしか解読できないので、秘密鍵を持つであろう正しい相手だけが解読できるという仕組みである。

SSHでのサーバ認証は、この公開鍵暗号を使う。つまり、サーバの公開鍵を使って暗号化したものを正しく解読できるならば、相手は秘密鍵を持っている正しいサーバであると断定できる。クライアント側は、公開鍵と相手のIPアドレスをペアで記憶しておき、接続先が正しいかどうかを判断する。OpenSSHでは、実際には公開鍵そのものではなく、公開鍵から作られるfingerprintと呼ばれる短い情報を記憶している。

クライアントは、サーバに初めて接続するときに、サーバの公開鍵（のfingerprint）を記憶する。つまり初回の接続だけは、できるだけ安全な環境で行なうのが望ましい。そうして1回、サーバを記憶すれば、次回からは同じサーバに接続しているかどうかは、SSHが自動的に判断してくれる。逆に、サーバ側を再インストールしたときなどは、別の公開鍵が作られるため、クライアント側は記憶している公開鍵のfingerprintを破棄し、新しい公開鍵を登録しなければならない。

この登録はIPアドレスとの組合せなので、SSHを使うならば、IPアドレスの割り当てが一定になるようにDHCPサーバを設定しておくべきだろう。

RS4に搭載されているOpenSSHクライアントやサーバは、利用可能な状態にすると、パスワードによるログインが可能になる。サーバはインストールして登録されたサービスを起動するだけでいい。

このときサーバ側マシンには、クライアント側と同じユーザーアカウントが必要である。厳密には「同じ」である必要はないが、サーバ側のマシンで直接サインインできる（つまりパスワードを知っている）ユーザーアカウントを持っていなければ、SSHを使ったリモートログインはできない。

なお、SSHでは、ユーザーアカウントのパスワードだけでしかログインができない。Windows自体は、指紋やPIN、ピクチャーパスワードなどでもサインインできるが、SSHの場合はパスワードが必要なので注意が必要だ。

SSHでは、さらにクライアント側でも公開鍵暗号を作って、これを使ったパスワードなしの接続が可能になる。このとき、秘密鍵を保護するため、秘密鍵ファイルに長い文字列を使う「パスフレーズ」を付けて保護する。

パスフレーズなしの簡易な運用も可能だが、PCを紛失するなどして、秘密鍵が漏洩する可能性を考えると、パスフレーズをつけて暗号化しておくべきだろう。というのは、このファイルをコピーされてしまうと、サーバに誰でもログインできてしまうようになるためだ。

パスフレーズは、パスワードよりも長く、文章をそのまま使うことができる。OpenSSHは秘密鍵が必要な場合に、ユーザーにパスフレーズの入力を求め、その都度解読して利用する。SSHによるログインを何回も繰り返すような場合、パスフレーズの入力は、かえってパスワードの入力よりも面倒なので、ssh-agentを使って、秘密鍵を管理させる。ssh-agentを使うことで、ユーザーは、最初の一回だけパスフレーズを入力すればいい。RS4に搭載されたOpenSSHでは、ssh-agentがサービスとして登録されている。

つまり、OpenSSHの設定は、ssh-agentの設定までしないと、パスワードやパスフレーズの入力が面倒なまま残ってしまう。ごくたまに使うのであれば、何も設定しないでパスワードのままで問題ないが、そうでなければ、ssh-agentでログインするところまでやったほうが毎回のログインがはるかに簡単になる。

実際に秘密鍵と公開鍵を作る

SSHサーバ側は、サービスとして起動するときに自動的に秘密鍵と公開鍵を作るが、クライアント側は、ユーザーがコマンドラインを使って秘密鍵、公開鍵を作る必要がある。そのためには、ssh-keygen.exeコマンドを使う。なお、RS4に含まれるOpenSSHでは、クライアント側の設定ファイルは、すべて、ユーザーフォルダ以下の.sshフォルダ（%userprofile%\.ssh）にある。このフォルダは、クライアントであるssh.exeを最初に起動し、サーバと接続するときに自動的に作られる。

クライアントの暗号鍵も基本的にはここに置き、RS4のssh-keygen.exeもここをデフォルトの暗号鍵の保存場所としている。このコマンドには、いくつかオプションがあるが、マニュアルは、以下のURLにある。

https://man.openbsd.org/ssh-keygen

ssh-keygen.exeは、複数鍵形式での生成ができるが、実際に使う場合には、サーバが対応している暗号化方式に合わせる必要がある。ただ、現実的には「rsa」の鍵を作れば十分なので、なにもオプションを付けずに「ssh-keygen.exe」コマンドを実行する。

最初に秘密鍵、公開鍵の保存場所を聞いてくるので、Enterを入力する。標準では前述のようにユーザーフォルダにある.sshフォルダである。

次にパスフレーズを聞いてくる。これには、“This is a pen”のように適当な文章を入れる。長い方がセキュリティが高くなるが、覚えられる範囲にしておく。

指定したフォルダに「id_rsa」と「id_rsa.pub」という2つのファイルができているはずだ。拡張子として「.pub」となっているほうが公開鍵で、もう1つが秘密鍵である。なお、サーバにパスワードなしでログインするためには、公開鍵をサーバ側の自分のユーザーフォルダに登録する必要がある。

このとき、パスワードでsshによるログインが可能な状態であれば、OpenSSHに付属するscp.exe（Scure Copy）が利用できる。scpはsshを利用して安全なファイルのコピーをするもので、公開鍵のコピー以外にも利用できる。