狀態:已實作 + I2 端到端驗證通過(2026-06-19)。身分模型 v3(決策 B)已套用,見 §5(6)。 以
CLIENT_SERVER_REGISTRATION.txt為準重整;v1(cloud 抓指紋 + ops 預發憑證 + UI 手動註冊)已被取代。📦 部署一律使用 mTLS(
AGENT_AUTH_MODE=full) ——none僅供測試暫時停用認證。 完整部署操作手冊:evidence-agent/deploy/README.md。 資料面 mTLS 的踩雷(httpx 0.28 client 憑證要 SSLContext、下載走檔案自己的 agent、 base_url 必須 https)見docs/changelog/2026-06-19-fr039-dataplane-mtls-download-i2-fixes.md。
| # | 決策 | 定案 |
|---|---|---|
| 1 | 註冊方式 | agent 自我註冊(installer/.env 帶 token + endpoint,agent 主動發第一次心跳註冊) |
| 2 | 資料面方向 | 維持 cloud→agent HTTP(/blob 沿用,含 SHA-256 對帳);跨外網可達性 = 網路層 tunnel(另案) |
| 3 | 憑證 | 雲端 enroll 時自動簽發(agent 送 CSR、雲端 CA 簽 server 憑證回傳);取代 v1 的 ops 預發 |
| 4 | 即時 UI | 延後(未來用 SocketIO 推播);現階段管理頁重新整理看狀態 |
| 5 | 註冊 token | 每 tenant 一組(可重生/撤銷),installer 內建 |
| 6 | 設備指紋 | product_uuid + machine_id + MAC → sha256 = device_uuid;agent 收集後主動送 |
| 7 | 封裝 | 延後(先 Docker + .env 帶 token/endpoint;之後再包 .msi/.deb,不影響模型) |
| 8 | 撤銷 | status(active/revoked) + JWT 短效 → 標記後幾乎即時失效 |
控制面(agent 主動撥出) 資料面(cloud→agent,沿用)
agent ──register/heartbeat──▶ 雲端 雲端 ──/blob 上傳/下載/刪/預覽──▶ agent
token + device_uuid enroll: (mTLS + JWT + 指紋 + status 檢查)
+ hardware + version 驗 token → upsert
→ 簽發 agent 憑證回傳
→ last_seen / online
device_uuid = sha256( product_uuid + "|" + machine_id + "|" + primary_mac )
| 識別碼 | 來源 | 綁定維度 |
|---|---|---|
product_uuid |
/sys/class/dmi/id/product_uuid(SMBIOS) |
硬體(主機板);重灌不變、換板才變 |
machine_id |
/etc/machine-id(systemd) |
OS 安裝;重灌就變、換板不變 |
primary_mac |
主網卡 | 網卡 |
/sys/.../product_uuid、/etc/machine-id 唯讀 + 部署腳本寫 MAC 檔);原生封裝後直接讀,免掛載。① agent ──HTTPS(雲端 server cert) + token──▶ 雲端 ← bootstrap:只靠 token + TLS
② 雲端驗 token → tenant 確認 → agent 產 keypair 送 CSR
→ 雲端 CA 簽 agent server 憑證(SAN=agent host/IP)→ 回傳
③ 之後 agent 用此憑證跑 HTTPS server;資料面走 mTLS + JWT ← 穩態
status=revoked(雲端拒呼叫)+ JWT 短效。installer(現階段 Docker + .env)帶:雲端 endpoint + 該 tenant 的 registration token。agent 啟動算 device_uuid。
agent ──HTTPS POST /api/1.0/agents/register──▶ 雲端
payload: { token, device_uuid, base_url, hardware_info, agent_version, status:"registering" }
驗 token → 對應 tenant
Upsert by (tenant_id, device_uuid):有則更新、無則新增一列進 remote_agents
回傳:簽好的 agent 憑證(+ CA);UI 上該設備自動出現(重新整理可見)
agent ──每 N 分鐘 POST /api/1.0/agents/heartbeat { device_uuid, status }──▶ 雲端
雲端更新 last_seen_at;超過門檻(如 30 分)未收到 → 視為 offline
即時 UI 延後:online/offline 由
last_seen_at推算,管理頁重新整理時顯示。
雲端用 agent 回報的 base_url 打 /blob*:mTLS(雲端 client cert + 驗 agent cert)+ JWT(帶 bound device_uuid)+ agent 驗指紋 + status != revoked。
⚠️ v3 修訂(2026-06-19,決策 B):身分主鍵改為伺服器發的
agent_uid,rebind 已退場。 詳見docs/analysis/2026-06-19-fr039-agent-identity-v3-uid-vs-fingerprint.md。
- 身分 = agent 持久化的
agent_uid(雲端首次發);device_fingerprint降為可更新屬性(attestation)。- 換硬體 → register/heartbeat 依
agent_uid自動更新指紋 + 記稽核(FILE_AGENT_FINGERPRINT_CHANGED),不冒新列、不需人工 rebind。- 平台刪掉該 agent → 心跳回 404 → agent 自動重新 enroll(換新 uid)。對齊 osquery/Teleport/SPIRE 主流。
- rebind endpoint 留 dormant(FE 不放鈕);下方原 v2 敘述保留供脈絡。
status=revoked → 雲端所有呼叫即拒(JWT 短效,幾乎即時)。(不變)compliance.remote_agents 加欄(Phase 1 已加 device_fingerprint/status;本版再加)| 欄位 | 型別 | 說明 |
|---|---|---|
device_fingerprint |
VARCHAR(64) | = device_uuid(已加,Phase 1) |
status |
VARCHAR(20) | active / revoked(已加,Phase 1) |
last_seen_at |
TIMESTAMP NULL | 最後心跳時間;online/offline 由此推算 |
agent_version |
VARCHAR(50) NULL | agent 回報版本 |
hardware_info |
JSONB NULL | agent 回報硬體細節(稽核用) |
base_url改為 agent 註冊時回報(不再 UI 手打);uid仍是 registry 內部 id,upsert 鍵 = (tenant_id, device_fingerprint)。
compliance.remote_agent_enroll_tokens(per-tenant 註冊 token)| 欄位 | 型別 | 說明 |
|---|---|---|
id / uid |
— | PK / 識別 |
tenant_id |
INTEGER | 歸屬租戶 |
token_hash |
VARCHAR(64) | token 的 sha256(不存明文) |
label |
VARCHAR(100) | 備註 |
enabled |
BOOLEAN | 是否有效(撤銷=false) |
created_at/user … |
— | 審計 |
agent 端 DB(
fileagent.upload_files)不變。
| 內容 | |
|---|---|
| ♻️ 重用 | 資料面 /blob(上傳/下載/刪/預覽/SHA-256 對帳)、remote_agents registry、storage-config、Phase 1 的 device_fingerprint/status |
| 🔧 改 | 註冊:UI 手打 base_url → agent 自我註冊 + upsert;憑證:ops 預發 → 雲端 enroll 簽發;指紋:雲端抓 → agent 送 |
| ➕ 新增(cloud BE) | POST /agents/register、POST /agents/heartbeat、token 管理(表 + CRUD + 重生/撤銷)、CA 簽發 util(CSR→cert)、JWT util(RS256)、last_seen/online 推算、撤銷/重新綁定 endpoint |
| ➕ 新增(evidence-agent) | 開機算 device_uuid、自我註冊 + 心跳迴圈、存放雲端回傳的憑證、資料面驗 JWT + 指紋 self-check、nginx/TLS |
| ➕ **新增(FE) | 設備清單(自動出現/狀態欄 online-offline-active-revoked)、token 管理頁、重新綁定/撤銷鈕(manager)—— 加在現有管理頁旁,不取代** |
| ⏸️ **退場(先保留,不做) | UI 手動新增 agent、現有「測試連線 / 對帳」全部留著**;自我註冊與其並存,未來再決定是否退場 |