システムアーキテクチャ
kanade は、数百台の Windows エンドポイントを並行して、安全に、そして非同期で管理するように設計されています。
コンポーネントトポロジー
システムは 5 つの主要コンポーネントで構成されており、イベント駆動型の pub/sub 構造を介して調整されます。
graph TD
subgraph Operator Session
CLI[kanade CLI]
SPA[React SPA]
end
subgraph Server Infrastructure
Backend[kanade-backend]
NATS[NATS Broker / JetStream]
end
subgraph Windows Endpoints
Agent1[kanade-agent PC-1]
Agent2[kanade-agent PC-2]
Client[kanade-client Tauri App]
end
CLI -->|Command / Query API| Backend
SPA -->|REST / WebSockets| Backend
Backend <-->|State/PubSub| NATS
Agent1 <-->|NATS-only Connection| NATS
Agent2 <-->|NATS-only Connection| NATS
Client <-->|Tauri IPC| Agent1
1. kanade-agent
各管理対象ホスト上で動作する高性能な Windows サービスです。
- 役割: コア実行エンジン。
- 通信: アウトバウンド専用の NATS 接続を確立します。インバウンドポートを開かないため、ファイアウォールに優しい設計です。
- 機能: 安全に隔離された PowerShell サブプロセスを起動し、ハードウェア/ソフトウェアのスペック情報の収集、ライブパフォーマンスデータ(CPU、RSSメモリ、ディスクI/O)のストリーミング、およびローカルパッケージの管理を行います。
2. kanade-backend
中央の HTTP API およびプロジェクションサーバーです。
- 役割: コマンドの調整、受信テレメトリの処理、およびオペレーター用 Web インターフェースの提供。
- 状態管理: イベント、アクティビティログ、およびステータスレコードをローカルの SQLite データベースに永続化します。
- プロジェクターパターン: NATS コマンドレスポンスストリームを購読し、受信したペイロードを解析して、リアルタイムで状態テーブルに反映(投影)します。
3. NATS ブローカー (with JetStream)
フリート全体のメッセージ転送レイヤーです。
- 役割: 軽量かつ高スループットなメッセージブローカー。
- JetStream: コマンドストリーム、ジョブ登録、およびファイルストレージ(パッケージやエージェントスクリプトを配信するための NATS オブジェクトストアバケットを使用)を保持します。
- 疎結合: バックエンドとエージェントを切り離します。バックエンドがオフラインまたは再起動中であっても、エージェントは実行を継続して送信トレイにレコードをキャッシュし、接続が再開されたらそれらをプッシュします。
4. kanade-client
エンドポイント上のログインユーザーのデスクトップセッションで動作する、オプションの Tauri デスクトップアプリケーションです。
- 役割: エンドユーザーとの対話(プロンプトダイアログ、通知、ユーザー向けダッシュボードなど)を提供します。
- 通信: セキュリティで保護されたローカル IPC メカニズムを介して、ローカルの
kanade-agentと状態を共有します。
5. kanade CLI
オペレーター向けの主要なコマンドラインツールです。
- 役割: ソフトウェアアップデートのパッケージングと公開、ジョブマニフェストの送信と実行、およびコマンドラインからのライブフリートインベントリの照会。
セキュリティと信頼性の設計
アウトバウンド専用接続
エージェントは、アウトバウンド TCP 接続を開始することによってのみ NATS ブローカーと通信します。エンドポイント側でファイアウォールポートを開く必要がないため、横移動や外部からのポートスキャンのリスクを排除できます。
エージェントジョブのサンドボックス化
スクリプトを実行する際、エージェントは %ProgramData%\Kanade\agent-scripts 内にコマンドを配置(ステージング)し、カスタマイズされたランチャテンプレートを使用して実行します。管理者はジョブマニフェストを介して実行アイデンティティの設定を強制でき、run_as: system(昇格したシステム管理用)または run_as: user(制限されたディレクトリ ACL を使用して、アクティブなユーザーの資格情報の下で安全に実行する用)を指定できます。