ぶていのログでぶログ

思い出したが吉日

WSLでGNOME Keyringを使ってssh-agentのパスフレーズ入力を省略する

WSLになってからssh-agentのパスフレーズ入力をどうするか悩んでいた。 毎回パスフレーズを入力するのはめんどくさいし、ssh-agentはプロセスを再起動すると再度パスフレーズの入力を求められる。 今までだましだまし使っていたが、最近WSL上でGNOME Keyring動くことに気がついたのでこれにパスフレーズを記憶させることでこの問題を解決した。

環境

  • Windows11
  • WSLバージョン 1.0.3.0

WSLの詳細

> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.1105

やり方

WSLのUbuntuイメージにはgnome-keyringがインストールされていないようなのでまずはインストールする必要がある。

❯ sudo apt install -y gnome-keyring

インストールしたら以下のコマンドを実行する($PASSについては後述)。

echo "$PASS" | gnome-keyring-daemon --unlock --replace 2> /dev/null | sed 's/^/export /g' | . -

bash、zsh、fish*1で動くはず。 この状態でsshなどをしようとすると以下のようにウインドウが表示されて秘密鍵のパスワードが聞かれる。 なお、WSLgのキーマップはUSキー配列になっているようなので注意が必要。 Windows側がJIS配列になっていて、なんでパスワードが通らないんだ~というのをやっていた 😭 Automatically unlock this key whenever I'm logged in. にチェックを入れると、gnome-keyring-daemonを再起動してもパスワードを聞かれることがなくなる。

$PASSについて

$PASSはGNOME Keyringのデータベースの暗号化にしようする文字列になっている。 コマンドの例では$PASSと書いたが空でもよい*2。 通常のLinuxデスクトップ環境の場合は、おそらくログインパスワードになっていると思われる(ちゃんと調べていない)。

データのリセットについて

GNOME Keyringは ~/.local/share/keyring 配下にファイルを配置している。 このファイルを削除すれば、GNOME Keyringに保存された情報を削除することができる。

おまけ: Windows側の1Passwordを使用する

Windows側で1Passwordアプリを入れている場合、1Passwordのssh-agent機能を利用することができる。 WSL上から直接Windows領域の1Passwordにアクセスすることはできないが、socatとnpiperelayを使うことで解決できる。 詳しくは以下の記事を参照のこと。

qiita.com

この方法も試したが、私には合わなかったのでやめてしまった。

おまけ2: Linux版1Passwordを使用する

1PasswordアプリにはLinux版も存在するのでそれをインストールして、前述ssh-agent機能を使うということもできる。

1password.com

しかしながら、Windows側とWSL側で1Passwordが2つ存在することになり微妙なのと、WSL上で動かした1Passwordのレスポンスが遅い?のであまり実用的ではなかった。。。 なお、Linux版1PasswordもGNOME Keyringに依存しているようなので、1Passwordアプリを起動するまえにgnome-keyringをunlockして起動しておく必要がある。

参考

*1:最近exportがデフォルトで使えるようになっていることを知った。今まで自分で定義していた。

*2:複数のユーザが使用する可能性のある環境の場合は空だとセキュリティリスクになる可能性があるが、WSLの場合そういうことは稀だろう