🗝

KeePassXCでパスワードもMFA(TOTP)もssh秘密鍵も管理する方法

2023/03/19に公開
2

前回の記事では、認証方法に関する整理とパスワード管理のツールについてシンプルかつ網羅的に記述しました。
今回の記事では、KeePassXCというツールがどのように活用できるのかをシンプルかつ要点を外さず紹介するとともに、パスワード管理に対する議論の基礎としても使えるように構成しています。

KeePassXCとは?

KeePassXCは、KeePass Password Safeというプロジェクトから派生したパスワード管理ツールです。
KeePass本家も非常に良いツールですが、XCの方が様々なOS(Win, Mac, Linux)でシームレスに動きます。
またKDBXという(本家からも開ける)互換性の高いファイルフォーマットでパスワードを保存でき、アプリケーションからパスワードを参照するという使い方()もできます。
KeePassXC自体はAndroidやiPhoneに対応してないですが、KeePass2Androidなどの兄弟アプリからKDBXを開くことができます。

KeePassXCで使える資格情報

KDBXファイルは生成時に暗号と復号に用いる情報(資格情報)を以下の3つのうちから選べます。

選べる3つの資格情報
暗号強度は一般に、(マスター)パスワード<キーファイル<YubiKey(FIDO)ですが、資格情報をなくすと自分も復号できなくなるので、ここの運用だけは良く考える必要があります。

  • パスワード再発行するから問題ない
  • バックアップ手段を計画する

KeePassXCで使える便利機能

以下に私が便利だと思う機能を並べます。(いくつかはあとで詳述します。)

  • パスワード管理機能
    • これがないと始まらない
    • 検索もスムーズ
  • パスワード生成機能
    • 指定文字数、文字種のランダムパスワードを生成
    • とりあえず64とか128文字のパスでアカウントを保護するという習慣が定着する
  • ワンタイムトークン(OTP)管理機能
    • Google Authenticatorとかで管理するアレ
    • これでスマホを水没させても安心
    • ビジネスユーザにとっても魅力
  • ショートカットコマンドによる自動入力機能
    • ブラウザ統合されたツールよりは不便だが十分便利
  • ssh-agent連携機能(エンジニア向け)
    • ssh秘密鍵を暗号化データベースに内包させつつssh鍵管理を委譲することができる
    • ssh秘密鍵を素置きしなくて良くなる

その他特筆すべき機能として以下のようなものもあります。

  • 変更履歴記録
    • あまり使わないが操作ミスしても良いという安心感
  • CSVインポート機能
    • 別の管理ツールからの移行がスムーズ
  • ブラウザ統合機能
    • クラウドベースのツールと似たようなUXになる

パスワードの生成と管理については、特筆すべき事項はない(使えばわかる)ので割愛して、ワンタイムトークンの管理から詳述します。

タイムベースドワンタイムトークン(TOTP)とその管理

パスワード単体だけでは脆弱であるということで、近年普及してきたワンタイムトークン。
MFA(多要素認証)の構成には必須ではないはずですが、MFAの代名詞と呼べるほどよく見かけます。
6桁の数字が30秒ごとに切り替わるので、巧妙なトリックがあるかのように思えますが、隠されたテキストデータ(≒パスワード)と時間から6桁の数字を生成しているだけです。(エンコーダを書くのも難しくなかった記憶があります。)
その性質を踏まえると、パスワード用のデータベースと同じデータベースで管理すべきではないでしょう。
KeePassXCでのTOTP管理は以下の手順を踏めば理解できます。



TOTP秘密鍵をKeePassXCで設定すると


いつもの奴が見れるようになる


詳細設定からも秘密鍵(secret)が確認できる(が極力隠す)

TOTPの秘密鍵はどこに?

登録に必要な秘密鍵は、多くの場合バックアップや移行手順を踏めば確認することができると思います。
ポピュラーなGoogle Authenticatorについては特殊で、otpauth://から始まるsecretを含む情報を直接取得できないです。
デコーダを利用してotpauth-migration://から始まるテキストを変換することで秘密鍵をスマホから取り出すことができます。

自動入力機能について

KeePassXCでは、大きく分けて

  • ブラウザ拡張(Chrome Extension)による自動入力
  • ショートカットによる自動入力
  • エントリー選択による自動入力(かなり煩雑)

の3つの方法が選べます。
利便性や総合的な観点からすればブラウザ拡張の方が便利で、ブラウザ拡張自体もKeePassXCの開発組織が開発を進めています。
気になる点があるとすれば、拡張自体の脆弱性に晒されうる(Bitwardenの例)などが気になるところでしょうか。
ショートカットによる自動入力は、拡張をインストール(検証)しなくても良いですが、ブラウザウィンドウの<title>に一致するエントリーを見つけてくるという関係上フィッシングに弱いと感じます。


ドメインが異なってもウィンドウタイトルが一致していれば反応する(ブラウザ拡張だとURLベースで反応する)
まあ絶対的にいい方法はないということなので、個々人のリスク管理の観点から方法を選択することになります。
またショートカット入力については、

  1. ユーザID入力
  2. エンターキーを押す
  3. パスワード入力
  4. エンターキーを押す

という入力シーケンスがデフォルトで適用されています。

これはカスタマイズ可能であり、例えばMicrosoftのアカウントサインインには、

{USERNAME}{TAB}{TAB}{TAB}{TAB}{ENTER}{DELAY 2000}{PASSWORD}{ENTER}

といったカスタムシーケンス(docs)を定義できます。

SSH Agent連携機能(エンジニア向け)

KeepassXCはSSH Agentと連携しssh秘密鍵を管理できます。
ssh秘密鍵を暗号化データベースに格納しつつ、データベースの開閉状態に応じて暗号鍵の登録・解除(ssh-add)させるような設定も行えます。
これにより平文で秘密鍵を置くよりかは、幾分かセキュアな運用が構成できます。


ssh秘密鍵を添付ファイル欄で添付して


データベース展開時にssh keyをssh agentに登録するよう設定した。公開鍵(.pub)はKeePassXCが導出している


データベースを開き直すとキーがssh agentに登録された

SSH Agentを使う場合のIdentityFileの指定

ややマニアックな話になりますが、

# in ~/.ssh/config
IdentityFile ~/.ssh/id_rsa

みたいな指定方法を知っている人がいるかもしれません。(これにより指定鍵でのみ電子署名を試みることになります。)
このような指定を外せば、持っている鍵で片っ端から電子署名を試すことになりますが、あまりスマートではないと感じる方もいると思います。
秘密鍵ファイルを削除する場合、代わりに公開鍵を指定することでエージェントが保持しているキーを指定して使わせることができます。

# in ~/.ssh/config
IdentityFile ~/.ssh/id_rsa.pub

↓manにもそう書いてあります。
https://github.com/openssh/openssh-portable/blob/610ac1cb077cd5a1ebfc21612154bfa13d2ec825/ssh.1#L294-L300

バックアップ

公式では、自動同期するクラウドドライブに置くというユースケースが想定されています。
https://keepassxc.org/docs/#faq-cloudsync
そもそもバックアップを取らないとか、もう少しひねりを加えて同期するなどのアイデアは検討の余地がありますが、運用のベースアイデアとして悪くはないように感じます。

まとめ

今回の記事ではKeePassXCの有益な機能にしぼって紹介をしました。
使わないにしても、こうしたものが世の中に既にあると理解しておくと、よりよいデータ管理に結びつけることができると思います。
今回の記事について追記すべき内容や修正案等がございましたら、ぜひコメントを残していただけると幸いです。よろしくお願いいたします。

GitHubで編集を提案
paiza

Discussion

いわもと こういちいわもと こういち

KeepassXCはSSH Agentとして動作させることができます。
つまりssh秘密鍵を暗号化データベースに格納しつつ、KeepassXCに電子署名をさせることで、公開鍵認証が必要なsshサーバにも接続することができます。

これは誤解されているように思います。
KeePassXC自体がSSH Agentとして動作するわけではなく、別途ssh-agentやPageantなどのエージェントが必要になります。SSHクライアントとのやりとりや公開鍵認証時の署名は各エージェントが行います。
KeePassXCは、ロックが解除された時に秘密鍵をエージェントに登録したり、ロックされた時にエージェントから秘密鍵を削除するというような事を行います。

なので、以下のような記述はどうでしょうか?

KeePassXCにはSSH Agentと連携する機能が有ります。
ssh秘密鍵を暗号化データベースに格納しておき

  • KeePassXCがロック解除された時に暗号化データベース内の秘密鍵をエージェントに登録する
  • KeePassXCがロックされた時にエージェントに登録した秘密鍵をエージェントから削除する

というような事が行えます。

ロック時に秘密鍵を削除する設定だったら「これによりKeePassXCがロック解除されている時のみssh秘密鍵が使えるようになり、エージェントをより安全に利用できます」と追加して利点を明確にする事も考えたのですが、スクリーンショットの設定だと削除されないようになっているので書かない方がいいかもしれません。

Naoki FujitaNaoki Fujita

コメント頂いたとおり、この記事ではたしかにSSH Agentそのものを内包しているような根本的にズレた表現になっていたため、内容を修正いたしました。
ありがとうございました。