{
    "schema": "https://saferpage.de/schemas/security-feed-secrets.v1",
    "generated_at": "2026-06-09T22:32:57+00:00",
    "domain": "junger.adfc.de",
    "available": true,
    "ready_for_activation": false,
    "summary": "junger.adfc.de: Security-Feed-Secrets mit 4 Secret-Referenz(en), 0 konfiguriert, 4 fehlend.",
    "metrics": {
        "secret_requirement_count": 4,
        "configured_secret_count": 0,
        "missing_secret_count": 4,
        "feed_connector_secret_count": 2,
        "signature_secret_count": 2
    },
    "secret_requirements": [
        {
            "id": "urlhaus_host",
            "label": "URLhaus Host API",
            "secret_ref": "SAFERPAGE_URLHAUS_AUTH_KEY",
            "present": false,
            "status": "missing",
            "scope": "POST https://urlhaus-api.abuse.ch/v1/host/",
            "rotation_days": 90,
            "storage_location": "server_environment_or_secret_manager",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-live-json?run=yes",
            "export_policy": "Nur secret_ref und present/status anzeigen; niemals Secret-Werte.",
            "operator_action": "SAFERPAGE_URLHAUS_AUTH_KEY serverseitig setzen und API/FPM/Worker neu laden."
        },
        {
            "id": "google_safe_browsing",
            "label": "Google Safe Browsing threatMatches.find",
            "secret_ref": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
            "present": false,
            "status": "missing",
            "scope": "POST https://safebrowsing.googleapis.com/v4/threatMatches:find",
            "rotation_days": 90,
            "storage_location": "server_environment_or_secret_manager",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-live-json?run=yes",
            "export_policy": "Nur secret_ref und present/status anzeigen; niemals Secret-Werte.",
            "operator_action": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen und API/FPM/Worker neu laden."
        },
        {
            "id": "webhook_hmac",
            "label": "Webhook-/Delivery-Signatur",
            "secret_ref": "SAFERPAGE_WEBHOOK_SECRET",
            "present": false,
            "status": "missing",
            "scope": "signed delivery preview and webhook verification",
            "rotation_days": 180,
            "storage_location": "server_environment_or_secret_manager",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-activation-json",
            "export_policy": "Nur secret_ref und present/status anzeigen; niemals Secret-Werte.",
            "operator_action": "SAFERPAGE_WEBHOOK_SECRET serverseitig setzen oder bewusst als nicht genutzt dokumentieren."
        },
        {
            "id": "operator_webhook_hmac",
            "label": "Operator Webhook Signatur",
            "secret_ref": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET",
            "present": false,
            "status": "missing",
            "scope": "signed delivery preview and webhook verification",
            "rotation_days": 180,
            "storage_location": "server_environment_or_secret_manager",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-activation-json",
            "export_policy": "Nur secret_ref und present/status anzeigen; niemals Secret-Werte.",
            "operator_action": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET serverseitig setzen oder bewusst als nicht genutzt dokumentieren."
        }
    ],
    "setup_templates": {
        "env_file": {
            "path_hint": "/etc/saferpage/security-feed.env",
            "content": "# SaferPage Security Feed secrets template\n# Werte nur serverseitig setzen. Diese Vorlage enthaelt keine echten Secrets.\nSAFERPAGE_URLHAUS_AUTH_KEY=__SET_IN_SECRET_MANAGER__\nSAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY=__SET_IN_SECRET_MANAGER__\nSAFERPAGE_WEBHOOK_SECRET=__SET_IN_SECRET_MANAGER__\nSAFERPAGE_OPERATOR_WEBHOOK_SECRET=__SET_IN_SECRET_MANAGER__\nSAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=__SET_TO_yes_ONLY_AFTER_OPERATOR_APPROVAL__\n",
            "never_commit": true,
            "contains_real_secret_values": false
        },
        "systemd_drop_in": {
            "path_hint": "/etc/systemd/system/saferpage-security-feed.service.d/secrets.conf",
            "content": "[Service]\n# Datei z.B. /etc/systemd/system/saferpage-security-feed.service.d/secrets.conf\n# Danach: systemctl daemon-reload && systemctl restart saferpage-security-feed.service\nEnvironment=\"SAFERPAGE_URLHAUS_AUTH_KEY=__SET_IN_SECRET_MANAGER__\"\nEnvironment=\"SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY=__SET_IN_SECRET_MANAGER__\"\nEnvironment=\"SAFERPAGE_WEBHOOK_SECRET=__SET_IN_SECRET_MANAGER__\"\nEnvironment=\"SAFERPAGE_OPERATOR_WEBHOOK_SECRET=__SET_IN_SECRET_MANAGER__\"\nEnvironment=\"SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=__SET_TO_yes_ONLY_AFTER_OPERATOR_APPROVAL__\"\n",
            "reload_commands": [
                "systemctl daemon-reload",
                "systemctl restart saferpage-security-feed.service",
                "systemctl status saferpage-security-feed.service --no-pager"
            ],
            "contains_real_secret_values": false
        },
        "preflight_commands": [
            "systemctl show saferpage-security-feed.service -p Environment --no-pager | sed \"s/=.*/=***REDACTED***/g\"",
            "curl -fsS https://saferpage.de/sicherheit/junger.adfc.de/feed-secrets-json | python3 -m json.tool",
            "curl -fsS https://saferpage.de/sicherheit/junger.adfc.de/feed-activation-json | python3 -m json.tool"
        ],
        "go_live_sequence": [
            "Secrets im Secret Manager oder systemd Drop-in setzen.",
            "PHP-FPM/API/Worker und saferpage-security-feed.service neu laden.",
            "feed-secrets-json pruefen: fehlende Secret-Referenzen muessen geschlossen oder bewusst aus Scope entfernt sein.",
            "alerts-delivery-json mit Test-Fixture und danach mit echtem HMAC-Secret gegen das Zielsystem pruefen.",
            "Storage-Freigabe erst nach Go/No-Go-Dossier aktivieren."
        ]
    },
    "rotation_calendar": [
        {
            "secret_ref": "SAFERPAGE_URLHAUS_AUTH_KEY",
            "owner": "Security/Platform",
            "rotation_days": 90,
            "next_rotation_due_at": "2026-09-07T22:32:57+00:00",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-live-json?run=yes",
            "status": "set_before_go_live"
        },
        {
            "secret_ref": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
            "owner": "Security/Platform",
            "rotation_days": 90,
            "next_rotation_due_at": "2026-09-07T22:32:57+00:00",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-live-json?run=yes",
            "status": "set_before_go_live"
        },
        {
            "secret_ref": "SAFERPAGE_WEBHOOK_SECRET",
            "owner": "IT/Security",
            "rotation_days": 180,
            "next_rotation_due_at": "2026-12-06T22:32:57+00:00",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-activation-json",
            "status": "set_before_go_live"
        },
        {
            "secret_ref": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET",
            "owner": "IT/Security",
            "rotation_days": 180,
            "next_rotation_due_at": "2026-12-06T22:32:57+00:00",
            "validation_url": "https://saferpage.de/sicherheit/junger.adfc.de/feed-activation-json",
            "status": "set_before_go_live"
        }
    ],
    "preflight_checks": [
        {
            "id": "no_secret_values_exported",
            "label": "Keine Secret-Werte im Export",
            "status": "passed",
            "evidence": "Export enthält nur Referenznamen, Status und Operator-Aktion."
        },
        {
            "id": "feed_connector_secrets",
            "label": "Feed-Connector-Secrets vorhanden",
            "status": "missing",
            "evidence": "0/2 Feed-Connector(en) konfiguriert."
        },
        {
            "id": "delivery_signature_secret",
            "label": "Delivery-Signatursecret vorhanden",
            "status": "missing",
            "evidence": "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET fehlt."
        },
        {
            "id": "rotation_policy",
            "label": "Rotation definiert",
            "status": "passed",
            "evidence": "Feed-Secrets 90 Tage, Delivery-Signaturen 180 Tage."
        }
    ],
    "rotation_runbook": [
        "Neues Secret im Secret Manager oder Server-Environment setzen.",
        "API/FPM/Worker neu laden und feed-live-json?run=yes als Einzeltest ausführen.",
        "Altes Secret erst nach erfolgreichem Dry-Run und Delivery-Signaturtest entfernen.",
        "Rotation mit Datum, Owner, Ticket und betroffenen Connectoren dokumentieren."
    ],
    "links": {
        "json": "https://saferpage.de/sicherheit/junger.adfc.de/feed-secrets-json",
        "csv": "https://saferpage.de/sicherheit/junger.adfc.de/feed-secrets-csv",
        "markdown": "https://saferpage.de/sicherheit/junger.adfc.de/feed-secrets-md",
        "activation": "https://saferpage.de/sicherheit/junger.adfc.de/feed-activation-json",
        "live_run": "https://saferpage.de/sicherheit/junger.adfc.de/feed-live-json?run=yes",
        "integration_setup": "https://saferpage.de/integrationen/setup-json"
    },
    "disclaimer": "Dieses Paket zeigt Secret-Readiness und Rotation. Es gibt keine Secret-Werte aus und setzt keine Secrets."
}
