1PasswordのSSH AgentをWSL2で使う方法
概要
1Passwordの機能の一つである、SSH Agentの機能をWSL2でも使えるようにする方法を紹介します。
環境
- Windows 22H2
- 1Password 8.10.0
- Windows Subsystem Linux 1.1.3.0
- Ubuntu 22.04
やりたいこと
1Passwordには、独自のSSH Agentが付属しています。このSSH Agentを使うことで、SSHの公開鍵認証時に、暗号化された1Password上へ保存された秘密鍵の情報を利用できます。
ファイルをパソコン上に平文で保存していないので、通常の状態よりも安全であると言えます。
私もこの機能を使っており、公式のヘルプ記事を参考に設定してWindowsで利用できるように設定してあります。
しかし、それだけでなくWindows上のWSLからsshコマンドなどで接続するときに、Windows上の1PasswordのSSH Agentを利用して接続するようにしたいです。
そこで、ここではWSLから1PasswordのSSH Agentを介してSSH接続する方法を説明します。
方法
やることはそれほど多くありません。基本的には、WindowsのSSH Agentを参照できるようにWindowsとWSL両方を設定してバイパスするだけです。
1Password自体の、SSH Agentを使う設定についてはここでは詳しく説明しません。うまくいけば、Windows Helloなどの設定をした後に、1Passwordの設定から、「開発者」>「SSH エージェントを使用する」にチェックを入れるだけで終わりです。
最初にWindowsの設定をします。
Windowsにnpiperelayというソフトウェアをダウンロードします。
ダウンロードした後は、ファイルを解凍して適当な所に起きます。私は、ドキュメントのappフォルダの中に起きました。
これでWindowsの設定は終わりです。
次にWSLの設定をします。WSLのOSはUbuntu 22.04を利用しています。試してはいませんが、DebianやCentOSなどでも同様の方法で動くはずです。
設定は、ユーザーディレクトリの.bashrcに追記します。
# 1PasswordのSSHエージェントに接続するための設定
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
ALREADY_RUNNING=$(ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $?)
if [[ $ALREADY_RUNNING != "0" ]]; then
if [[ -S $SSH_AUTH_SOCK ]]; then
echo "removing previous socket..."
rm $SSH_AUTH_SOCK
fi
echo "Starting SSH-Agent relay..."
(setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"/mnt/c/Users/<ユーザー名>/Documents/app/npiperelay_windows_amd64/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi
下から2行目の/mnt/c/Users/<ユーザー名>/Documents/app/npiperelay_windows_amd64/npiperelay.exe
の部分はそれぞれの環境に合わせて設定を変更してください。このパスは、上記でダウンロードしたnpiperelayをダウンロードした場所を記述します。
設定後、次のコマンドを実行して設定を反映させます。
source ~/.bashrc
設定に間違いが無ければこれで設定は終わりです。WSL上からsshコマンドなどでサーバーに接続すると1PasswordのSSH Agentが使われます。
さいごに
Windowsでダウンロードしたnpiperelayは開発が止まっているようで、バグなど不具合があるかもしれません。利用の際には、注意が必要です。ただ、私の環境では何か困ったことはまだ起きていないため、現在も利用しています。
設定箇所は多くないため、比較的簡単に導入できると思います。
みなさんの参考になれば嬉しいです。