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.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.
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.
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.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.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.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.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.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.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.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
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');
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
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.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.Append-only Review-, Publish-, Suppress- und Delete-Entscheidungen.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Schneller Zugriff auf letzte Feed-Checks pro Domain.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Auswertung nach Feed-Quelle und Verdict.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Lösch- und Ablaufjobs finden fällige Observations.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Sanitisierte Metadaten bleiben filterbar.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Verhindert doppelte Alert-Verknuepfungen.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Audit-Events können pro Dedupe-Key nachvollzogen werden.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Änderungen setzen updated_at automatisch.
infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung aus sicherer Shell anwenden.Ä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.
Eine upsertbare synthetische Observation mit source_id=security_feed_storage_canary, verdict=inconclusive, publish_decision=not_public.
Ein Auditlog-Eintrag runner_observation_upsert mit after_hash über die normalisierten Metadaten.
Kein Alert-Link und kein Ticket, weil der Canary kein echter Treffer ist.
Dedupe-Key aus Domain, Source, matched_url und reference_id verhindert doppelte Tages-Observations.
Inconclusive-Canary läuft nach 14 Tagen ab, sofern er nicht durch den nächsten Canary-Lauf aktualisiert wird.
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
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
Normalisierte Momentaufnahmen aus externen Malware-/Blacklist-/DAST-Feeds.
- Vorhanden
- ja
- Zeilen
- 0
Verknuepfung gespeicherter Feed-Beobachtungen mit Alert, Nachweisposition, Verantwortlichkeit, Zielzeit und Reviewstatus.
- Vorhanden
- ja
- Zeilen
- 0
Auditlog für Import, Review, Freigabe, Löschung und Re-Scan.
- Vorhanden
- ja
- Zeilen
- 0
- Vorhanden
- ja
- Vorhanden
- ja
- Vorhanden
- ja
- Vorhanden
- ja
- Vorhanden
- ja
- Vorhanden
- ja
security_feed_observations
- Vorhanden
- ja
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.
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
Dedizierte Migration mit autorisierter DB-Verantwortung anwenden: psql -d saferpage -v ON_ERROR_STOP=1 -f infra/postgres/migrations/security-feed-storage.sql
Danach Readiness erneut prüfen und Tabellen/Indizes/Trigger als ready bestätigen.
SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach Betreiberfreigabe, Retention-Review und Alert-Routing setzen.
Optionalen Storage-Canary mit --storage-canary ausführen, um eine synthetische private Observation ohne externe Feed-Abfrage zu testen.
Separaten systemd-Canary-Timer prüfen: systemctl list-timers saferpage-security-feed-canary.timer --no-pager.
Ersten Runner-Lauf kontrollieren: stored_observation_count muss zu den aktivierungsbereiten Domains passen.
DB-Verantwortungs-Paket
Migration, Smoke-Test und Freigabereihenfolge
PostgreSQL-Rolle mit Besitz- oder Adminrechten sowie CREATE TABLE, CREATE INDEX, CREATE TRIGGER im Schema public.
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.
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');"
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
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.
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.
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.
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
bcaa177b61f0c9ea578e80abcdb8fa2af9c0615fd197f153b7367161603e9453Preflight vor und nach Migration · ready
https://saferpage.de/evidence/security-feed-storage-preflight.jsonRetention- 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-jsonApproval 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.Preflight grün
scripts/run-security-feed-storage-preflight.shReadiness prüfen
curl -fsS https://saferpage.de/sicherheit/feed-storage-readiness-jsonApproval bewusst setzen
SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes nur serverseitig setzenCanary blockiert testen
python3 scripts/run-security-feed-schedule.py anrufer.info --storage-canary --dry-runCanary schreiben
python3 scripts/run-security-feed-schedule.py anrufer.info --storage-canary --executeRunner nachziehen
curl -fsS https://saferpage.de/sicherheit/feed-runner-jsonThreat 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.
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 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.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.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.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.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.