# IwoooS SSH / network / firewall post-incident readback plan

| 項目 | 內容 |
|------|------|
| 日期 | 2026-06-15 |
| 狀態 | `post_incident_readback_plan_ready_no_runtime_action` |
| 工具 | `scripts/security/ssh-network-post-incident-readback-plan.py` |
| Snapshot | `docs/security/ssh-network-post-incident-readback-plan.snapshot.json` |
| Source acceptance | `docs/security/port-firewall-change-evidence-acceptance.snapshot.json` |
| runtime gate | `0` |

## 1. 目的

本文件承接端口 / 防火牆變更證據驗收帳本，補上事故後回讀計畫。未來若再次發生端口被關、firewall / NetworkPolicy / NodePort / WireGuard policy 被改動、deploy SSH 斷線、AI provider route 異常、public route 或 monitoring 路徑受影響，IwoooS 必須先收齊「誰改、何時改、改前改後狀態、影響哪些服務、是否同步相關產品、怎麼恢復、怎麼防再發」的脫敏證據。

這不是 SSH 授權、不是 live firewall read、不是 firewall / port change、不是 route smoke、不是 host restart，也不是 runtime gate。它只建立 post-incident readback 的欄位、reviewer checks、分流與拒收條件，避免把「服務後來恢復」誤判成「事故原因、責任、影響與防再發都已驗收」。

## 2. 摘要

| 指標 | 目前值 | 說明 |
|------|--------|------|
| readback candidate | `14` | 承接端口 / 防火牆 / NodePort / NetworkPolicy / WireGuard / deploy SSH / sudo / alert action surface |
| write-capable readback candidate | `6` | 可能影響 deploy SSH、monitoring deploy、sudoers 或 alert action catalog 的 surface |
| policy / exposure readback candidate | `5` | NetworkPolicy、NodePort、WireGuard 與 exposure 相關 surface |
| health impact review required | `14` | 全部都必須交代 service / AI provider / monitoring / product impact |
| cross-project sync required | `14` | 全部都必須交代跨產品 / owner / Session 同步 ref |
| recurrence guard required | `14` | 全部都必須提出防再發 guard 或 change freeze rule |
| readback field | `30` | readback 欄位總數 |
| required readback field | `24` | owner / reviewer 必填欄位 |
| reviewer check | `24` | actor、before / after、health impact、通知、同步、恢復、防再發與 no-false-green 檢查 |
| outcome lane | `10` | waiting、補 actor、補 before-after、補 health impact、隔離、拒收、review、ledger-only、防再發回補、runtime gate |
| blocked action | `34` | SSH、firewall、port、route smoke、reload、restart、secret、active scan、provider switch、prompt send、production write 等 |
| post-incident readback received / accepted | `0 / 0` | 尚未收到或驗收 |
| no-false-green accepted | `0` | 不把 route 200、service up 或 UI 可見當事故驗收 |
| runtime gate / action button | `0 / 0` | 不提供操作入口 |

## 3. Readback Candidate 範圍

| Candidate | 驗收焦點 |
|-----------|----------|
| `ssh_network_post_incident_readback:ansible_inventory_ssh_targets` | 主機存取異動、端口影響、維護窗口、rollback 與 post-check |
| `ssh_network_post_incident_readback:gitea_cd_deploy_ssh` | deploy SSH 可達性、回復證據、rollback owner 與跨專案通知 |
| `ssh_network_post_incident_readback:gitea_cd_dev_ssh` | dev / prod 邊界、端口 policy、owner decision 與防再發 |
| `ssh_network_post_incident_readback:deploy_alerts_ssh_path` | alert deploy path、通知鏈路、受影響產品與恢復 readback |
| `ssh_network_post_incident_readback:monitoring_discover_docker_ssh` | monitoring discovery 可達性、read-only window 與 false-green 風險 |
| `ssh_network_post_incident_readback:monitoring_exporter_deploy_ssh` | exporter deploy access、firewall owner、post-check 與 rollback |
| `ssh_network_post_incident_readback:backup_config_ssh_capture` | backup access、restore validation、service dependency 與 notification |
| `ssh_network_post_incident_readback:host_ops_sudoers_wrapper` | sudo 授權邊界、break-glass、回復責任與 forbidden command proof |
| `ssh_network_post_incident_readback:k8s_prod_network_policy` | ingress / egress policy、route impact、metrics / alert 與回滾 |
| `ssh_network_post_incident_readback:argocd_metrics_network_policy` | metrics scrape、NodePort exposure、source whitelist 與 monitoring impact |
| `ssh_network_post_incident_readback:argocd_metrics_nodeport` | NodePort exposure、firewall owner、rollback 與 public/admin route 影響 |
| `ssh_network_post_incident_readback:velero_metrics_nodeport` | backup metrics exposure、access policy 與 restore readiness 影響 |
| `ssh_network_post_incident_readback:wireguard_mesh_runbook` | mesh cutover、firewall rule owner、canary / rollback 與 maintenance window |
| `ssh_network_post_incident_readback:alert_rules_ssh_actions` | alert action catalog、read/write/admin 分級、cooldown 與 post-check |

## 4. 必填 Readback 欄位

1. `change_or_incident_ref`
2. `actor_attribution_ref`
3. `incident_detected_at_ref`
4. `change_window_ref`
5. `affected_port_or_policy_ref`
6. `before_state_ref`
7. `after_state_ref`
8. `service_dependency_ref`
9. `public_route_impact_ref`
10. `ai_provider_impact_ref`
11. `monitoring_alert_impact_ref`
12. `customer_or_product_impact_ref`
13. `operator_notification_ref`
14. `cross_project_sync_ref`
15. `restoration_evidence_ref`
16. `postcheck_readback_ref`
17. `recurrence_guard_ref`
18. `maintenance_window`
19. `rollback_owner`
20. `followup_owner`
21. `redacted_evidence_refs`
22. `no_secret_value_attestation`
23. `no_raw_firewall_dump_attestation`
24. `no_false_green_attestation`

## 5. Reviewer Checks

1. `source_change_evidence_current`
2. `incident_ref_present`
3. `actor_not_anonymous`
4. `before_after_state_present`
5. `port_policy_redacted`
6. `service_dependency_present`
7. `public_route_impact_present`
8. `ai_provider_impact_present`
9. `monitoring_alert_impact_present`
10. `customer_product_impact_present`
11. `operator_notification_present`
12. `cross_project_sync_present`
13. `restoration_evidence_present`
14. `postcheck_independent`
15. `recurrence_guard_present`
16. `emergency_classification_present`
17. `maintenance_window_present`
18. `rollback_owner_present`
19. `no_false_green_route_200`
20. `raw_firewall_dump_absent`
21. `secret_or_key_value_absent`
22. `hidden_impact_absent`
23. `counts_transition_safe`
24. `runtime_stays_zero`

## 6. Outcome Lanes

| Lane | 說明 |
|------|------|
| `waiting_post_incident_readback` | 尚未收到事故回讀包；所有 accepted / runtime count 維持 0 |
| `request_actor_supplement` | 缺 actor / owner / decision 時要求補件 |
| `request_before_after_supplement` | 缺 before / after 或 restoration evidence 時要求補件 |
| `request_health_impact_supplement` | 缺 service / AI provider / monitoring / product impact 時要求補件 |
| `quarantine_raw_payload` | 收到 raw firewall dump、secret 或 key material 時只能隔離 |
| `reject_unattributed_incident` | 無 actor、無 affected scope、無 rollback 或無 notification 的事故回讀不得驗收 |
| `ready_for_post_incident_review` | metadata 合格後，只能進 reviewer review |
| `incident_readback_only_update` | 只允許更新只讀 ledger，不得反向視為已批准操作 |
| `recurrence_guard_backfill_required` | 需補防再發 guard、owner review 與 change freeze |
| `waiting_runtime_gate` | 即使 readback accepted，runtime gate 仍需獨立人工批准 |

## 7. 禁止動作

1. `ssh_read`
2. `ssh_write`
3. `live_firewall_read`
4. `firewall_change`
5. `port_change`
6. `port_close`
7. `port_open`
8. `network_policy_apply`
9. `nodeport_change`
10. `wireguard_change`
11. `sudo_action`
12. `deploy_ssh_action`
13. `route_smoke`
14. `public_gateway_reload`
15. `nginx_reload`
16. `host_restart`
17. `docker_restart`
18. `systemd_restart`
19. `secret_value_collection`
20. `ssh_key_collection`
21. `raw_firewall_dump_storage`
22. `raw_key_material_storage`
23. `mark_readback_accepted_without_reviewer_record`
24. `mark_incident_resolved_without_postcheck`
25. `hide_cross_project_impact`
26. `treat_route_200_as_all_green`
27. `treat_break_glass_as_approval`
28. `close_management_port_without_owner`
29. `open_runtime_gate`
30. `add_action_button`
31. `production_write`
32. `active_scan`
33. `provider_switch`
34. `prompt_send`

## 8. 指令

產生 committed snapshot：

```bash
python3 scripts/security/ssh-network-post-incident-readback-plan.py \
  --root . \
  --source-change-evidence-report docs/security/port-firewall-change-evidence-acceptance.snapshot.json \
  --output docs/security/ssh-network-post-incident-readback-plan.snapshot.json \
  --generated-at 2026-06-15T19:16:00+08:00
```

驗證 guard：

```bash
python3 scripts/security/security-mirror-progress-guard.py --root .
```

## 9. 完成度

| 工作 | 完成度 | 說明 |
|------|--------|------|
| post-incident readback plan artifact | `100%` | 14 份候選、snapshot、文件與 guard 已固定 |
| post-incident readback received / accepted | `0%` | 尚未收到，尚未驗收 |
| actor / before-after / impact evidence | `0%` | 尚未收到 owner-provided evidence |
| service / AI provider / monitoring impact | `0%` | 尚未收到脫敏 impact refs |
| cross-project sync / notification evidence | `0%` | 尚未收到同步與通知證據 |
| recurrence guard / no-false-green accepted | `0%` | 尚未驗收防再發或 no-false-green |
| SSH / firewall / port / route / restart action | `0%` | 未授權且未執行 |
| runtime gate / production write | `0%` | 未授權且未執行 |
