仮想環境のゲストOSにホストOSからSSH公開鍵接続する

Windowsから仮想環境へのSSH公開鍵接続手順をまとめました。

環境

ホストOSWindows 10 21H1(19043.1706) 64bit
仮想化ソフトウェアVirtualBox 6.1.34 r150636 (Qt5.6.2)
ゲストOSUbuntu 22.04

コマンドプロンプトで確認

winver
ver
wmic os get osarchitecture

設定手順

Virtual Box + ゲストOS(Ubuntu)+ WinSCPのインストール

以下の2つを参考にインストールして下さい。

ホストOSでキーペアを作成

接続元となるホストOSでキーペア(秘密鍵と公開鍵)を作成します。
コマンドプロンプトを起動し、下記コマンドを実行します。
※ed25519鍵を使います。-t以降を省略するとRSA鍵になります。

ssh-keygen -t ed25519

「どこに作成するか」と「キーフレーズを設定するか」を聞かれますが、ここではどちらも設定しません。

Enter file in which to save the key (C:\Users\[ユーザー名]/.ssh/id_ed25519):[空欄でEnter]
Enter passphrase (empty for no passphrase):[空欄でEnter]
Enter same passphrase again:[空欄でEnter]

キーが作成されたことを確認します。

dir C:\Users\[ユーザー名]\.ssh

『id_ed25519』が秘密鍵で、『id_ed25519.pub』が公開鍵です。

公開鍵をゲストOSにコピー

ゲストOSに公開鍵をコピーします。
CLIに慣れてない人はFTPクライアントツールを使うのが簡単なので、ここではWinSCPを使ってコピーします。
慣れてる人はscpコマンドなどを使ってコピーして下さい。

ゲストOSを起動し、WinSCPでログインします。

下記ディレクトリに『id_ed25519.pub』をコピーします。
ホストOS(左)からゲストOS(右)にドラッグアンドドロップでコピーできます。

/home/[ユーザー名]/.ssh

authorized_keysに公開鍵の内容を転記

ゲストOSに普通にログインするか、WinSCPでコンソールを起動してください。

下記コマンドを実行します。

cd /home/[ユーザー名]/.ssh
cat ./id_ed25519.pub >> ./authorized_keys
chmod 600 ./authorized_keys
rm ./id_ed25519.pub

ホストOSで接続設定

テキストエディタなどでconfigファイルを作成し、下記に格納します。

C:\Users\[ユーザー名]\.ssh

下記はconfigファイルの例です。

Host [接続名]
  HostName [ゲストOSの名前またはIPアドレス]
  User [ゲストOSの接続ユーザー名]
  IdentityFile C:\Users\[ユーザー名]\.ssh\id_ed25519
  IdentitiesOnly yes
  PasswordAuthentication no

※既にVS CodeからパスワードによるSSH接続ができるようになっている場合
 デフォルトであれば上記configファイルを参照するようになっているはずです。
 つまり、上記ファイルを用意しておくことで、VS CodeからもSSH公開鍵接続できるようになります。

ホストOSから接続確認

コマンドプロンプトからsshコマンドで接続してみます。
configファイルの[接続名]を指定することで簡潔に記述できます。

ssh [接続名]

ゲストOSへのリモートでのパスワードログインを禁止

上記でログインできたら、下記を更新してパスワードログインを禁止します。

vi /etc/ssh/sshd_config
・
・
・
# PasswordAuthentication yes
PasswordAuthentication no

sshサービスを再起動します。

systemctl restart ssh

ここまでやると、WinSCPからパスワードログインができなくなっているはずです。

WinSCPも公開鍵認証に変更

なので、WinSCPからも公開鍵認証でログインできるように設定します。

「鍵の形式がサポートされていないため変換しますか?」といった旨のメッセージが出ますが
気にせず変換して進めてください。すると、ppk形式のファイルが作成されます。

改めて接続してみると、問題なくつながるはずです。