メインコンテンツまでスキップ

アーキテクチャ概要

このドキュメントでは、コンポーネントの関係、データフロー、セキュリティ境界を含む secretctl の高レベルアーキテクチャを説明します。

システムコンポーネント

┌─────────────────────────────────────────────────────────────────────────────┐
│ secretctl アーキテクチャ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ CLI │ │ デスクトップ │ │ MCP サーバー │ ユーザーインターフェース │
│ │ (Cobra) │ │ (Wails) │ │ (stdio) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ │ 完全信頼 │ 完全信頼 │ 制限付き(AI安全設計) │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ Vault コア (pkg/vault) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ マネージャー │ │ シークレット │ │ 監査 │ │ ポリシー │ │ │
│ │ │ │──│ ストア │──│ ログ │ │ エンジン │ │ │
│ │ │(ライフサイクル)│ │ (CRUD) │ │ (HMAC) │ │ (MCPのみ) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 暗号レイヤー (pkg/crypto) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Argon2id │ │ AES-256 │ │ HMAC-256 │ │ │
│ │ │ (KDF) │ │ (GCM) │ │ (Chain) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ ストレージレイヤー (SQLite) │ │
│ │ ┌───────────────────────────────────────────────────────────────┐ │ │
│ │ │ vault.db (0600) │ vault.salt (0600) │ vault.meta (0600) │ │ │
│ │ └───────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

コンポーネントの責務

コンポーネント責務パッケージ
CLIコマンドラインインターフェース、ユーザーインタラクションcmd/secretctl
デスクトップネイティブ GUI アプリケーションdesktop/
MCP サーバーAI エージェント連携、AI安全設計の適用internal/mcp
Vault マネージャーライフサイクル(init、lock、unlock)、セッション管理pkg/vault
シークレットストアCRUD 操作、メタデータ処理pkg/vault
監査ログHMAC チェーンイベントログ、整合性検証pkg/vault
ポリシーエンジンMCP コマンド許可リスト、デフォルト拒否internal/mcp
暗号レイヤー鍵導出、暗号化、HMACpkg/crypto
ストレージレイヤーSQLite 永続化、ファイル権限pkg/vault

データフロー図

シークレット設定操作

ユーザー                   CLI                     Vault                   Crypto
│ │ │ │
│ set KEY (stdin) │ │ │
│─────────────────────▶│ │ │
│ │ Store(key, value) │ │
│ │───────────────────────▶│ │
│ │ │ Encrypt(DEK, value) │
│ │ │──────────────────────▶│
│ │ │ │
│ │ │◀──────────────────────│
│ │ │ ciphertext │
│ │ │ │
│ │ │ INSERT INTO secrets │
│ │ │──────────▶ [SQLite] │
│ │ │ │
│ │ │ Log(SET, key_hash) │
│ │ │──────────▶ [Audit] │
│ │◀───────────────────────│ │
│◀─────────────────────│ success │ │
│ OK │ │ │

MCP secret_run 操作(AI安全設計)

AI エージェント        MCP サーバー            Vault              サブプロセス
│ │ │ │
│ secret_run │ │ │
│ (keys, cmd) │ │ │
│──────────────────▶│ │ │
│ │ │ │
│ │ ValidatePolicy(cmd)│ │
│ │────────────────────▶│ │
│ │◀────────────────────│ │
│ │ allowed │ │
│ │ │ │
│ │ GetSecrets(keys) │ │
│ │────────────────────▶│ │
│ │◀────────────────────│ │
│ │ values │ │
│ │ │ │
│ │ Exec(cmd, env=secrets) │
│ │─────────────────────────────────────────▶│
│ │ │
│ │◀─────────────────────────────────────────│
│ │ stdout, stderr │
│ │ │ │
│ │ Sanitize(output, secrets) │
│ │ [REDACTED] 置換 │
│ │ │ │
│◀──────────────────│ │ │
│ サニタイズ出力 │ │ │
│ (平文なし) │ │ │

脅威モデル

信頼境界

┌─────────────────────────────────────────────────────────────────────────────┐
│ 信頼境界 1 │
│ (ユーザーのローカル環境) │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 信頼されるアクター 信頼される操作 │ │
│ │ ────────────── ────────────── │ │
│ │ • 人間ユーザー (CLI) • 平文シークレットの読み取り │ │
│ │ • 人間ユーザー (デスクトップ) • シークレットの書き込み/変更 │ │
│ │ • シークレットの削除 │ │
│ │ • Vault のエクスポート │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ │ AI安全設計境界 │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 制限されるアクター 制限される操作 │ │
│ │ ───────────────── ───────────────── │ │
│ │ • AI エージェント (MCP) • キー名の一覧(値なし) │ │
│ │ • 自動化ツール • 存在確認 │ │
│ │ • マスクされた値の取得 │ │
│ │ • コマンド実行(許可リストのみ) │ │
│ │ │ │
│ │ 拒否される操作 │ │
│ │ ───────────────── │ │
│ │ ✗ 平文シークレットの読み取り │ │
│ │ ✗ シークレットの書き込み/変更 │ │
│ │ ✗ シークレットの削除 │ │
│ │ ✗ Vault のエクスポート │ │
│ │ ✗ ブロックされたコマンドの実行(env、printenv など) │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

脅威カテゴリと緩和策

カテゴリ脅威緩和策実装
T1: シークレット露出AI が平文を抽出secret_get ツールなしinternal/mcp
T2: 出力漏洩コマンド出力にシークレット含む出力サニタイズpkg/vault/sanitizer.go
T3: プロンプトインジェクション悪意のあるプロンプトがデータ要求ツールレベル制限MCP ツール定義
T4: コマンドインジェクション注入されたシェルコマンドコマンド許可リストmcp-policy.yaml
T5: 環境ダンプenv/printenv がシークレット露出ブロックコマンドリストinternal/mcp/policy.go
T6: ブルートフォースマスターパスワード推測Argon2id(メモリハード)pkg/crypto
T7: 保存データVault へのディスクアクセスAES-256-GCM 暗号化pkg/crypto
T8: ログ改ざん監査ログの変更HMAC チェーン整合性pkg/vault/audit.go
T9: ファイル権限不正なファイルアクセス0600/0700 権限pkg/vault

STRIDE 分析

脅威タイプ該当緩和策
Spoofing(なりすまし)なしローカル専用、ネットワーク認証なし
Tampering(改ざん)ありHMAC チェーン監査ログ、暗号化ストレージ
Repudiation(否認)ありタイムスタンプ付き監査ログ
Information Disclosure(情報漏洩)ありAI安全設計、出力サニタイズ
Denial of Service(サービス拒否)限定的コマンドタイムアウト(300秒)
Elevation of Privilege(権限昇格)あり信頼境界の適用

鍵階層

┌─────────────────────────────────────────────────────────────────────────────┐
│ 鍵階層 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ユーザー入力: マスターパスワード │
│ │ │
│ │ + Salt (128ビット、ランダム) │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Argon2id │ │
│ │ ───────── │ │
│ │ メモリ: 64 MiB │ │
│ │ 時間: 3 イテレーション │ │
│ │ スレッド: 4 │ │
│ │ 出力: 256 ビット │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ マスターキー (256ビット) ──────── 保存されない ──────── │
│ │ │
│ │ HKDF-SHA256 ("dek-v1") │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ DEK (データ暗号化キー) - 256ビット │ │
│ │ ───────────────────────────────── │ │
│ │ • vault.db に暗号化して保存 │ │
│ │ • パスワードローテーション時にすべてのシークレットの │ │
│ │ 再暗号化が不要 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ │ AES-256-GCM │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 暗号化されたシークレット │ │
│ │ ───────────────── │ │
│ │ • 各シークレットは一意の nonce で暗号化 │ │
│ │ • 保存形式: nonce (12B) || ciphertext || auth_tag (16B) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 監査ログキー (256ビット) │
│ ──────────────────────── │
│ • マスターキーから HKDF-SHA256 ("audit-log-v1") で導出 │
│ • HMAC チェーン計算に使用 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

データベーススキーマ

-- シークレットテーブル
CREATE TABLE secrets (
id TEXT PRIMARY KEY,
key TEXT UNIQUE NOT NULL,
encrypted_value BLOB NOT NULL,
notes TEXT,
url TEXT,
tags TEXT, -- JSON 配列
expires_at DATETIME,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL
);

-- 監査ログテーブル
CREATE TABLE audit_log (
id TEXT PRIMARY KEY,
action TEXT NOT NULL, -- get, set, delete, list, run
key_hash TEXT, -- キーの SHA-256(平文ではない)
source TEXT NOT NULL, -- cli, mcp, ui
success BOOLEAN NOT NULL,
error_msg TEXT,
timestamp DATETIME NOT NULL,
prev_hash TEXT, -- HMAC チェーン
hash TEXT NOT NULL -- このレコードの HMAC
);

-- メタデータテーブル
CREATE TABLE metadata (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);

ファイル構造

~/.secretctl/
├── vault.db # SQLite データベース(暗号化された値)
│ # 権限: 0600

├── vault.salt # Argon2id salt (128 ビット)
│ # 権限: 0600

├── vault.meta # Vault メタデータ (JSON)
│ # 権限: 0600
│ # 内容: version, created_at

└── mcp-policy.yaml # MCP コマンドポリシー(オプション)
# 権限: 0600
# 検証: シンボリックリンク禁止

セキュリティ境界サマリー

インターフェース信頼レベル平文読み取り可変更可削除可
CLI完全はいはいはい
デスクトップ完全はいはいはい
MCP制限付きいいえいいえいいえ

次のステップ