Security-Feed-Storage

Schreibpfad erst nach Tabellen, Triggern und Freigabe

Security-Feed-Storage ist noch nicht schreibbereit: 11 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 0/3Tabellen 0/6Indizes 0/2Trigger 0/11Artefakte offenServerfreigabe 11fehlend

Preflight-Artefakte

DB-Artefakte fuer Feed-Storage transparent pruefen

Evidence JSON
Erforderlich11 Bereit0 Fehlend11 Admin-DSNerforderlich
Feed-Observations-Tabelle missing · Pflicht fuer Storage

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

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

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

infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.
Feed-Auditlog missing · Pflicht fuer Storage

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

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

Schneller Zugriff auf letzte Feed-Checks pro Domain.

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

Auswertung nach Feed-Quelle und Verdict.

infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.
Retention-Index missing · Pflicht fuer Storage

Loesch- und Ablaufjobs finden faellige Observations.

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

Sanitisierte Metadaten bleiben filterbar.

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

Verhindert doppelte Alert-Verknuepfungen.

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

Audit-Events koennen pro Dedupe-Key nachvollzogen werden.

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

Aenderungen setzen updated_at automatisch.

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

Aenderungen setzen updated_at automatisch.

infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin 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 ueber 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 laeuft nach 14 Tagen ab, sofern er nicht durch den naechsten 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 · missing

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

Vorhanden
nein
Zeilen
security_feed_alert_links Tabelle · missing

Verknuepfung gespeicherter Feed-Beobachtungen mit Alert, Ticket, Owner, SLA und Reviewstatus.

Vorhanden
nein
Zeilen
security_feed_audit_log Tabelle · missing

Auditlog fuer Import, Review, Freigabe, Loeschung und Re-Scan.

Vorhanden
nein
Zeilen
security_feed_observations_domain_checked_idx Index · missing

Vorhanden
nein
security_feed_observations_source_verdict_idx Index · missing

Vorhanden
nein
security_feed_observations_expires_idx Index · missing

Vorhanden
nein
security_feed_observations_result_meta_gin_idx Index · missing

Vorhanden
nein
security_feed_alert_links_dedupe_idx Index · missing

Vorhanden
nein
security_feed_audit_log_dedupe_idx Index · missing

Vorhanden
nein
security_feed_observations_set_updated_at Trigger · missing

security_feed_observations

Vorhanden
nein
security_feed_alert_links_set_updated_at Trigger · missing

security_feed_alert_links

Vorhanden
nein

Migration

Dedizierte SQL-Datei für den DB-Owner

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-256306a569bdf0d59054861ddc8ddfcf0d09a825f097f3d1dbe88993e481f048314 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 einem autorisierten DB-Owner 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-Owner Paket

Migration, Smoke-Test und Freigabereihenfolge

Übergabe exportieren
Rolle

PostgreSQL-Owner oder Rolle mit 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 pruefen.

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.