KeePassXCのSSH エージェント機能をTeraTermやWinSCP、WSL2で使用する
新しいPCを設定することになったので、この機会にsshの鍵ペアを安全に利用できる環境を作りました。
今回作った環境では、Keepass XCを使って秘密鍵とパスフレーズを保管しKeepass XCのデータベースが開いているときだけ、秘密鍵をssh-agentに追加します。
Windowsのssh-agentの状況
ssh-agentは、SSHサーバーに接続する際、秘密鍵のパスフレーズ入力を自動的に行ってくれるので煩わしい手間が省けます。
ただ、Windowsでのssh-agentの利用はかなり複雑で、どのツールと連携させたいかによって設定が変わってきます。
そんな状況をわかりやすくまとめた記事をQiitaで見つけました。
これに沿って、自分に必要なツールを設定していきます。
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のダウンロード
-
以下のページからpageant.exeをダウンロードします。
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
直接DLする場合は以下からDLします。
https://the.earth.li/~sgtatham/putty/latest/w64/pageant.exe -
ダウンロードしたpageant.exeを任意のパスに保存します。
今回は以下のパスに保存しました。
C:\Tools\ssh-pageant\pageant.exe
pageant.exeの自動起動の設定
PCの起動時に自動起動するように設定します。以下の手順で実行します。
-
win + rを押して「ファイル名を指定して実行」を開きshell:startupを入力してOKボタンを押して、スタートアップフォルダーを開きます。
-
スタートアップフォルダーにpageant.exeのショートカットファイルを格納します。
-
ショートカットのプロパティを開いて、リンク先を以下のように変更します。
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の下にリンクを作成しています。
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内でも秘密鍵を使えるように設定を追加します。
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への秘密鍵の登録
新しいエントリーの追加
-
ctrl + n を押して、エントリー追加画面を開きます
-
タイトルにサーバー名、パスワードに秘密鍵のパスフレーズを入力します。
-
「詳細設定」に移動して、添付ファイルに秘密鍵のファイルを追加します。
-
「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