🐈

KeePassXCのSSH エージェント機能をTeraTermやWinSCP、WSL2で使用する

2023/05/07に公開

新しいPCを設定することになったので、この機会にsshの鍵ペアを安全に利用できる環境を作りました。

今回作った環境では、Keepass XCを使って秘密鍵とパスフレーズを保管しKeepass XCのデータベースが開いているときだけ、秘密鍵をssh-agentに追加します。

Windowsのssh-agentの状況

ssh-agentは、SSHサーバーに接続する際、秘密鍵のパスフレーズ入力を自動的に行ってくれるので煩わしい手間が省けます。
ただ、Windowsでのssh-agentの利用はかなり複雑で、どのツールと連携させたいかによって設定が変わってきます。
そんな状況をわかりやすくまとめた記事をQiitaで見つけました。

混沌を極めるWindowsのssh-agent事情

これに沿って、自分に必要なツールを設定していきます。

ssh-agentの設定

普段、使っているツールはこんな感じです。

  • WSL2上のubuntuからのsshなど
  • Windows上のTeraTerm
  • Windows上のWinSCP
  • WSL上から起動したVSCode DevContainerからのsshなど

WSL2では、ubuntu 22.04を使っています。
これらのツールでssh-agentと連携するのに必要な以下のツールを設定していきます。

  • pageant.exe
  • wsl2-ssh-pageant.exe
  • socat

pageant.exeの設定

まずは、pageant.exeをインストールします。

pageant.exeのダウンロード

  1. 以下のページからpageant.exeをダウンロードします。

    https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

    直接DLする場合は以下からDLします。
    https://the.earth.li/~sgtatham/putty/latest/w64/pageant.exe

  2. ダウンロードしたpageant.exeを任意のパスに保存します。

    今回は以下のパスに保存しました。

    C:\Tools\ssh-pageant\pageant.exe
    

pageant.exeの自動起動の設定

PCの起動時に自動起動するように設定します。以下の手順で実行します。

  1. win + rを押して「ファイル名を指定して実行」を開きshell:startupを入力してOKボタンを押して、スタートアップフォルダーを開きます。

  2. スタートアップフォルダーにpageant.exeのショートカットファイルを格納します。

  3. ショートカットのプロパティを開いて、リンク先を以下のように変更します。

C:\Tools\ssh-pageant\pageant.exe --openssh-config %USERPROFILE%\.ssh\pageant.conf

wsl2-ssh-pageant.exeとsocatの設定

https://github.com/BlackReloaded/wsl2-ssh-pageant の説明に沿って設定します。

wsl2-ssh-pageant.exeのダウンロード

wsl2-ssh-pageant.exeのダウンロードとubuntu側からwsl2-ssh-pageant.exeに簡単にアクセスできるようにするためリンクを作成します。

wsl2-ssh-pageant.exeは以下のパスに保存します。

C:\Tools\ssh-pageant\wsl2-ssh-pageant.exe

ubuntu側からすると、以下になります。

/mnt/c/Tools/ssh-pageant/wsl2-ssh-pageant.exe

wsl2-ssh-pageant.exeのダウンロードするには、以下のシェルをubuntu側で作成して実行します。
ubuntu側から使いやすいように~/.sshの下にリンクを作成しています。

download_wsl2-ssh-pageant.sh
windows_destination="/mnt/c/Tools/ssh-pageant/wsl2-ssh-pageant.exe"
linux_destination="$HOME/.ssh/wsl2-ssh-pageant.exe"
wget -O "$windows_destination" "https://github.com/BlackReloaded/wsl2-ssh-pageant/releases/latest/download/wsl2-ssh-pageant.exe"
# Set the executable bit.
chmod +x "$windows_destination"
# Symlink to linux for ease of use later
ln -s $windows_destination $linux_destination

socatのインストール

wsl2のubuntuで以下を実行します。

sudo apt install socat iproute2

wsl2-ssh-pageant.exeとsocatの自動実行の設定

ubuntuでbashを使っている場合、~/.bashrcに以下の設定を追加して、スクリプトが自動的に起動するようにします。

export SSH_AUTH_SOCK="$HOME/.ssh/agent.sock"
if ! ss -a | grep -q "$SSH_AUTH_SOCK"; then
  rm -f "$SSH_AUTH_SOCK"
  wsl2_ssh_pageant_bin="$HOME/.ssh/wsl2-ssh-pageant.exe"
  if test -x "$wsl2_ssh_pageant_bin"; then
    (setsid nohup socat UNIX-LISTEN:"$SSH_AUTH_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin" >/dev/null 2>&1 &)
  else
    echo >&2 "WARNING: $wsl2_ssh_pageant_bin is not executable."
  fi
  unset wsl2_ssh_pageant_bin
fi

WSL2から起動したDockerでも連携できるように設定する

次に以下を参考にWSL2で起動したVSCode DevContainer内でも秘密鍵を使えるように設定を追加します。

https://qiita.com/frozenbonito/items/5bb6f30f1e8df8e02317

VSCode DevContainerで起動したコンテナのユーザーの.bash_profileに以下を追加します。

if [ -z "$SSH_AUTH_SOCK" ]; then
   # Check for a currently running instance of the agent
   RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
   if [ "$RUNNING_AGENT" = "0" ]; then
        # Launch a new instance of the agent
        ssh-agent -s &> $HOME/.ssh/ssh-agent
   fi
   eval `cat $HOME/.ssh/ssh-agent`
fi

これで設定は完了です。

KeePassXCの設定

SSH エージェント統合

KeePassXCの「設定」から「SSHエージェント」を選択し、「SSH エージェント統合を有効にする」をオンにします。
また、今回はPageantだけを使用しているので、「Pageantを使用する」を選択します。

KeePassXCへの秘密鍵の登録

新しいエントリーの追加

  1. ctrl + n を押して、エントリー追加画面を開きます

  2. タイトルにサーバー名、パスワードに秘密鍵のパスフレーズを入力します。

  3. 「詳細設定」に移動して、添付ファイルに秘密鍵のファイルを追加します。

  4. 「SSHエージェント」に移動して、「データベースを開いたりロックを解除した際にエージェントにキーを追加する」と「データベースを閉じたりロックした際にエージェントからキーを削除する」にチェックを入れて、秘密鍵として添付ファイルに追加したファイルを選択します。追加後すぐに使うなら「エージェントにキーを追加」を押します。

これでKeePassXCのデータベースを開いている時だけ、ssh-agentに秘密鍵が追加されます。

動作確認

Ubuntuからgithub.comにsshでアクセスできるか確認します。
データベースがロックされていると以下のようにエラーになります。

$ ssh github
git@github.com: Permission denied (publickey).

ロックされていない場合は以下のように認証に成功します。

$ ssh github
PTY allocation request failed on channel 0
Hi pino0701! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

これで想定通り動いていることを確認できました。

VSCode DevContainerで起動したコンテナ内からもアクセス可能になりました。

Discussion