Skip to content

認証情報ストアアーキテクチャ

OS Keychain を使用した認証情報の安全な管理アーキテクチャです。

概要

従来の Siftly では認証情報が SQLite に平文保存されていましたが、X Knowledge Agent ではすべての認証情報を OS Keychain に移行しました。

mermaid
flowchart TB
    subgraph Before["従来 (Siftly)"]
        App1["アプリケーション"] --> SQLite1["SQLite\n(平文保存)"]
        SQLite1 --> Risk["漏洩リスク\n- DB ファイルコピー\n- バックアップ経由\n- ログ出力"]
    end

    subgraph After["現在 (X Knowledge Agent)"]
        App2["アプリケーション"] --> Keychain["OS Keychain\n(暗号化)"]
        Keychain --> Safe["保護\n- OS レベル暗号化\n- 生体認証連携\n- プロセス分離"]
    end

    style Risk fill:#f44336,color:#fff
    style Safe fill:#4caf50,color:#fff

対応プラットフォーム

プラットフォームバックエンド暗号化
macOSKeychain ServicesAES-256-GCM
WindowsCredential ManagerDPAPI
Linuxlibsecret (GNOME Keyring)AES-256

macOS Keychain 統合

保存

bash
security add-generic-password \
  -s "X_AUTH_TOKEN" \
  -a "$USER" \
  -w "token_value" \
  -U

取得

bash
security find-generic-password \
  -s "X_AUTH_TOKEN" \
  -a "$USER" \
  -w

アプリケーションからの参照

mermaid
sequenceDiagram
    participant App as アプリケーション
    participant Env as 環境変数
    participant Shell as .zshrc
    participant KC as OS Keychain

    Note over Shell: export X_AUTH_TOKEN=$(security find-generic-password -s "X_AUTH_TOKEN" -a "$USER" -w)
    Shell->>KC: Keychain 参照
    KC-->>Shell: 復号された値
    Shell->>Env: 環境変数に設定
    App->>Env: process.env.X_AUTH_TOKEN
    Env-->>App: 値を取得

管理対象の認証情報

キー名用途自動取得
X_AUTH_TOKENX セッショントークンChrome Cookie から
X_CT0X CSRF トークンChrome Cookie から
JWT_SECRETJWT 署名キー初回起動時に生成
ANTHROPIC_API_KEYClaude API(オプション)手動設定

セキュリティポリシー

絶対禁止事項

  1. 認証情報を .env ファイルに平文で書かない
  2. 認証情報をコード内にハードコードしない
  3. security find-generic-password -w の出力をファイルに保存しない
  4. 認証情報をコミット対象ファイルに含めない
  5. ログに認証情報を出力しない

マスキングルール

場面ルール
設定画面での表示末尾4文字のみ表示 (****abcd)
ログ出力完全マスク ([REDACTED])
エラーメッセージキー名のみ(値を含めない)
API レスポンス末尾4文字のみ

マイグレーション

既存の Siftly から移行する場合:

bash
# マイグレーションスクリプト
npx tsx scripts/migrate-credentials.ts

このスクリプトは:

  1. SQLite の Setting テーブルから認証情報を読み取り
  2. OS Keychain に保存
  3. SQLite から認証情報を削除
  4. 削除確認のログを出力