Security-Feed-Storage

Schreibpfad erst nach Tabellen, Triggern und Freigabe

Security-Feed-Storage ist noch nicht schreibbereit: 0 Datenbank-Artefakt(e) fehlen oder die Serverfreigabe ist nicht aktiv.

Readiness zeigt technische Schreibbereitschaft und Betreiberfreigabe. Es veröffentlicht keine Secrets, keine Feed-Rohdaten und keine personenbezogenen Logs.

blockedWrite Gate 3/3Tabellen 6/6Indizes 2/2Trigger 0/11Artefakte offenServerfreigabe 0fehlend 6Quellen 6Review 5False Positive 5Claims 5Retention 4SLO

Feed-Verantwortungs-Handoff

Storage, Feed-Credentials und öffentliche Claims sauber trennen

Security-Feed-Handoff für DB-Verantwortung und Security Ops: Storage-Migration, Credential-Referenzen, Canary und Produktclaims werden no-secret getrennt.

waiting_for_db_owner_and_operator_approvalStatus 6Schritte 6private Inputs 7öffentliche Outputs 8verbotene Outputs 5Validierungsqueries 7Evidence-Links
Storage-SQL-Hash prüfen DB-Verantwortung

SHA-256 der öffentlichen Migration mit der lokal angewendeten Datei vergleichen.

Abnahme: Hash stimmt und SQL enthält keine Credential-, Webhook- oder Rohpayload-Werte. Grenze: Hash beweist Dateigleichheit, nicht erfolgreiche Speicherung.
Evidence
Storage-Artefakte mit DB-Verantwortung anwenden DB-Verantwortung/Platform

Tabellen, Indizes und Trigger aus sicherer Shell anwenden und Preflight danach neu erzeugen.

Abnahme: Tabellen 3/3, Indizes 6/6, Trigger 2/2 sind ready. Grenze: Admin-DSN und DB-Host bleiben privat.
Evidence
Retention/DSFA freigeben Datenschutz/Legal

Zweck, Datenminimierung, TTLs, Audit und Löschbarkeit vor Storage-Approval dokumentieren.

Abnahme: Clean/Inconclusive/Hit-Retention und DPIA-Review sind freigegeben. Grenze: Öffentlich erscheinen nur Policy-Zusammenfassung und Status, keine internen Datenschutzakten.
Evidence
Synthetischen Storage-Canary ausführen Security Ops

Erst blockierten Canary testen, danach mit Storage-Approval genau eine private Observation schreiben.

Abnahme: Canary speichert publish_decision=not_public und löst keinen Alert/Badge/öffentlichen Treffer aus. Grenze: Canary ersetzt keine echten Feed-Credentials und ist kein Malwaretreffer.
Evidence
Feed-Credential-Referenzen privat setzen Security Ops

URLhaus- und Safe-Browsing-Keys nur als Server-Env oder Secret-Manager-Refs setzen; Rotation dokumentieren.

Abnahme: Credential-Preflight zeigt Present-Status ohne Werte; Live-Probe bleibt gated. Grenze: Public Evidence zeigt nie Feed-Key, Token, Quota-Header oder Rohantwort.
Evidence
Externe Runs erst nach Go-live aktivieren Operator/Security

Execute-ready, Storage-Approval, Alert-Routing und Stop-Bedingungen im Go-live-Center abnehmen.

Abnahme: Security-Feed-Smoke bleibt grün; offene Produktiv-Gates werden nicht als live behauptet. Grenze: Ohne Credentials/Freigabe keine Behauptung laufender täglicher Feeds.
Evidence
Private Inputs

Kurzlebiger Admin-DSN

Nie öffentlich ausgeben; nur Status und SQL-Hash zeigen.

URLhaus-Key-Referenz

Nur present/missing und Rotationsstatus exportieren.

Google-Safe-Browsing-Key-Referenz

Keine Key-Werte, Quota-Header oder API-Rohantworten exportieren.

Storage-Approval-Entscheidung

Nur Freigabestatus und Entscheidungsklasse zeigen.

Alert-Routing-Zielsysteme

Keine Webhook-URLs, Empfänger oder Kundenzielsysteme exportieren.

Rollback-/Pause-Verantwortlichkeit

Nur Rollenname und Stop-Bedingungen öffentlich zeigen.
Öffentlich erlaubte Outputs

Migration-SHA-256

DB-Verantwortung kann die Datei vor Apply prüfen.

Tabellen-/Index-/Trigger-Zähler

Storage-Fortschritt ist ohne Dateninhalt sichtbar.

Credential-Present/Missing-Flags

Go-live-Status bleibt prüfbar, ohne Secrets zu zeigen.

Canary-Receipt-Status

Synthetischer privater Schreibtest ist nachvollziehbar.

Review-/Retention-Policy

Betreiber verstehen Grenzen und Löschregeln.

Smoke-Status und Zähler

Produktreife ist maschinenlesbar, ohne private Details zu leaken.

SaferPage-Evidence-URLs

Abnahme kann verlinkt werden.
Verbotene Outputs

Admin-DSN, DB-Host, Port, Passwort oder interner DB-Username

URLhaus-, Safe-Browsing- oder sonstige Feed-Keys

Feed-Rohantworten, Malware-Samples, Page Dumps oder DOM-Snapshots aus externen Feeds

Webhook-, Slack-, Teams-, Jira- oder E-Mail-Zieladressen

Authorization-Header, Bearer-Token, HMAC-Secrets oder echte Signaturen

Besucherlogs, IP-Adressen, personenbezogene Requestdetails oder Kundendokumente

Private Betreiberentscheidung mit Personennamen oder internen Ticket-URLs

Öffentliche Behauptung eines echten Feed-Treffers ohne Reviewstatus und Betreiberkontext

Sanitisierte Validierungsqueries
select coalesce(to_regclass('public.security_feed_observations')::text, 'missing');
select coalesce(to_regclass('public.security_feed_alert_links')::text, 'missing');
select coalesce(to_regclass('public.security_feed_audit_log')::text, 'missing');
select count(*) from pg_indexes where schemaname = 'public' and indexname like 'security_feed_%';
select tgname from pg_trigger where tgname in ('security_feed_observations_set_updated_at', 'security_feed_alert_links_set_updated_at');
Handoff-Abnahme

Storage-Artefakte sind mit DB-Verantwortung angewendet und Preflight zeigt keine fehlenden Pflichtartefakte.

Storage-Approval ist erst nach Retention/DPIA und Canary-Freigabe aktiv.

Credential-Preflight zeigt nur Referenzstatus, keine Feed-Key-Werte.

Synthetischer Canary bleibt privat und erzeugt keine öffentliche Warnung.

Dry-run ruft keine externen Feeds auf und speichert keine echten Observations.

Go-live-Center nennt Stop-Bedingungen, Rollback-Verantwortlichkeit und Nachlaufbeobachtung.

Öffentliche Claims sagen vorbereitet/no-secret belegbar, aber nicht produktiv live ohne Credentials und Freigabe.

Preflight-Artefakte

DB-Artefakte für Feed-Storage transparent prüfen

Evidence JSON
Erforderlich11 Bereit0 Fehlend11 Admin-DSNnicht erforderlich
Feed-Observations-Tabelle missing · Pflicht für Storage

Private Malware-/Blacklist-/DAST-Observations mit Hash, Verdict, Review- und Publish-Status.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Alert-Link-Tabelle missing · Pflicht für Storage

Verknuepft private Feed-Observations mit Alerts/Nachweispositionen ohne Rohpayload-Export.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Feed-Auditlog missing · Pflicht für Storage

Append-only Review-, Publish-, Suppress- und Delete-Entscheidungen.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Domain/Checked-Index missing · Pflicht für Storage

Schneller Zugriff auf letzte Feed-Checks pro Domain.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Source/Verdict-Index missing · Pflicht für Storage

Auswertung nach Feed-Quelle und Verdict.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Retention-Index missing · Pflicht für Storage

Lösch- und Ablaufjobs finden fällige Observations.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Result-Meta-GIN-Index missing · Pflicht für Storage

Sanitisierte Metadaten bleiben filterbar.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Alert-Dedupe-Index missing · Pflicht für Storage

Verhindert doppelte Alert-Verknuepfungen.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Audit-Dedupe-Index missing · Pflicht für Storage

Audit-Events können pro Dedupe-Key nachvollzogen werden.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Observations-updated_at-Trigger missing · Pflicht für Storage

Änderungen setzen updated_at automatisch.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.
Alert-Link-updated_at-Trigger missing · Pflicht für Storage

Änderungen setzen updated_at automatisch.

infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.

Storage Canary

Synthetischer Schreibtest ohne externe Feed-Abfrage

Security-Feed-Storage-Canary ist definiert, aber noch nicht erfolgreich gespeichert oder durch Freigabe-Gates blockiert.

not_run_yetStatus neinReady offenStorage-Freigabe 0Canary gespeichert 0externe Speicherungen
security_feed_observations

Eine upsertbare synthetische Observation mit source_id=security_feed_storage_canary, verdict=inconclusive, publish_decision=not_public.

security_feed_audit_log

Ein Auditlog-Eintrag runner_observation_upsert mit after_hash über die normalisierten Metadaten.

security_feed_alert_links

Kein Alert-Link und kein Ticket, weil der Canary kein echter Treffer ist.

dedupe

Dedupe-Key aus Domain, Source, matched_url und reference_id verhindert doppelte Tages-Observations.

retention

Inconclusive-Canary läuft nach 14 Tagen ab, sofern er nicht durch den nächsten Canary-Lauf aktualisiert wird.

Operator-Kommando

Schreibt nur bei aktiver Serverfreigabe eine private synthetische Observation.

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
systemd Canary

saferpage-security-feed-canary.service läuft über saferpage-security-feed-canary.timer, ohne --execute-ready.

04:15-04:35 Europe/Berlin plus RandomizedDelaySec 20min · Env: /etc/saferpage/security-feed.env

Datenbank

Tabellen, Indizes und Trigger

Storage-Vertrag
security_feed_observations Tabelle · ready

Normalisierte Momentaufnahmen aus externen Malware-/Blacklist-/DAST-Feeds.

Vorhanden
ja
Zeilen
0
security_feed_alert_links Tabelle · ready

Verknuepfung gespeicherter Feed-Beobachtungen mit Alert, Nachweisposition, Verantwortlichkeit, Zielzeit und Reviewstatus.

Vorhanden
ja
Zeilen
0
security_feed_audit_log Tabelle · ready

Auditlog für Import, Review, Freigabe, Löschung und Re-Scan.

Vorhanden
ja
Zeilen
0
security_feed_observations_domain_checked_idx Index · ready

Vorhanden
ja
security_feed_observations_source_verdict_idx Index · ready

Vorhanden
ja
security_feed_observations_expires_idx Index · ready

Vorhanden
ja
security_feed_observations_result_meta_gin_idx Index · ready

Vorhanden
ja
security_feed_alert_links_dedupe_idx Index · ready

Vorhanden
ja
security_feed_audit_log_dedupe_idx Index · ready

Vorhanden
ja
security_feed_observations_set_updated_at Trigger · ready

security_feed_observations

Vorhanden
ja
security_feed_alert_links_set_updated_at Trigger · ready

security_feed_alert_links

Vorhanden
ja

Migration

Dedizierte SQL-Datei für die DB-Verantwortung

Diese Migration erzeugt nur die Security-Feed-Storage-Artefakte. Sie aktiviert keine externen Feed-Runs und keine Speicherung ohne Serverfreigabe.

Versionsecurity-feed-storage-2026-06-09 SHA-256bcaa177b61f0c9ea578e80abcdb8fa2af9c0615fd197f153b7367161603e9453 Bytes3885 Secretsnicht erforderlich
curl -fsS https://saferpage.de/sicherheit/feed-storage-migration.sql -o /tmp/saferpage-security-feed-storage.sql && psql -d saferpage -v ON_ERROR_STOP=1 -f /tmp/saferpage-security-feed-storage.sql

Runbook

Aktivierung nur kontrolliert

Markdown
Schritt

Dedizierte Migration mit autorisierter DB-Verantwortung anwenden: psql -d saferpage -v ON_ERROR_STOP=1 -f infra/postgres/migrations/security-feed-storage.sql

Schritt

Danach Readiness erneut prüfen und Tabellen/Indizes/Trigger als ready bestätigen.

Schritt

SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach Betreiberfreigabe, Retention-Review und Alert-Routing setzen.

Schritt

Optionalen Storage-Canary mit --storage-canary ausführen, um eine synthetische private Observation ohne externe Feed-Abfrage zu testen.

Schritt

Separaten systemd-Canary-Timer prüfen: systemctl list-timers saferpage-security-feed-canary.timer --no-pager.

Schritt

Ersten Runner-Lauf kontrollieren: stored_observation_count muss zu den aktivierungsbereiten Domains passen.

DB-Verantwortungs-Paket

Migration, Smoke-Test und Freigabereihenfolge

Übergabe exportieren
Rolle

PostgreSQL-Rolle mit Besitz- oder Adminrechten sowie CREATE TABLE, CREATE INDEX, CREATE TRIGGER im Schema public.

Migration psql -d saferpage -v ON_ERROR_STOP=1 -f infra/postgres/migrations/security-feed-storage.sql

Die Migration legt nur Tabellen, Indizes und Trigger an. Secret-Werte und Feed-Rohdaten werden dabei nicht benötigt.

Preflight

psql -d saferpage -Atq -c "select current_database(), current_user;"

psql -d saferpage -Atq -c "select coalesce(to_regclass('public.security_feed_observations')::text,'missing');"

Smoke-Test

psql -d saferpage -Atq -c "select to_regclass('public.security_feed_observations') is not null, to_regclass('public.security_feed_alert_links') is not null, to_regclass('public.security_feed_audit_log') is not null;"

psql -d saferpage -Atq -c "select count(*) from pg_trigger where tgname in ('security_feed_observations_set_updated_at','security_feed_alert_links_set_updated_at');"

curl -fsS https://saferpage.de/sicherheit/feed-storage-readiness-json | python3 -m json.tool

Aktivierung

DDL-Migration anwenden.

Readiness-Endpunkt prüfen: Tabellen, Indizes und Trigger müssen ready sein.

Feed- und Delivery-Secrets serverseitig setzen und PHP/Runner neu laden.

Canary-Timer installieren/aktivieren und zuerst ohne Storage-Freigabe blockiertes Verhalten prüfen.

SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach Betreiberfreigabe setzen.

Pause/Rollback

Sofortige Pause ohne DDL-Rollback: SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED entfernen und Runner neu laden.

Bei fehlerhaften Observations: review_status=suppressed setzen statt Rohdaten zu löschen, sofern Auditpflicht besteht.

DDL-Drop nur nach Retention-/Audit-Entscheidung und Backupfreigabe ausführen.

Abnahme

Readiness zeigt required_table_count=3 und ready_table_count=3.

Readiness zeigt required_index_count=6 und ready_index_count=6.

Readiness zeigt required_trigger_count=2 und ready_trigger_count=2.

Storage-Freigabe ist nur nach dokumentierter Betreiberentscheidung aktiv.

Runner-State zeigt keine Secret-Werte und keine Feed-Rohpayloads.

Evidence Receipt

Migration nur mit Signoff, Rollback-Probe und Canary

Dieser Block ist die Betreiber-/DBA-Übergabe für einen produktionsnahen Security-Feed-Storage-Go-live. Er dokumentiert Freigaben und Testreihenfolge, ohne DSN, Passwörter, Feed-Rohpayloads oder Empfänger offenzulegen.

Receipt exportieren
6Signoff-Punkte 5Rollback-Schritte 6Canary-Schritte
Signoff

DB-Admin-Verantwortung bestätigt · ready_or_not_required

Preflight zeigt current_database/current_user nur redigiert; Admin-DSN bleibt in sicherer Shell.

DDL-Hash festgehalten · ready

bcaa177b61f0c9ea578e80abcdb8fa2af9c0615fd197f153b7367161603e9453

Preflight vor und nach Migration · ready

https://saferpage.de/evidence/security-feed-storage-preflight.json

Retention- und Löschregel freigegeben · required_before_approval

Clean 30 Tage, Treffer/Audit 365 Tage, inconclusive 14 Tage; keine Rohpayloads.

Storage-Approval bewusst gesetzt · blocked_expected

SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach DDL, Retention, Canary und Routing.

Synthetischer Canary-Receipt erzeugt · blocked_until_storage_ready

https://saferpage.de/sicherheit/feed-storage-canary-json
Rollback-Probe

Approval entfernen

SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED entfernen und PHP/Runner neu laden.

Timer pausieren

Feed-Runner- und Canary-Timer stoppen, bevor weitere Observations entstehen.

Audit bewahren

Bestehende security_feed_audit_log-Zeilen nicht löschen; Entscheidungen weiter nachvollziehbar halten.

Suppress statt Hard Delete

Fehlerhafte Observations zunächst review_status=suppressed setzen.

DDL-Drop nur mit Freigabe

Tabellen nur nach Backup-, Retention- und Legal-Freigabe entfernen.
Post-Migration-Canary

Preflight grün

scripts/run-security-feed-storage-preflight.sh

Readiness prüfen

curl -fsS https://saferpage.de/sicherheit/feed-storage-readiness-json

Approval bewusst setzen

SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes nur serverseitig setzen

Canary blockiert testen

python3 scripts/run-security-feed-schedule.py anrufer.info --storage-canary --dry-run

Canary schreiben

python3 scripts/run-security-feed-schedule.py anrufer.info --storage-canary --execute

Runner nachziehen

curl -fsS https://saferpage.de/sicherheit/feed-runner-json

Threat Feed Operations

Quellenqualität, Review und öffentliche Claim-Grenzen

Dieses Paket trennt echte Feed-Treffer, synthetische Canaries, False Positives und öffentliche Aussagen. Es veröffentlicht keine Feed-Rohantworten, personenbezogenen Logs, Secret-Werte oder Malware-Samples.

Operations exportieren
6Quellenqualität 6Review-Schritte 5False-Positive 5Claim-Regeln 5Retention/DPIA 4Eskalations-SLO
Quellenqualität

URLhaus

Credential present, HTTP 200, schema parseable, timestamp fresh.

Google Safe Browsing

API-Key present, match response normalized, quota/backoff tracked.

Security Headers

Header-Evidence aus passivem Scan und Retry bei Transportfehlern.

TLS/HSTS

Zertifikat, HSTS und Redirect-Ziel getrennt prüfen.

DAST Passive

Nur passive Requests; keine Angriffs- oder Login-Tests.

Synthetic Canary

source_id=security_feed_storage_canary, publish_decision=not_public.
Observation Review

Observation normalisieren

dedupe_key, source_id, severity, reference_id und publish_decision setzen.

Treffer kontextualisieren

Domain, Ziel-URL-Hash, Zeitpunkt, Quelle und Wiederholung prüfen.

False Positive prüfen

Quelle, Redirect, CDN, historische URL und Betreiberfeedback abgleichen.

Betreiberaktion ableiten

Fix-Guide, Re-Scan, Monitoring oder Suppression wählen.

Publish-Grenze entscheiden

Öffentlich nur Reviewstatus, Schweregrad und sanitisierte Evidence zeigen.

Audit und Retention setzen

after_hash, reason, expires_at und review_status auditieren.
False-Positive-Playbook

Quelle erneut prüfen

Re-Check mit derselben Quelle und zweiter passiver Evidence durchführen.

Redirect-/CDN-Kontext prüfen

Final URL, Host, Pfad-Hash und Zeitpunkt getrennt dokumentieren.

Temporär unterdrücken

review_status=suppressed_pending_review, öffentlich keine Warnung anzeigen.

Betreiber-Receipt erzeugen

Receipt mit Request-ID, Quelle, Zeitpunkt und Entscheidung speichern.

Reopen-Bedingung setzen

Suppression aufheben und Review erneut starten.
Öffentliche Claim-Regeln

Kein Zertifikat "malwarefrei"

Clean bedeutet nur: im passiven Prüfumfang kein aktiver Feed-Treffer.

Keine Rechts- oder Compliance-Freigabe

Security-Feeds liefern technische Signale, keine abschließende rechtliche Bewertung.

Warnungen erst nach Review

Öffentliche Badges/Reports zeigen kritische Feed-Treffer erst nach Betreiber- oder Security-Review.

Quelle und Zeitpunkt nennen

Jeder veröffentlichte Feed-Befund braucht source_id, checked_at und Reviewstatus.

Keine Rohpayloads

Keine Feed-Rohantworten, IPs, Secret-Werte, Besucherlogs oder personenbezogene Daten veröffentlichen.
Retention/DPIA

Clean TTL

Clean-Momentaufnahmen maximal 30 Tage speichern.

Inconclusive TTL

Unklare oder synthetische Canary-Observations nach 14 Tagen erneuern oder löschen.

Treffer-Audit

Review- und Entscheidungsnachweise bis 365 Tage halten, danach Retention-Review.

Datenminimierung

Nur Hashes, Referenz-IDs und sanitisierte Metadaten speichern.

DPIA/DSFA-Review

Neue Feed-Quellen vor produktiver Speicherung auf Zweck, Datenarten, Drittland und Löschbarkeit prüfen.
Eskalations-SLO

critical_confirmed_feed_hit

Betreiber informieren, öffentliche Claim-Grenze prüfen, Re-Scan planen.

high_unreviewed_feed_hit

Quelle, Referenz und False-Positive-Risiko prüfen.

medium_storage_or_parse_issue

Parser, Storage, Backoff und Runner-State prüfen.

low_canary_or_freshness_issue

Canary, Timer und Quellenfrische nachziehen.