fix(iwooos): keep security coverage and alert gates closed
Some checks failed
CD Pipeline / tests (push) Failing after 1m36s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
Code Review / ai-code-review (push) Successful in 14s
Ansible / Reboot Recovery Contract / validate (push) Has been cancelled

This commit is contained in:
Your Name
2026-06-26 18:29:13 +08:00
parent e51d2594e1
commit 91d566a4bb
6 changed files with 22 additions and 23 deletions

View File

@@ -53,7 +53,7 @@ def load_latest_iwooos_security_control_coverage(
return {
"schema_version": _SCHEMA_VERSION,
"status": "committed_scope_rollup_ready_runtime_control_blocked",
"status": "committed_scope_rollup_ready_runtime_control_closed",
"mode": "committed_snapshot_rollup_only_no_live_runtime_query",
"summary": summary,
"domains": domains,

View File

@@ -481,7 +481,7 @@ def format_aiops_signal_alert_card(text: str) -> str:
"",
"<b>AI 自動化判讀</b>",
f"├ Lane<code>{html.escape(spec.lane)}</code>",
"├ Gate<code>controlled_playbook_queue</code> / <code>runtime_write_gate=controlled</code>",
"├ Gate<code>controlled_playbook_queue</code> / <code>runtime_write_gate=0</code>",
f"└ 下一步:{html.escape(spec.next_step)}",
"",
"<b>Top evidence</b>",
@@ -745,7 +745,7 @@ def format_host_resource_alert_card(text: str) -> str:
"",
"<b>AI 自動化判讀</b>",
f"├ Lane<code>{html.escape(automation_lane)}</code>",
"├ Gate<code>controlled_playbook_queue</code> / <code>runtime_write_gate=controlled</code>",
"├ Gate<code>controlled_playbook_queue</code> / <code>runtime_write_gate=0</code>",
f"└ 下一步:{html.escape(automation_next_step)}",
"",
"<b>Top evidence</b>",
@@ -2245,8 +2245,6 @@ def _ai_automation_alert_card_metadata(text: str) -> dict[str, object] | None:
gates.append("controlled_playbook_queue")
if "runtime_write_gate=0" in text:
gates.append("runtime_write_gate=0")
if "runtime_write_gate=controlled" in text:
gates.append("runtime_write_gate=controlled")
metadata: dict[str, object] = {
"schema_version": "ai_automation_alert_card_mirror_v1",
@@ -2257,11 +2255,9 @@ def _ai_automation_alert_card_metadata(text: str) -> dict[str, object] | None:
"gates": gates,
"candidate_only": "candidate_only" in gates,
"controlled_playbook_queue": "controlled_playbook_queue" in gates,
"runtime_write_gate_count": gates.count("runtime_write_gate=controlled"),
"runtime_write_gate_count": 0,
"runtime_write_gate_state": (
"controlled"
if "runtime_write_gate=controlled" in gates
else "closed"
"closed"
if "runtime_write_gate=0" in gates
else "unknown"
),

View File

@@ -19,7 +19,7 @@ def test_iwooos_security_control_coverage_rolls_up_core_scopes() -> None:
payload = load_latest_iwooos_security_control_coverage()
assert payload["schema_version"] == "iwooos_security_control_coverage_v1"
assert payload["status"] == "committed_scope_rollup_ready_runtime_control_blocked"
assert payload["status"] == "committed_scope_rollup_ready_runtime_control_closed"
assert payload["summary"]["source_snapshot_count"] == 8
assert payload["summary"]["control_domain_count"] == 8
assert payload["summary"]["visible_scope_unit_count"] == 160
@@ -76,5 +76,6 @@ def test_iwooos_security_control_coverage_api_is_public_safe() -> None:
assert data["summary"]["visible_scope_unit_count"] == 160
assert any(action["priority"] == "P0-01" for action in data["p0_next_actions"])
assert "192.168.0." not in response.text
assert "runtime_control_blocked" not in response.text
assert "工作視窗" not in response.text
assert "批准!繼續" not in response.text

View File

@@ -166,11 +166,11 @@ full_log=/var/ossec/logs/alerts/alerts.json Authorization: Bearer abcdefghijklmn
assert card_metadata["target"] == "wazuh_dashboard_api"
assert card_metadata["gates"] == [
"controlled_playbook_queue",
"runtime_write_gate=controlled",
"runtime_write_gate=0",
]
assert card_metadata["controlled_playbook_queue"] is True
assert card_metadata["runtime_write_gate_state"] == "controlled"
assert card_metadata["runtime_write_gate_count"] == 1
assert card_metadata["runtime_write_gate_state"] == "closed"
assert card_metadata["runtime_write_gate_count"] == 0
assert card_metadata["delivery_receipt_readback_required"] is True
assert envelope["source_refs"]["alert_ids"] == [
"wazuh_dashboard_api_readback_degraded"

View File

@@ -80,7 +80,7 @@ root 364 181 0.7 3491396 494608 ? Rl 05:56 0:18 /opt/hostedto
assert "AI 自動化判讀" in result
assert "runner_build_resource_pressure" in result
assert "controlled_playbook_queue" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "Top evidence" in result
assert "PID 259" in result
assert "Next.js build" in result
@@ -113,7 +113,7 @@ def test_orphan_browser_alert_becomes_runaway_process_event_packet() -> None:
assert "check-mode" in result
assert "受控 SIGTERM" in result
assert "KM / PlayBook / Verifier" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "allowlisted PlayBook" in result
assert "受控 apply" in result
@@ -133,7 +133,7 @@ def test_ci_runner_load_alert_becomes_capacity_event_packet() -> None:
assert "Gitea Actions run" in result
assert "合法 CI" in result
assert "不做 process remediation" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "受控 cleanup" in result
@@ -153,7 +153,7 @@ syscheck integrity changed on /etc/nginx/sites-enabled/awoooi.conf
assert "wazuh_intrusion_signal" in result
assert "security_intrusion_triage" in result
assert "controlled_playbook_queue" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "Top evidence" in result
assert "Timeline / KM / PlayBook" in result
assert "不封鎖 IP" in result
@@ -180,7 +180,7 @@ full_log=/var/ossec/logs/alerts/alerts.json Authorization: Bearer abcdefghijklmn
assert "wazuh_dashboard_api_readback_degraded" in result
assert "siem_observability_readback_degraded" in result
assert "controlled_playbook_queue" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "manager registry 只讀計數" in result
assert "no-false-green" in result
assert "不重啟 Wazuh" in result
@@ -204,7 +204,7 @@ diff_url=https://internal.example.invalid/raw/live.conf
assert "nginx_config_drift" in result
assert "public_gateway_config_drift" in result
assert "redacted live export" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "不執行 nginx -t" in result
assert "不 reload" in result
assert "/etc/nginx" not in result
@@ -269,7 +269,7 @@ def test_aiops_signal_formatter_covers_non_host_alert_lanes(
assert event_type in result
assert lane in result
assert "controlled_playbook_queue" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "Top evidence" in result
assert "禁止事項" in result
@@ -331,7 +331,7 @@ async def test_send_alert_notification_normalizes_aiops_signal_alert(monkeypatch
assert payload["parse_mode"] == "HTML"
assert "ai_automation_alert_card_v1" in payload["text"]
assert "public_gateway_config_drift" in payload["text"]
assert "runtime_write_gate=controlled" in payload["text"]
assert "runtime_write_gate=0" in payload["text"]
assert "/etc/nginx" not in payload["text"]
@@ -352,7 +352,7 @@ root 392 0.0 0.0 1096836 53400 ? Ssl 06:27 0:00 /opt/hostedto
assert "Prisma generate" in result
assert "容器 root 進程:<code>3</code>" in result
assert "套件來源" in result
assert "runtime_write_gate=controlled" in result
assert "runtime_write_gate=0" in result
assert "root 365" not in result
assert "checkpoint.prisma.io" not in result
assert "node_modules" not in result
@@ -442,7 +442,7 @@ def test_send_request_payload_normalizer_blocks_direct_host_raw_dump() -> None:
assert result["parse_mode"] == "HTML"
assert "P1 主機資源壓力h110-gitea" in result["text"]
assert "ai_automation_alert_card_v1" in result["text"]
assert "runtime_write_gate=controlled" in result["text"]
assert "runtime_write_gate=0" in result["text"]
assert "root 311" not in result["text"]
assert "checkpoint.prisma.io" not in result["text"]
assert "/workspace/wooo" not in result["text"]

View File

@@ -7,9 +7,11 @@
- 新增 `GET /api/v1/iwooos/security-control-coverage`;端點只讀 repo snapshot不查 live host、不讀 secret、不連 Wazuh / Kali、不 SSH、不啟動掃描、不送 Telegram、不開 runtime gate。
- 前台 `/zh-TW/iwooos` 新增 `IwoooS 資安納管覆蓋總表`,顯示 `visible_scope_unit_count=160``control_domain_count=8`、控制面可視 `71%`、runtime acceptance `0%`、owner accepted `0`、Wazuh manager registry accepted `0`
- 納管域包含:高價值資產與配置總帳、主機服務 / Docker / systemd、監控 / 告警 / 可觀測性、SSH / Firewall / WireGuard / NodePort / NetworkPolicy、AWOOOI runtime surfaces、Wazuh 主機納管、agent-bounty-protocol、AI Agent / Provider / 自動化資產。
- 併同修復 `e7c368aa` 帶出的 Telegram 卡片 gate 語意AI 事件卡仍可標 `controlled_playbook_queue`,但 runtime 寫入閘門必須明確顯示 `runtime_write_gate=0`AwoooP mirror metadata 也固定為 `runtime_write_gate_state=closed``runtime_write_gate_count=0`,避免告警卡讓人誤判受控寫入已開門。
**只讀驗證結果**
- `pytest apps/api/tests/test_iwooos_security_control_coverage.py apps/api/tests/test_iwooos_runtime_security_readback.py apps/api/tests/test_iwooos_wazuh_api.py -q``12 passed`
- `pytest apps/api/tests/test_iwooos_security_control_coverage.py apps/api/tests/test_iwooos_runtime_security_readback.py apps/api/tests/test_iwooos_wazuh_api.py apps/api/tests/test_auto_repair_service.py apps/api/tests/test_awooop_operator_timeline_labels.py apps/api/tests/test_awooop_truth_chain_service.py apps/api/tests/test_operator_outcome.py apps/api/tests/test_telegram_gateway_error_sanitizer.py apps/api/tests/test_telegram_message_templates.py -q``254 passed`
- `pnpm --dir apps/web typecheck`:通過。
- `python3 -m json.tool apps/web/messages/zh-TW.json` / `apps/web/messages/en.json`:通過。
- `python3.11 -m py_compile apps/api/src/api/v1/iwooos.py apps/api/src/services/iwooos_security_control_coverage.py apps/api/src/services/iwooos_runtime_security_readback.py apps/api/src/services/snapshot_paths.py`:通過。