Passbolt アダプタでパスワードを取得できるようにコマンドオプションを追加
Kamal の Passbolt シークレットアダプタが、passbolt list resources コマンドでパスワードを取得できない問題を解消し、--column password オプションを付与して秘密情報を完全に取得できるようにしました。
背景
Passbolt CLI のデフォルト挙動では、passbolt list resources がパスワードを非表示にします。Kamal のシークレット取得ロジックはこのコマンドの出力を JSON パースして名前だけを取得していたため、実際のパスワードがシークレットに含まれませんでした。Issue #1835 で「Kamal secrets don't retrieve passwords from Passbolt adapter」 が報告され、パスワード取得が必須であることが判明しました。これに対処するため、コマンド実行時にパスワード列を明示的に要求する必要があります。
技術的な変更
lib/kamal/secrets/adapters/passbolt.rb の fetch_secrets メソッドで実行コマンドを拡張しました。変更前は passbolt list resources … --json のみで、パスワード列が出力されていませんでした。変更後は --column name --column password を付加し、JSON にパスワードフィールドが含まれるようにしました。
- items = `passbolt list resources #{filter_condition} #{folders.map { |item| "--folder #{item["id"].to_s.shellescape}" }.join(" ")} --json`
+ items = `passbolt list resources #{filter_condition} #{folders.map { |item| "--folder #{item["id"].to_s.shellescape}" }.join(" ")} --column name --column password --json`
この追加により、items 変数に格納される JSON は {"name": "...", "password": "..."} という形となり、found_names = items.map { |item| item["name"] } と同様にパスワード情報も利用できるようになります。エラーハンドリングは変更前後で同一で、コマンド実行失敗時には例外が発生します。
設計判断
パスワード取得のためにコマンドレベルで列指定を行うアプローチが採用されました。Passbolt CLI が将来的に --show-passwords のようなフラグを提供する可能性はありますが、現行の安定版では列指定が唯一の手段です。コード変更は最小限に抑え、既存ロジックの流れ(フィルタ条件、フォルダ指定、JSON パース)をそのまま保持しています。
この手法は 外部ツールの既存インターフェースを尊重しつつ、必要なデータだけを取得 する設計となり、Kamal の他のシークレットアダプタと同様の使用感を維持します。将来的に Passbolt の CLI が変更された場合は、同様に列指定または新フラグに置き換えるだけで適応できる柔軟性があります。
まとめ
Passbolt アダプタは --column password オプションを付与することで、デフォルトで隠蔽されていたパスワードを JSON 出力に含められるようになりました。最小限のコード差分で機能を拡張し、既存のエラーハンドリングやフィルタロジックをそのまま活用できる点が大きな利点です。