認証情報ストアアーキテクチャ
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対応プラットフォーム
| プラットフォーム | バックエンド | 暗号化 |
|---|---|---|
| macOS | Keychain Services | AES-256-GCM |
| Windows | Credential Manager | DPAPI |
| Linux | libsecret (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_TOKEN | X セッショントークン | Chrome Cookie から |
X_CT0 | X CSRF トークン | Chrome Cookie から |
JWT_SECRET | JWT 署名キー | 初回起動時に生成 |
ANTHROPIC_API_KEY | Claude API(オプション) | 手動設定 |
セキュリティポリシー
絶対禁止事項
- 認証情報を
.envファイルに平文で書かない - 認証情報をコード内にハードコードしない
security find-generic-password -wの出力をファイルに保存しない- 認証情報をコミット対象ファイルに含めない
- ログに認証情報を出力しない
マスキングルール
| 場面 | ルール |
|---|---|
| 設定画面での表示 | 末尾4文字のみ表示 (****abcd) |
| ログ出力 | 完全マスク ([REDACTED]) |
| エラーメッセージ | キー名のみ(値を含めない) |
| API レスポンス | 末尾4文字のみ |
マイグレーション
既存の Siftly から移行する場合:
bash
# マイグレーションスクリプト
npx tsx scripts/migrate-credentials.tsこのスクリプトは:
- SQLite の Setting テーブルから認証情報を読み取り
- OS Keychain に保存
- SQLite から認証情報を削除
- 削除確認のログを出力