始めに結論を。パスワード同様、ssh の秘密鍵も KeePassXC で管理することをお勧めします。(5回目)
以前から ssh の鍵の管理方法について悩んでいましたが、LOLIPOP! のレンタルサーバーを借りたのを機に調べてみた所、パスワードの管理と同様に ssh の秘密鍵の管理も KeePassXC で行った方が便利になる事が分かりました。
5回目となる今回の記事では、
- Linux で KeePassXC を使用して ssh-agent に鍵の情報を渡す
- Windows11 の ssh-agent をリモートの Linux でも使う
という二つの方法が出来るかどうかを、Linux 編として記載します。
- 導入編
- Windows11 編
- WSL2 編
- Pageant 対応ソフトウェア、及び Git for Windows 編
- Linux 編 <- 今回の記事
記事を公開した後には、上記リストをリンクに書き換えます。
今回の Linux 編で一区切りとしますが、他にも ssh-agent の鍵を共用したい環境を使う機会があれば追加で調べてみます。
- 番外編 WSL2 で wsl2-ssh-agent を試す
- 番外編2 Synology NAS に公開鍵認証で接続する際の注意点
- 番外編3 Windows11 へ github 版の OpenSSH を試す (ssh-agent 不具合対策)
番外編3で、Windows11 へ github 版の OpenSSH を導入した所、ssh-agent.exe の不具合は解消しました。
~/.ssh/config の内容も KeePassXC で管理する
Linux 特有という話ではありませんが、~/.ssh/config に登録している Host の情報も KeePassXC で管理すると、更に便利になりました。
$ cat ~/.ssh/config
Include conf.d/*
$ ls ~/.ssh/conf.d
github.config lolipop.config
$ cat ~/.ssh/conf.d/lolipop.config
Host lolipop
HostKeyAlgorithms +ssh-rsa
UpdateHostKeys no
Hostname ssh.lolipop.jp
User lolipop-username
Port 2222
元の ~/.ssh/config には ~/.ssh/conf.d 以下のファイルを読み込むようにして、~/.ssh/conf.d ディレクトリ内に各接続先毎の情報を入れておきます。上の例だと lolipop.config を KeePassXC のエントリ内に一緒に入れて置く事で、user 名やサーバー名も一緒に管理できるようになります。
各接続先毎の config ファイルを ssh を使用する環境の ~/.ssh/conf.d ディレクトリ以下に保存すれば、そのまま Host に指定した名前で接続できるようになります。
方法1 : Linux で KeePassXC を使用する
仮想環境の Hyper-V で使用している Ubuntu 22.04 で試してみます。
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Codename: jammy
最もシンプルな方法は、Linux でも KeePassXC を使用する事です。
Windows11 の環境と同様に、Linux でも ssh-agent が動作していれば、 KeePassXC の起動・停止に合わせて、鍵の情報も登録・消去されます。
試しに、パスワードデータベース (*.kdbx) を Ubuntu にコピーして、KeePassXC をインストールして起動してみました。設定 -> SSH エージェントの 「SSH エージェント統合を有効にする」のチェックは入れておきます。
# ssh-agent は予め起動しておく
$ eval `ssh-agent`
Agent pid 2843
# KeePassXC を起動する前は鍵情報が無い
$ ssh-add -l
The agent has no identities.
# KeePassXC を起動すると鍵情報が登録される
$ ssh-add -l
256 SHA256:XXXXXXXXXXXXXXXXYYYYYYYYYYYYYZZZZZZZZZZZZZZ hiro20180901 (ED25519)
256 SHA256:XXXXXYYYYYYYYYYYYYZZZZZZZZZZZXXXXXXXXXXXXXX user@host (ED25519)
# lilopop は config で登録済み
$ ssh lolipop
[lolipop-username@server ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
# github は config で登録済
$ ssh -T github
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
# KeePassXC を終了すると鍵情報も消去される
$ ssh-add -l
The agent has no identities.
Windows11 上で KeePassXC を使用するのと同様です。おそらく MacOS でも同様だと思います。
方法2 : リモートの Linux の ssh でローカルの ssh-agent 鍵情報を使用する
この先の検証は、Ubuntu 20.04 で行います。理由は先の検証で記載した通りです。
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
Windows 側で使用している ssh-agent の情報を Linux 側に渡すには、ssh の -A オプションを使用するのが簡単です。リモート側では ssh-agent を起動する必要はありません。
ただ、どちらにも「用法・用量を守って正しくお使いください」と書かれていますので (リモート側の root 権限を持った人には秘密鍵情報を勝手に使われてしまう)、注意が必要です。
# Windows11 ターミナルの cmd.exe から
# Hyper-V の Ubuntu 20.04 へログインする
>ssh -A hiro@172.22.n.n
hiro@172.22.n.n's password:
# ssh-agent の情報が Ubuntu 側にも渡される
$ ssh-add -l
256 SHA256:XXXXXXXXXXXXXYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZ username@hostname (ED25519)
256 SHA256:XXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYZZZZZZZZZZZZ hiro20180901 (ED25519)
# ~/.ssh/config 等で Host の情報を登録してあれば
# パスフレーズなしでログインできる
$ ssh lolipop
[lolipop-username@server ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
# github も同様
$ ssh -T github
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
ssh の -A オプションを使用する事により、Windows11 の OpenSSH ssh-agent の情報がリモートの Ubuntu 20.04 側でも使用できるようになりました。
Windows11 の OpenSSH ssh-agent が最新の ssh に対応していない件
先程も記載したリンク先の情報によれば、Windows側の OpenSSH ssh-agent が原因のようです。
仮説: 現状のWindows側のOpenSSH Serviceが session-bind@openssh.com に対応していない?
https://zenn.dev/qnighy/articles/8b992970b86653
本家 ssh で対処するのは違うような気もしますし、このままでは Ubuntu 22.04 以降では Windows11 側の ssh-agent の鍵情報は受け取られなくなりそうです。対処方法を考えなくては。
WinSSH-Pageant で少しすっきりしたかと思いましたが、Windows の ssh 周りの混沌はまだ続きそうです。
まとめ
KeePassXC の ssh 秘密鍵の情報を Linux で使用する手段として、
- パスワードデータベースのファイルを Linux で準備して、KeePassXC を Linux で起動する
- Windows11 から ssh を -A オプションを使用してリモートの Linux にログインし、Windows11 側の ssh-agent の鍵情報を使用する
の二つの方法を試しました。
一つ目の方法は、Linux をメインに使用する場合には、Windows11 で使用するのと完全に同じ条件で使用する事が出来ます。
二つ目の方法は、KeePassXC から Windows11 の ssh-agent に渡された鍵情報を、Linux で使用する事が出来ます。ただし、Windows11 の OpenSSH ssh-agent の制限から、Linux の新しめの ssh では使用できません。対処方法を考え中です。
これまで、5回に渡って KeePassXC のエントリに保存した ssh の秘密鍵を Windows11、WSL2、Pageant 対応クライアント、MSYS2 (Git for Windows)、Linux で使用する方法を試してみました。Windows 周りの ssh の鍵管理は未だ混沌としている状況には変わりありませんが、少しでも皆さんの助けになれば幸いです。
今回のアイキャッチ画像
崖の絵を Stable Diffusion に描かせてみました。大きさは 1200 x 630 に変更しています。こういう絵だと縦横のリサイズ量が違っても、あまり違和感ありません。
コメント