Files
awoooi/docs/security/ssh-network-access-inventory.snapshot.json
Your Name bc7e5e05ce
All checks were successful
CD Pipeline / tests (push) Successful in 1m31s
Code Review / ai-code-review (push) Successful in 14s
CD Pipeline / build-and-deploy (push) Successful in 4m25s
CD Pipeline / post-deploy-checks (push) Successful in 1m45s
feat(security): 新增 SSH network access 只讀清冊
2026-06-11 22:19:01 +08:00

572 lines
22 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"access_surfaces": [
{
"access_scope": [
"192.168.0.110",
"192.168.0.111",
"192.168.0.112",
"192.168.0.120",
"192.168.0.121",
"192.168.0.188"
],
"action_buttons_allowed": false,
"config_kind": "ssh_target_inventory",
"control_tier": "C1",
"current_state": "repo_source_visible_needs_pinned_host_key_policy",
"expected_scope": "110_111_112_120_121_188",
"label": "Ansible inventory SSH targets",
"line_count": 48,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": "補 host owner、pinned known_hosts disposition、ProxyJump policy、key owner 與 rollback owner。",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "86108dce9174b5c0a794d240dd40518966d9c340950fc6306845b704f12e6536",
"source_exists": true,
"source_path": "infra/ansible/inventory/hosts.yml",
"surface_id": "ansible_inventory_ssh_targets"
},
{
"access_scope": [
"StrictHostKeyChecking=accept-new",
"ConnectTimeout=10"
],
"action_buttons_allowed": false,
"config_kind": "ssh_client_policy",
"control_tier": "C1",
"current_state": "accept_new_policy_visible_needs_owner_disposition",
"expected_scope": "multi_host",
"label": "Ansible common SSH host key policy",
"line_count": 20,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": "確認 accept-new 是否只限 bootstrap補升級 pinned known_hosts 的 owner 與時間窗。",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "c3d5cb63cf84dea98195aa075e69ca90be7422b5805c0cfc50c1d97b832ad86e",
"source_exists": true,
"source_path": "infra/ansible/inventory/group_vars/all.yml",
"surface_id": "ansible_common_ssh_args"
},
{
"access_scope": [
"192.168.0.110",
"192.168.0.120",
"192.168.0.121",
"192.168.0.188"
],
"action_buttons_allowed": false,
"config_kind": "known_hosts_secret_workflow",
"control_tier": "C1",
"current_state": "repo_guard_visible_live_secret_not_verified",
"expected_scope": "110_120_121_188_known_hosts",
"label": "Gitea CD repair known_hosts secret",
"line_count": 1562,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": "補 owner-provided known_hosts secret metadata、缺 120 時的處置、key rotation owner 與失敗通知 owner。",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "5b41cdc34c954a383ebea9e4109d10165ceb40589d55df9ee6e808d4092bf593",
"source_exists": true,
"source_path": ".gitea/workflows/cd.yaml",
"surface_id": "gitea_cd_known_hosts_secret"
},
{
"access_scope": [
"K8S_SSH_HOST",
"deploy_key",
"kubectl apply",
"ArgoCD sync"
],
"action_buttons_allowed": false,
"config_kind": "ci_deploy_ssh",
"control_tier": "C1",
"current_state": "write_capable_deploy_path_visible_gate_closed",
"expected_scope": "k8s_ssh_host",
"label": "Gitea CD K8s deploy SSH path",
"line_count": 1562,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": "補 deploy SSH host owner、maintenance window、rollback owner、post-check 指標與 break-glass policy。",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "5b41cdc34c954a383ebea9e4109d10165ceb40589d55df9ee6e808d4092bf593",
"source_exists": true,
"source_path": ".gitea/workflows/cd.yaml",
"surface_id": "gitea_cd_deploy_ssh"
},
{
"access_scope": [
"192.168.0.120",
"deploy_key",
"kubectl apply"
],
"action_buttons_allowed": false,
"config_kind": "ci_deploy_ssh",
"control_tier": "C1",
"current_state": "dev_write_capable_deploy_path_visible_gate_closed",
"expected_scope": "192.168.0.120",
"label": "Gitea CD dev deploy SSH path",
"line_count": 262,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " dev deploy key scopehost key policyrollback owner dev/prod ",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "e344a4672cb543979c3bb8ea67967c103332587b4a52a939c837457aaeae686d",
"source_exists": true,
"source_path": ".gitea/workflows/cd-dev.yaml",
"surface_id": "gitea_cd_dev_ssh"
},
{
"access_scope": [
"192.168.0.110",
"deploy alert scripts"
],
"action_buttons_allowed": false,
"config_kind": "ci_deploy_ssh",
"control_tier": "C1",
"current_state": "write_capable_alert_deploy_path_visible_gate_closed",
"expected_scope": "192.168.0.110",
"label": "Deploy alerts SSH path",
"line_count": 72,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " alert deploy ownerknown_hosts pinningrollback ownerpost-check ",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "b0389fa65da643d411f6961928a276d555ad6a416366bf87f3f5c2c06ee45d13",
"source_exists": true,
"source_path": ".gitea/workflows/deploy-alerts.yaml",
"surface_id": "deploy_alerts_ssh_path"
},
{
"access_scope": [
"192.168.0.110",
"192.168.0.188",
"docker ps"
],
"action_buttons_allowed": false,
"config_kind": "ssh_discovery_script",
"control_tier": "C1",
"current_state": "accept_new_scanner_visible_needs_read_only_gate",
"expected_scope": "110_188_docker_hosts",
"label": "Monitoring Docker discovery SSH scanner",
"line_count": 314,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " scanner ownerread-only windowpinned known_hosts",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "563faf8efcfdbd5a79cc87e0d43c2ba11bebf755a773c97b9c0778f1f0634a15",
"source_exists": true,
"source_path": "ops/monitoring/discover_docker.py",
"surface_id": "monitoring_discover_docker_ssh"
},
{
"access_scope": [
"192.168.0.188",
"scp",
"docker compose up -d"
],
"action_buttons_allowed": false,
"config_kind": "monitoring_ssh_deploy_script",
"control_tier": "C1",
"current_state": "write_capable_script_visible_gate_closed",
"expected_scope": "192.168.0.188",
"label": "Monitoring exporter deploy SSH script",
"line_count": 76,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " exporter deploy ownermaintenance windowrollback ownerhost key policy post-check ",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "dbcbca21cf6fd5083177cb8a12c008c1aefed8e6ed05b70d738b3db37699cef3",
"source_exists": true,
"source_path": "ops/monitoring/deploy-exporters.sh",
"surface_id": "monitoring_exporter_deploy_ssh"
},
{
"access_scope": [
"/etc/ssh",
"/etc/nginx",
"systemd",
"docker",
"k8s"
],
"action_buttons_allowed": false,
"config_kind": "ssh_backup_capture",
"control_tier": "C1",
"current_state": "read_capable_capture_visible_not_executed",
"expected_scope": "110_188_120_121_cluster",
"label": "Backup config SSH capture",
"line_count": 359,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " backup execution ownersecret redaction proofretention owner restore validation",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "d24301cff44e464bd19ce0792362be16916ccde8c92f92351a19ef4ee988f15e",
"source_exists": true,
"source_path": "scripts/backup/backup-configs.sh",
"surface_id": "backup_config_ssh_capture"
},
{
"access_scope": [
"awoooi-hosts-add",
"docker kill SIGHUP",
"promtool",
"amtool"
],
"action_buttons_allowed": false,
"config_kind": "sudoers_policy",
"control_tier": "C1",
"current_state": "sudoers_source_visible_needs_live_owner_evidence",
"expected_scope": "host_ops_minimal_sudo",
"label": "Host ops sudoers wrapper",
"line_count": 27,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " live sudoers hashvisudo validationcommand ownerrollback owner forbidden command proof",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "eff02c67402d2f5b2ac8d112dca26a15dc34f03593ca490a0682a6dfa9b0394d",
"source_exists": true,
"source_path": "scripts/host-ops/awoooi-wrapper.sudoers",
"surface_id": "host_ops_sudoers_wrapper"
},
{
"access_scope": [
"default deny",
"ingress",
"egress",
"SSH egress",
"Ollama",
"monitoring"
],
"action_buttons_allowed": false,
"config_kind": "k8s_network_policy",
"control_tier": "C1",
"current_state": "repo_policy_visible_needs_live_cluster_diff",
"expected_scope": "awoooi_prod_namespace",
"label": "K8s production NetworkPolicy",
"line_count": 306,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " live NetworkPolicy diffingress / egress ownerrollback owner route smoke",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "f5ea6a9f5fb0cc44664d97a3ed639fa4b43ffd9bcfd70a1f6b44640791b7859f",
"source_exists": true,
"source_path": "k8s/awoooi-prod/02-network-policy.yaml",
"surface_id": "k8s_prod_network_policy"
},
{
"access_scope": [
"192.168.0.188",
"argocd metrics",
"192.168.0.0/24 UI"
],
"action_buttons_allowed": false,
"config_kind": "k8s_network_policy",
"control_tier": "C1",
"current_state": "repo_policy_visible_needs_prometheus_owner_confirmation",
"expected_scope": "argocd_namespace",
"label": "ArgoCD metrics NetworkPolicy",
"line_count": 80,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " Prometheus scrape ownerNodePort exposure ownerlive policy diff rollback owner",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "41ccd0bb22410c48adc84eae74391106c3f28fe181786cfe4128a07f99d2942c",
"source_exists": true,
"source_path": "k8s/argocd/argocd-metrics-network-policy.yaml",
"surface_id": "argocd_metrics_network_policy"
},
{
"access_scope": [
"nodePort 30882",
"nodePort 30883"
],
"action_buttons_allowed": false,
"config_kind": "k8s_nodeport_service",
"control_tier": "C1",
"current_state": "nodeport_source_visible_needs_exposure_review",
"expected_scope": "argocd_nodeport_30882_30883",
"label": "ArgoCD metrics NodePort",
"line_count": 47,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " NodePort exposure ownerfirewall ownerPrometheus source whitelist rollback owner",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "7f4a8f09206ce0afc185fe11d5e55265bb553b671471724cdcd83c259ec7d266",
"source_exists": true,
"source_path": "k8s/argocd/argocd-metrics-nodeport.yaml",
"surface_id": "argocd_metrics_nodeport"
},
{
"access_scope": [
"nodePort 30885",
"backup metrics"
],
"action_buttons_allowed": false,
"config_kind": "k8s_nodeport_service",
"control_tier": "C1",
"current_state": "nodeport_source_visible_needs_exposure_review",
"expected_scope": "velero_nodeport_30885",
"label": "Velero metrics NodePort",
"line_count": 26,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " Velero metrics exposure ownerfirewall ownerPrometheus source whitelist rollback owner",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "684959def32b792e2bca34b477afcdfe2b0c6dfd0cb90f4b681a514922d62b75",
"source_exists": true,
"source_path": "k8s/velero/velero-metrics-service.yaml",
"surface_id": "velero_metrics_nodeport"
},
{
"access_scope": [
"10.77.114.0/24",
"51820/udp",
"GCP-A",
"GCP-B"
],
"action_buttons_allowed": false,
"config_kind": "wireguard_runbook",
"control_tier": "C1",
"current_state": "target_architecture_documented_not_applied",
"expected_scope": "110_111_120_121_gcp_a_gcp_b",
"label": "GCP Ollama WireGuard mesh runbook",
"line_count": 280,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " WireGuard ownerpublic-key metadatafirewall rule ownercanary planrollback owner cutover gate",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "0af082698c727176ca82c79f95f3950f4c32ed6aabc91c88aff41831fbf0c044",
"source_exists": true,
"source_path": "docs/runbooks/GCP-OLLAMA-WIREGUARD-MESH.md",
"surface_id": "wireguard_mesh_runbook"
},
{
"access_scope": [
"ssh_diagnose",
"docker restart",
"systemctl restart",
"docker compose",
"docker prune"
],
"action_buttons_allowed": false,
"config_kind": "alert_ssh_action_rules",
"control_tier": "C1",
"current_state": "ssh_action_catalog_visible_gate_closed",
"expected_scope": "ssh_mcp_action_catalog",
"label": "Alert rules SSH action surface",
"line_count": 889,
"live_evidence_received": false,
"maintenance_window_accepted": false,
"next_owner_action": " action ownerread/write/admin approval gatecooldownrollback owner post-check ",
"owner_response_accepted": false,
"owner_response_received": false,
"requires_live_evidence": true,
"requires_owner_response": true,
"rollback_owner_accepted": false,
"runtime_gate_open": false,
"sha256": "5786505aa05073bbb2069203a443a75c8337a289dc015630792d0c201c85cafb",
"source_exists": true,
"source_path": "apps/api/alert_rules.yaml",
"surface_id": "alert_rules_ssh_actions"
}
],
"execution_boundaries": {
"action_buttons_allowed": false,
"active_scan_authorized": false,
"firewall_change_authorized": false,
"host_keyscan_authorized": false,
"host_write_authorized": false,
"known_hosts_patch_authorized": false,
"live_host_read_authorized": false,
"network_policy_apply_authorized": false,
"nodeport_change_authorized": false,
"runtime_execution_authorized": false,
"secret_value_collection_allowed": false,
"ssh_key_collection_allowed": false,
"ssh_read_authorized": false,
"ssh_write_authorized": false,
"sudo_action_authorized": false,
"wireguard_change_authorized": false
},
"expected_scopes": [
"110_111_112_120_121_188",
"110_111_120_121_gcp_a_gcp_b",
"110_120_121_188_known_hosts",
"110_188_120_121_cluster",
"110_188_docker_hosts",
"192.168.0.110",
"192.168.0.120",
"192.168.0.188",
"argocd_namespace",
"argocd_nodeport_30882_30883",
"awoooi_prod_namespace",
"host_ops_minimal_sudo",
"k8s_ssh_host",
"multi_host",
"ssh_mcp_action_catalog",
"velero_nodeport_30885"
],
"generated_at": "2026-06-11T23:55:00+08:00",
"git_commit": "7cd47558",
"next_collection_order": [
"gitea_cd_known_hosts_secret",
"ansible_inventory_ssh_targets",
"host_ops_sudoers_wrapper",
"k8s_prod_network_policy",
"alert_rules_ssh_actions",
"argocd_metrics_nodeport",
"velero_metrics_nodeport",
"wireguard_mesh_runbook",
"monitoring_discover_docker_ssh",
"backup_config_ssh_capture"
],
"operator_interpretation": [
" repo-only SSH / network access live hostfirewall cluster truth",
"source_exists=true repo known_hostssudoersNetworkPolicyNodePort WireGuard ",
"write-capable SSH / sudoers / alert action surface SSHsudodockersystemctl kubectl ",
" live hashpinned host keymaintenance windowrollback ownerfirewall owner post-check owner response"
],
"schema_version": "ssh_network_access_inventory_v1",
"source_scope": "committed_repo_files_only",
"status": "repo_only_inventory_ready",
"summary": {
"action_button_count": 0,
"coverage_percent_after_inventory": 54,
"coverage_percent_before_inventory": 48,
"expected_scope_count": 16,
"live_evidence_received_count": 0,
"maintenance_window_accepted_count": 0,
"network_policy_surface_count": 2,
"nodeport_surface_count": 2,
"owner_response_accepted_count": 0,
"owner_response_received_count": 0,
"rollback_owner_accepted_count": 0,
"runtime_gate_count": 0,
"source_exists_count": 16,
"ssh_source_surface_count": 11,
"sudoers_surface_count": 1,
"surface_count": 16,
"surfaces_requiring_live_evidence_count": 16,
"surfaces_requiring_owner_response_count": 16,
"wireguard_surface_count": 1,
"write_capable_surface_count": 6
},
"write_capable_surfaces": [
{
"config_kind": "ci_deploy_ssh",
"expected_scope": "k8s_ssh_host",
"label": "Gitea CD K8s deploy SSH path",
"required_gate": "owner_response_plus_maintenance_window_plus_rollback_owner",
"surface_id": "gitea_cd_deploy_ssh"
},
{
"config_kind": "ci_deploy_ssh",
"expected_scope": "192.168.0.120",
"label": "Gitea CD dev deploy SSH path",
"required_gate": "owner_response_plus_maintenance_window_plus_rollback_owner",
"surface_id": "gitea_cd_dev_ssh"
},
{
"config_kind": "ci_deploy_ssh",
"expected_scope": "192.168.0.110",
"label": "Deploy alerts SSH path",
"required_gate": "owner_response_plus_maintenance_window_plus_rollback_owner",
"surface_id": "deploy_alerts_ssh_path"
},
{
"config_kind": "monitoring_ssh_deploy_script",
"expected_scope": "192.168.0.188",
"label": "Monitoring exporter deploy SSH script",
"required_gate": "owner_response_plus_maintenance_window_plus_rollback_owner",
"surface_id": "monitoring_exporter_deploy_ssh"
},
{
"config_kind": "sudoers_policy",
"expected_scope": "host_ops_minimal_sudo",
"label": "Host ops sudoers wrapper",
"required_gate": "owner_response_plus_maintenance_window_plus_rollback_owner",
"surface_id": "host_ops_sudoers_wrapper"
},
{
"config_kind": "alert_ssh_action_rules",
"expected_scope": "ssh_mcp_action_catalog",
"label": "Alert rules SSH action surface",
"required_gate": "owner_response_plus_maintenance_window_plus_rollback_owner",
"surface_id": "alert_rules_ssh_actions"
}
]
}