目次
1. 問題発生
日付: 2019年3月13日
環境: WSL の Ubuntu 18.04 LTS / Windows 10 v1803
状況: ssh-agent を利用した状態で ssh コマンドを実行したところ、Windows 10 がクラッシュしました(BSoD というやつです)。この ssh-agent は、Ubuntu のパッケージとしてインストールしたものです。
少し対応方法を調べて試してはみましたが、なかなかうまくいかなかったので、Windows 10 にインストールされている OpenSSH を利用することにしました。
2. Windows 10 の OpenSSH クライアントを準備
Windows 10 には、バージョン 1803 から OpenSSHが正式に組み込まれています。
この OpenSSH は、
- OpenSSH クライアント
- OpenSSH サーバー
の2つのアプリケーションに分かれていますが、今回必要なのは「OpenSSH クライアント」だけです。(OpenSSH サーバーは、その Windows 10 に外部からログインするような場合に必要です)
今回の環境では、既に OpenSSH クライアントがインストールされていました。
(OpenSSH サーバーはインストールされていませんでしたが、こちらは必要ありません)
インストール済みであるかどうかは、[設定] – [アプリ] – [アプリと機能]画面にある [オプション機能の管理] を開くと分かります。
以下のように [OpenSSH クライアント] が表示されていれば、インストール済みです。表示されていない場合は、その上にある [機能の追加] からインストールしましょう。
また、PowerShell を起動して、which ssh
や ssh
といったコマンドを実行することでも OpenSSH クライアントがインストールされているかどうか確かめられます。
どちらも OpenSSH クライアントがなければ、正常に実行できないはずです。
which ssh
を実行すると、Windows 側のコマンドであることが確認できますssh
コマンドを実行すると、Usage(使い方)が表示されます3. ssh-agent-wsl の利用
やりたいことは、「Windows側 の OpenSSH クライアントが持っている ssh-agent
を、WSL側から利用する」なのですが、その橋渡しをしてくれるツールが提供されています。ありがたいですね。
ssh-agent-wsl の利用手順は以下です。
(1) OpenSSH Authentication Agent サービスを動かす
Windows側の ssh-agent.exe
は、OpenSSH Authentication Agent という名前のサービスとして常駐します。(実体は C:\WINDOWS\System32\OpenSSH\ssh-agent.exe
ファイルです)
これを自動で起動するようにしておきます。
スタートメニューを開き “service” と入力すると「サービス」というアプリケーションが表示されますのでクリックします。
[OpenSSH Authentication Agent] という項目を見ると「無効」になっていました。
右クリックして [プロパティ] を選択します。
[全般]タブにある [スタートアップの種類] のところで「自動」を選択し、[OK]ボタンを押します。
これで、Windows 10 起動時に OpenSSH Authentication Agentも自動で起動するようになりましたが、この時点ではまだ動いていないので動かしておきます。
もう一度 [OpenSSH Authentication Agent] を右クリックして、[開始] を選択します。
以下のように、「実行中」と「自動」という文字が表示されるはずです。
(2) ssh-agent-wsl をダウンロードして配置する
ssh-agent-wsl のリリースページ から最新の「ssh-agent-wsl.7z」ファイルをダウンロードします。
ssh-agent-wsl.7z ファイルを解凍し、生成されたフォルダを任意のパスに移動します。移動先は、Windows側のパスであれば、どこでも構いません。
※ .7z 形式の圧縮ファイルを解凍するには、圧縮・解凍ソフト 7-Zip などのアプリケーションを使います。
ここでは、C:\Users\{ユーザー名}\Applications
以下に移動したとします。
配置したフォルダ構成は、以下となりました。
C:\Users\{ユーザー名}\Applications\
└ ssh-agent-wsl\
├ pipe-connector.exe
└ ssh-agent-wsl
(3) WSL 側から ssh-agent を利用する
Ubuntu (WSL) のターミナルエミュレータを開き、以下のコマンドを実行します。
eval $(/mnt/c/Users/{ユーザー名}/Application/ssh-agent-wsl/ssh-agent-wsl -r)
これで、Windows 側の ssh-agent が利用できる状態になっています。
Ubuntu 側で導入した ssh
コマンドや ssh-add
コマンドがそのまま使えます。
また、Windows 側で鍵を管理していることになるので、WSL のターミナルエミュレータを閉じても鍵は保持されたままになります。再度ターミナルエミュレータを開いたときに、追加し直す必要はありません。ちょっとした利点です。
WSL のターミナルエミュレータを複数開く場合
WSL のターミナルエミュレータを複数開く場合は、それぞれで以下のコマンドを実行する必要があります。
eval $(/mnt/c/Users/{ユーザー名}/Application/ssh-agent-wsl/ssh-agent-wsl -r)
全てのターミナルエミュレータから同じ ssh-agent を使うことになるため、追加されている鍵も共有状態であることに気を付けてください。
4. ライフタイム(鍵を保管する期間)について
ssh-agent.exe (Windows側のOpenSSH Authentication Agent サービス) のライフタイム設定について気になったことを書いておきます。
- [サービス] の画面から OpenSSH Authentication Agent を再起動しても、鍵はクリアされないようです。
- ということから予想できる通り、Windows を再起動しても ssh-agent に保存した鍵はそのまま残っています。セキュリティの観点からみると、OpenSSH Authentication Agent を終了したときに、保存した鍵がクリアされた方が安全です。
- OpenSSH Authentication Agent が終了する際に鍵をクリアする設定項目は提供させていないのでしょうか? 提供されていないのであれば、Windows を終了するタイミングで、ssh-agent に保存された鍵をクリアする(
ssh-add -D
コマンドを実行するなど)仕組みを自分で用意しなければいけません。 - 元々の ssh-agent コマンドには -t オプションでライフタイムが指定できるのですが、どうやら Windows版ではこのオプションがサポートされていないようです。(参照元:GitHub – rupor-github/ssh-agent-wsl の Options に書いてあります)
ということで現時点での 注意点です。
ssh-add -D
コマンドを実行して、保存された鍵データをクリアしましょう。5. おわりに
ssh-agent-wsl により、Ubuntu 18.04 LTS (WSL) 上で ssh-agent が使えるようになりました。
しかし、Ubuntu 側だけで ssh-agent が使えるのであればそれに越したことはないと思っているため、引き続き情報収集は続けていきたいと思っています。