{
    "schema": "https://saferpage.de/schemas/security-feed-credential-preflight.v1",
    "generated_at": "2026-06-09T20:34:11+00:00",
    "domain": "anrufer.info",
    "available": true,
    "status": "blocked",
    "ready_for_external_feed_run": false,
    "ready_for_signed_delivery": false,
    "ready_for_storage_write": false,
    "ready_for_activation": false,
    "summary": "anrufer.info: Credential-Preflight blockiert; 4/6 Check(s) offen, 3 Pflicht-Secret(s) fehlen.",
    "metrics": {
        "secret_reference_count": 6,
        "configured_secret_reference_count": 0,
        "required_secret_reference_count": 3,
        "missing_required_secret_reference_count": 3,
        "check_count": 6,
        "blocked_check_count": 4,
        "external_probe_executed": 0,
        "runner_error_count": 0,
        "dispatch_outbox_count": 64,
        "dispatch_sent_count": 0
    },
    "credential_references": [
        {
            "id": "urlhaus_auth_key",
            "label": "URLhaus Host API",
            "secret_ref": "SAFERPAGE_URLHAUS_AUTH_KEY",
            "present": false,
            "status": "missing",
            "required_for_go_live": true,
            "purpose": "Malware-/Phishing-Hostabfrage gegen externen Feed.",
            "owner": "IT/Security",
            "rotation_days": 90,
            "storage_location": "server_environment_or_secret_manager",
            "export_policy": "Nur Referenzname und Present/Missing-Status anzeigen; niemals Secret-Werte, Tokens, Webhook-URLs oder Rohpayloads.",
            "operator_action": "SAFERPAGE_URLHAUS_AUTH_KEY serverseitig setzen, PHP-FPM/Worker neu laden und Preflight erneut prüfen."
        },
        {
            "id": "google_safe_browsing_api_key",
            "label": "Google Safe Browsing API",
            "secret_ref": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
            "present": false,
            "status": "missing",
            "required_for_go_live": true,
            "purpose": "Safe-Browsing-Threat-Matches fuer Host/URL-Pruefung.",
            "owner": "IT/Security",
            "rotation_days": 90,
            "storage_location": "server_environment_or_secret_manager",
            "export_policy": "Nur Referenzname und Present/Missing-Status anzeigen; niemals Secret-Werte, Tokens, Webhook-URLs oder Rohpayloads.",
            "operator_action": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen, PHP-FPM/Worker neu laden und Preflight erneut prüfen."
        },
        {
            "id": "webhook_hmac",
            "label": "Webhook-HMAC fuer Delivery",
            "secret_ref": "SAFERPAGE_WEBHOOK_SECRET",
            "present": false,
            "status": "optional_missing",
            "required_for_go_live": false,
            "purpose": "Signierte Alert- und Feed-Delivery an Betreiberzielsysteme.",
            "owner": "IT/Security",
            "rotation_days": 180,
            "storage_location": "server_environment_or_secret_manager",
            "export_policy": "Nur Referenzname und Present/Missing-Status anzeigen; niemals Secret-Werte, Tokens, Webhook-URLs oder Rohpayloads.",
            "operator_action": "SAFERPAGE_WEBHOOK_SECRET serverseitig setzen, PHP-FPM/Worker neu laden und Preflight erneut prüfen."
        },
        {
            "id": "operator_webhook_hmac",
            "label": "Operator-HMAC fuer Delivery",
            "secret_ref": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET",
            "present": false,
            "status": "optional_missing",
            "required_for_go_live": false,
            "purpose": "Alternative Signatur fuer Betreiber-Webhook und Operator-Workflows.",
            "owner": "IT/Security",
            "rotation_days": 180,
            "storage_location": "server_environment_or_secret_manager",
            "export_policy": "Nur Referenzname und Present/Missing-Status anzeigen; niemals Secret-Werte, Tokens, Webhook-URLs oder Rohpayloads.",
            "operator_action": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET serverseitig setzen, PHP-FPM/Worker neu laden und Preflight erneut prüfen."
        },
        {
            "id": "dispatch_enabled_gate",
            "label": "Alert-Dispatch-Freigabe",
            "secret_ref": "SAFERPAGE_ALERT_DISPATCH_APPROVED",
            "present": false,
            "status": "optional_missing",
            "required_for_go_live": false,
            "purpose": "Schreibende Alert-Zustellung erst nach Betreiberfreigabe aktivieren.",
            "owner": "Programm-Owner",
            "rotation_days": 180,
            "storage_location": "server_environment_or_secret_manager",
            "export_policy": "Nur Referenzname und aktiv/inaktiv-Status anzeigen; niemals Secret-Werte, Tokens, Webhook-URLs oder Rohpayloads.",
            "operator_action": "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes erst nach dokumentierter Betreiberfreigabe setzen."
        },
        {
            "id": "storage_approval_gate",
            "label": "Storage-Freigabe",
            "secret_ref": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED",
            "present": false,
            "status": "missing",
            "required_for_go_live": true,
            "purpose": "Speicherung echter Feed-Observations erst nach Retention-/Review-Freigabe.",
            "owner": "Betreiber/Datenschutz",
            "rotation_days": 180,
            "storage_location": "server_environment_or_secret_manager",
            "export_policy": "Nur Referenzname und aktiv/inaktiv-Status anzeigen; niemals Secret-Werte, Tokens, Webhook-URLs oder Rohpayloads.",
            "operator_action": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach dokumentierter Betreiberfreigabe setzen."
        }
    ],
    "preflight_checks": [
        {
            "id": "no_secret_values_exported",
            "label": "Keine Secret-Werte im Export",
            "status": "passed",
            "owner": "Security/Platform",
            "evidence": "Preflight zeigt nur env_ref, present/status, Owner, Zweck und Aktion.",
            "action": "Keine Secret-Werte in Tickets, URLs, Logs, Screenshots oder Public-Exports übernehmen."
        },
        {
            "id": "external_feed_credentials",
            "label": "Produktive Feed-Credentials",
            "status": "blocked",
            "owner": "IT/Security",
            "evidence": "Mindestens eine Feed-Credential-Referenz fehlt.",
            "action": "SAFERPAGE_URLHAUS_AUTH_KEY und SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen."
        },
        {
            "id": "signed_delivery",
            "label": "Signierte Betreiber-Zustellung",
            "status": "blocked",
            "owner": "IT/Security",
            "evidence": "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET fehlt.",
            "action": "Ein Delivery-HMAC setzen oder Zielsystem bewusst als nicht im Scope dokumentieren."
        },
        {
            "id": "storage_approval",
            "label": "Storage-Freigabe",
            "status": "blocked",
            "owner": "Betreiber/Datenschutz",
            "evidence": "Speicherung echter Feed-Observations ist nicht freigegeben.",
            "action": "Retention, Review-Workflow, Publish-Regeln und Loeschpfad freigeben; erst danach Storage-Approval setzen."
        },
        {
            "id": "runner_state",
            "label": "Runner-State abrufbar",
            "status": "passed",
            "owner": "Webbetrieb",
            "evidence": "Security-Feed-Runner: 50 Domain(s) geprüft, 0 aktivierungsbereit, 0 externe Feed-Run(s), 0 Observation(s) gespeichert, 37 durch Gates blockiert, 13 ohne Reportseite, 0 technische Fehler.",
            "action": "Timer und letzten Lauf weiter ueberwachen."
        },
        {
            "id": "activation_ready",
            "label": "Gesamte Aktivierung",
            "status": "blocked",
            "owner": "Programm-Owner",
            "evidence": "anrufer.info: Security-Feed-Aktivierung mit 5 Gate(s), 4 blockiert, Delivery ohne Secret.",
            "action": "Blockierte Gates aus Activation, Launch-Board und Dossier schließen."
        }
    ],
    "external_live_probe": {
        "requested": false,
        "approved_by_env": false,
        "executed": false,
        "status": "not_requested",
        "evidence": "Standard-Preflight aggregiert nur vorhandene Evidence-Pakete und verbraucht keine externen Feed-Quoten.",
        "run_url": "https://saferpage.de/sicherheit/anrufer.info/feed-live-json?run=yes"
    },
    "activation_package": {
        "schema": "https://saferpage.de/schemas/security-feed-activation-package.v1",
        "available": true,
        "environment_file": "/etc/saferpage/security-feed.env",
        "template_url": "https://saferpage.de/sicherheit/feed-activation-template.env",
        "does_not_call_external_feeds": true,
        "does_not_store_observations": true,
        "does_not_include_secret_values": true,
        "env_template": [
            {
                "env_ref": "SAFERPAGE_URLHAUS_AUTH_KEY",
                "example_value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                "required_for_go_live": true,
                "public_export_allowed": false,
                "purpose": "URLhaus Host API Credential fuer Malware-/Phishing-Hostabfragen."
            },
            {
                "env_ref": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
                "example_value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                "required_for_go_live": true,
                "public_export_allowed": false,
                "purpose": "Google Safe Browsing API Key fuer Threat-Matches."
            },
            {
                "env_ref": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED",
                "example_value": "no",
                "required_for_go_live": true,
                "public_export_allowed": false,
                "purpose": "Speicherung echter Feed-Observations erst nach Retention-, Review- und Datenschutzfreigabe."
            },
            {
                "env_ref": "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED",
                "example_value": "no",
                "required_for_go_live": false,
                "public_export_allowed": false,
                "purpose": "Kurzlebiges Guard-Flag fuer explizit angeforderte externe Einzelprobe."
            },
            {
                "env_ref": "SAFERPAGE_WEBHOOK_SECRET",
                "example_value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                "required_for_go_live": false,
                "public_export_allowed": false,
                "purpose": "HMAC-Secret fuer signierte Betreiber-Webhook-Delivery."
            },
            {
                "env_ref": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET",
                "example_value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                "required_for_go_live": false,
                "public_export_allowed": false,
                "purpose": "Alternatives HMAC-Secret fuer Operator-Workflows."
            }
        ],
        "approval_record_template": [
            "approver_role",
            "approved_at",
            "scope",
            "feed_sources",
            "storage_retention_decision",
            "review_workflow_owner",
            "preflight_urls",
            "dry_run_result_refs",
            "canary_result_ref",
            "rollback_owner",
            "expires_or_review_at"
        ],
        "smoke_matrix": [
            {
                "id": "dry_run_no_external_feed",
                "command": "scripts/run-security-feed-dry-run-smoke.sh",
                "expected": "executed_count=0 und stored_observation_count=0."
            },
            {
                "id": "storage_preflight",
                "command": "scripts/run-security-feed-storage-preflight.sh",
                "expected": "missing_required_artifacts ist leer, bevor Storage-Approval gesetzt wird."
            },
            {
                "id": "storage_canary",
                "command": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes python3 scripts/run-security-feed-schedule.py anrufer.info --base-url http://127.0.0.1 --max 1 --timeout 15 --storage-canary",
                "expected": "Genau eine synthetische private Canary-Observation; keine externen Feed-Abfragen."
            },
            {
                "id": "guarded_live_probe",
                "command": "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED=yes curl -fsS \"https://saferpage.de/sicherheit/anrufer.info/feed-live-json?run=yes\"",
                "expected": "Einzelprobe nur explizit, ohne Secret-Ausgabe und ohne automatische Speicherung."
            },
            {
                "id": "launch_board",
                "command": "curl -fsS https://saferpage.de/sicherheit/feed-launch-board-json",
                "expected": "blocked_gate_count=0 erst nach Credentials, Storage, Delivery und Runner-Gates."
            }
        ],
        "acceptance_criteria": [
            "Feed-Credentials sind als present=true sichtbar, ohne Secret-Werte auszugeben.",
            "Storage-Artefakte sind migriert und Storage-Readiness zeigt Tabellen, Indizes und Trigger ready.",
            "Retention-, Review-, Publish- und Loeschregeln sind im Approval-Dossier freigegeben.",
            "Storage-Canary wurde vor echten Feed-Treffern erfolgreich ausgefuehrt.",
            "Live-Probe und Runner-State zeigen keine Feed-Rohpayloads, Malware-Samples, Ziel-URLs oder personenbezogenen Logs."
        ],
        "stop_conditions": [
            "Secret-Wert, API-Key, Feed-Rohpayload, Malware-Sample oder personenbezogene Logzeile erscheint in Public-State, Logs oder Exporten.",
            "Externe Feed-Abfrage laeuft ohne SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED=yes oder ohne expliziten Run-Auftrag.",
            "stored_observation_count steigt, bevor Storage-Freigabe und Review-/Retention-Entscheidung dokumentiert sind.",
            "Launch-Board zeigt Runner-Fehler, blockierte Gates oder unerklaerte externe Ausfuehrungen."
        ],
        "no_secret_policy": "Dieses Paket exportiert nur Env-Referenzen, Placeholder, Smoke-Kommandos und Abnahmekriterien; keine echten Feed-Keys, Tokens, URLs, Rohpayloads oder personenbezogenen Logs."
    },
    "blocked_actions": [
        {
            "id": "external_feed_credentials",
            "owner": "IT/Security",
            "action": "SAFERPAGE_URLHAUS_AUTH_KEY und SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen.",
            "evidence": "Mindestens eine Feed-Credential-Referenz fehlt."
        },
        {
            "id": "signed_delivery",
            "owner": "IT/Security",
            "action": "Ein Delivery-HMAC setzen oder Zielsystem bewusst als nicht im Scope dokumentieren.",
            "evidence": "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET fehlt."
        },
        {
            "id": "storage_approval",
            "owner": "Betreiber/Datenschutz",
            "action": "Retention, Review-Workflow, Publish-Regeln und Loeschpfad freigeben; erst danach Storage-Approval setzen.",
            "evidence": "Speicherung echter Feed-Observations ist nicht freigegeben."
        },
        {
            "id": "activation_ready",
            "owner": "Programm-Owner",
            "action": "Blockierte Gates aus Activation, Launch-Board und Dossier schließen.",
            "evidence": "anrufer.info: Security-Feed-Aktivierung mit 5 Gate(s), 4 blockiert, Delivery ohne Secret."
        }
    ],
    "operator_sequence": [
        "Secrets in /etc/saferpage/security-feed.env oder Secret Manager setzen; keine Werte in Git, Tickets oder URLs ablegen.",
        "PHP-FPM/API, Screenshot-/Feed-Worker und systemd Units neu laden.",
        "Credential-Preflight und feed-secrets-json prüfen, bis nur bewusst optionale Referenzen fehlen.",
        "Optionalen Einzeltest erst mit SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED=yes und ?run=yes ausfuehren.",
        "Storage-Freigabe nach Retention-/Review-Entscheidung setzen und Launch-Board erneut pruefen.",
        "Alert-Dispatch-Zielsysteme mit signiertem Dry-Run testen, bevor echte Zustellung aktiviert wird."
    ],
    "setup_commands": {
        "env_file_hint": "/etc/saferpage/security-feed.env",
        "reload": [
            "systemctl daemon-reload",
            "systemctl restart php8.3-fpm",
            "systemctl restart saferpage-security-feed.service",
            "systemctl restart saferpage-alert-dispatch.service"
        ],
        "preflight": [
            "curl -fsS https://saferpage.de/sicherheit/feed-credential-preflight-json?host=anrufer.info | python3 -m json.tool",
            "curl -fsS https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json | python3 -m json.tool",
            "curl -fsS https://saferpage.de/sicherheit/feed-launch-board-json?host=anrufer.info | python3 -m json.tool"
        ],
        "external_probe_guarded": [
            "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED=yes curl -fsS \"https://saferpage.de/sicherheit/feed-credential-preflight-json?host=anrufer.info&run=yes\" | python3 -m json.tool"
        ]
    },
    "source_packages": {
        "secrets": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json",
        "activation": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
        "storage_readiness": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
        "runner_state": "https://saferpage.de/sicherheit/feed-runner-json",
        "alert_dispatch_runner": "https://saferpage.de/alarme/dispatch-runner-json"
    },
    "links": {
        "html": "https://saferpage.de/sicherheit/feed-credential-preflight",
        "json": "https://saferpage.de/sicherheit/feed-credential-preflight-json?host=anrufer.info",
        "csv": "https://saferpage.de/sicherheit/feed-credential-preflight-csv?host=anrufer.info",
        "markdown": "https://saferpage.de/sicherheit/feed-credential-preflight-md?host=anrufer.info",
        "feed_secrets": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json",
        "feed_live_run": "https://saferpage.de/sicherheit/anrufer.info/feed-live-json?run=yes",
        "feed_activation": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
        "launch_board": "https://saferpage.de/sicherheit/feed-launch-board-json?host=anrufer.info",
        "approval_dossier": "https://saferpage.de/sicherheit/feed-approval-dossier-json?host=anrufer.info",
        "alert_dispatch_runner": "https://saferpage.de/alarme/dispatch-runner-json",
        "schema": "https://saferpage.de/schemas/security-feed-credential-preflight.v1",
        "activation_template_env": "https://saferpage.de/sicherheit/feed-activation-template.env"
    },
    "disclaimer": "Credential-Preflight zeigt keine Secret-Werte, ruft im Standard keine externen Feeds auf und ersetzt keine menschliche Betreiberfreigabe."
}
