セキュリティ
Vessios がテナントを分離し、データを保護し、代表的な攻撃経路を防御する仕組み。
Vessios はマルチテナント SaaS であるため、テナント分離と代表的な攻撃クラスへの防御は後付けの機能ではなく、設計の土台です。
テナント分離
各テナントのページ・ソース・ナレッジグラフは、分離されたサブコレクションに格納されます。ベクトル検索での分離は決定論的です — 理論上衝突しうるハッシュ関数ではなく、tenant_id によるカテゴリ制限で強制されます。Ingest 時に PII リスクありとフラグされたコンテンツは、管理者がレビューするまですべての検索経路(ベクトル・キーワード・agentic)から除外されるため、未レビューのまま LLM プロンプトに渡ることはありません。
認証・認可
- JWT ベースのセッション(RS256 署名、アクセストークン1時間、リフレッシュトークン30日)。
- 4段階のロールベースアクセス制御(
owner/admin/editor/viewer)。各ロールにできることは クイックスタート を参照。 - 自分自身へのロール変更は禁止されており、偶発的・意図的な権限昇格を防ぎます。
- トークン失効(JTI)とパスワードリセットのレート制限は fail-closed です。基盤となるキャッシュが利用できない場合、Vessios はリクエストを黙って許可するのではなく拒否します。
Ingest 時の防御
- すべての URL Ingest、および Webhook/コネクタの接続先に対する SSRF 防御 — 内部ホストや想定外のホストへのリクエストはリクエスト実行前に拒否されます。
- SHA-256 コンテンツハッシュによる重複検出。
- Ingest されたコンテンツに対するプロンプトインジェクション検査、および Query 時に取得したコンテンツから検出された不正な指示の隔離。
- 決定論的な出力フィルタリング — 生成された回答が外部 URL へデータを exfiltration することをブロックします。
- Agentic Search が LLM 生成する正規表現は、照合長・走査行数の上限つきで実行され、ReDoS を防ぎます。
課金と冪等性
Stripe の Webhook イベントは、信頼される前に raw body を使って HMAC-SHA256 で検証されます。冪等性(Ingest リクエストの X-Idempotency-Key、および Stripe イベントの両方)は原子的な claim(SET NX)によって実現され、並行する重複リクエストが両方とも適用されることを防ぎます。課金イベントは特に fail-closed な claim を使用します — 基盤となるストアが利用できない場合、二重適用の課金や権限変更のリスクを冒すのではなく、Stripe が後で再送できるようリトライ可能なエラーを返します。
データライフサイクル
- GDPR 対応として、テナントの完全削除が可能です(
DELETE /tenants/me)。 - ページ履歴は楽観的ロックでバージョン管理されており、常に確認・復元が可能です。
本番環境の安全策
Vessios は、安全でない設定のまま本番環境で起動することを拒否します。ローカル専用のフォールバック(Redis の代わりのインメモリキャッシュなど)や Stripe のテストキーは拒否され、重要なシークレット(Webhook 署名用シークレット、内部サービス用シークレット、明示的な CORS 許可リスト)が未設定の場合は必須とされます — 設定が不完全な場合は、静かに機能低下するのではなく、デプロイ自体が失敗します。