前回、OpenSSHによるWindowsへのリモートログインを実現するために、OpenSSHサーバを有効化して利用する方法を紹介した。OpenSSHは、LinuxやMacなどのUNIX系のOSではリモートログインの方法として一般的に使われているが、Windowsで使われることはあまりない。ただし、Windows 10以降ではOpenSSHサーバの機能がデフォルトで取り込まれているため、有効化と設定さえ行えばLinuxやMacのように使うことができるのだ。

LinuxやMacへのログインにOpenSSHを使うのはもはやデファクトスタンダードだが、同じアクセス手段はWindowsでも使えたほうが良い。WindowsにもOpenSSHでアクセスできれば、アクセス管理やアクセス方法を共通化することができるので、何かと便利なことが多いのだ。PowerShellのポテンシャルも発揮しやすくなる。

今回は、設定したOpenSSHサーバを使う方法を説明する。

アクセス元PCで認証鍵(秘密鍵・公開鍵)を作成

OpenSSHサーバにアクセスしたときの認証方法はいくつかあるが、認証鍵を使う方法を基本として考えておこう。この方法であれば、ブルートフォース攻撃やパスワードスプレーといった攻撃で侵入される可能性が低い上にアクセス制御もしやすい。

認証鍵を使う方法は簡単だ。Windowsにログインしたいホスト(WindowsでもMacでもLinuxでも、OpenSSHクライアントでも良いし、それらの互換ソフトウエアが動いていれば何でも良い)で認証鍵(秘密鍵と公開鍵のペア)を作成し、公開鍵のほうをリモートログイン先に配置する。認証するには対になる秘密鍵が必須なので、秘密鍵を自分だけが保持していれば、自分以外はログインできないという寸法だ。

認証鍵は「ssh-keygen」というコマンドで生成する。

ssh-keygen

ssh-keygenコマンドを実行すると次のようになる。

ssh-keygenコマンドの実行例

デフォルトだと秘密鍵が${HOME}/.ssh/id_rsaファイルに、公開鍵が${HOME}/.ssh/id_rsa.pubファイルに出力される。パスフレーズというのは秘密鍵そのものに設定するパスワードのようなものだ。設定しても設定しなくてもよいが、心配なら設定しておけばよいだろう。秘密鍵が窃取された時点でパスフレーズが破られるのは時間の問題だが、多少の抑止力になるのは間違いない。この辺りは、状況に応じて設定してもらえればと思う。

なお、すでに認証鍵(公開鍵と秘密鍵)を持っている場合には注意してほしい。上記のコマンドによって既存の認証鍵(公開鍵と認証鍵)が上書きれてしまうという大惨事が発生しかねない。バックアップを取るなり、出力ファイルを変更するなり、注意して作業しよう。そもそも、すでに認証鍵があるなら、ssh-keygenで新しく生成しなくても既存の認証鍵を使うことになるはずだ。

アクセス先となるWindowsへ公開鍵を設置

先ほど生成した公開鍵と秘密鍵は、デフォルトのままであれば${HOME}/.ssh/id_rsaと${HOME}/.ssh/id_rsa.pubとして生成されている。

parancell-mini ~% ll .ssh/id*
-r--------  1 daichi  staff   2.6K  6 22 23:42 .ssh/id_rsa
-r--------  1 daichi  staff   583B  6 22 23:42 .ssh/id_rsa.pub
parancell-mini ~%

このうち公開鍵のほうを、リモートアクセスしたいWindowsの${HOME}.ssh\authorized_keysファイルに追記する。公開鍵ファイルの中身は1行の長い文字列になっている。これをリモートアクセスしたいWindowsの${HOME}.ssh\authorized_keysファイルへ新しい行として追記すればOKだ。

PS C:\Users\daichi> dir .\.ssh\authorized_keys

    Directory: C:\Users\daichi\.ssh

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2021/10/09    12:11           1157 authorized_keys

PS C:\Users\daichi>

間違っても、秘密鍵を書き込まないように注意しよう。秘密鍵は自分だけが持っている必要があり、リモートログイン先に配置するのは公開鍵のほうだ。誤って秘密鍵をどこか別のホストにコピーしてしまったのなら、その認証鍵は捨てて、新しい認証鍵を生成して利用しよう。外部に漏れた秘密鍵は、もはや鍵としての意味を成さないのだ。

アクセス元PCでログイン設定を作成

リモートログイン先のWindowsに公開鍵を設置したら、最後にアクセス元PCのOpenSSHクライアントに設定を書き込む。具体的には、リモートログイン先のIPアドレス(またはアクセス可能なホスト名)、ユーザー名、アクセスに使用する秘密鍵ファイルのパスを設定として${HOME}/.ssh/configファイルに書いておくことになる。

Host 名前
        Hostname                WindowsのIPアドレス
        User                    ユーザー名
        IdentityFile            ~/.ssh/秘密鍵ファイル

Windowsでのユーザー名がわからない場合、次のように環境変数を調べればわかるだろう。

PS C:\Users\daichi> echo $env:USERNAME
daichi
PS C:\Users\daichi>

これで「ssh 名前」で、設定したWindowsへリモートログインができるようになる。

アクセス元PCからアクセス先Windowsへリモートログインを確認

設定が終わったら、OpenSSHでリモートログインを行ってみよう。以下は、MacからWindowsへOpenSSHへリモートログインした例だ。

MacからWindowsへOpenSSHでリモートログインした場合

WindowsもOpenSSHでログインできると便利

前回のOpenSSHサーバのセットアップで、リモートログイン後のデフォルトシェルをPowerShell 7へ変更している。これでログイン後にはpwshが起動するため、PowerShell 7による操作が可能になるのだ。

「WindowsへOpenSSHでログインする」という操作には、最初は違和感があるかもしれない。だが、使い慣れるとこれほど便利な機能はないんじゃないかと思えてくるはずだ。やはり、ほかのホストと同じようにsshでリモートログインできるようになる、というのは大きい。PowerShell 7はインタラクティブシェルとしても十分なポテンシャルを持っており、Windowsの操作に一役買ってくれるのだ。