Passbolt アダプタでパスワードを取得できるようにコマンドオプションを追加

basecamp/kamal

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.rbfetch_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 出力に含められるようになりました。最小限のコード差分で機能を拡張し、既存のエラーハンドリングやフィルタロジックをそのまま活用できる点が大きな利点です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
ad54752a

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文・背景・技術的変更・設計判断(任意)・まとめの5部構成が揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは ``ruby:filepath`` 形式で正しく記述されていますが、PR・Issue のリンクが `[PR #1836](URL)` のように ``[#123](URL)`` 形式になっておらず、リンク記法が要件を完全に満たしていません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

エンジニア向けの専門的な内容で、余計な初歩的説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論の段落構成になっており、トピックセンテンスで始まり、1段落1トピック、段落長も適切です。空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは Diff の内容と完全に一致しており、削除・追加行が正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

用語(fetch_secrets、Passbolt CLI、--column、JSON 等)は PR 内容と一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

デフォルトでパスワードが非表示になる理由や、列指定で取得できるようになる仕組みが正確に説明されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張が PR のタイトル、説明、Diff、Issue に裏付けられており、捏造や推測はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #1836、Issue #1835 などの数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の目的(パスワード取得のためのオプション追加)を正しく表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンや LTS 等の外部知識は一切含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現は使用されておらず、PR の記述と矛盾はありません。