From e6dbab3ebf90c7a757c9f8c889c72801e6230aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dieter=20Schl=C3=BCter?= Date: Fri, 12 Jun 2026 15:38:13 +0200 Subject: [PATCH] docs: add example.com template for new target websites Heavily commented config.yaml and config/ directory serve as a copy-paste starting point for any new site to monitor. Co-Authored-By: Claude Sonnet 4.6 --- .gitignore | 3 + example.com/config.yaml | 165 +++++++++++++++++++++++ example.com/config/allowed_external.yaml | 11 ++ example.com/config/ignore_rules.yaml | 20 +++ 4 files changed, 199 insertions(+) create mode 100644 example.com/config.yaml create mode 100644 example.com/config/allowed_external.yaml create mode 100644 example.com/config/ignore_rules.yaml diff --git a/.gitignore b/.gitignore index b2f5c0e..aacb3bd 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,9 @@ bredelar.info/logs/ jamulix.de/data/ jamulix.de/reports/ jamulix.de/logs/ +example.com/data/ +example.com/reports/ +example.com/logs/ # Editor .idea/ diff --git a/example.com/config.yaml b/example.com/config.yaml new file mode 100644 index 0000000..cfdb2d4 --- /dev/null +++ b/example.com/config.yaml @@ -0,0 +1,165 @@ +# ============================================================ +# Integrity Scanner — Konfigurationsvorlage +# ============================================================ +# Verwendung: +# 1. Dieses Verzeichnis kopieren: +# cp -r example.com meine-seite.de +# 2. In meine-seite.de/config.yaml alle Stellen mit +# "example.com" durch die echte Domain ersetzen. +# 3. Verzeichnis in .gitignore eintragen (data/reports/logs). +# 4. Erste Einrichtung: +# python -m scanner --config meine-seite.de/config.yaml init +# ============================================================ + +# --- Ziel-Website --- +target: "https://example.com" + +# User-Agent, mit dem der Scanner sich bei der Website meldet. +# Bitte nicht auf einen Browser-Agent ändern — der Scanner soll erkennbar sein. +user_agent: "integrity-scanner/1.0 (+security-monitoring)" + +# Timeout in Sekunden pro HTTP-Anfrage +request_timeout: 20 + +# --- Verzeichnisse (müssen absolut angegeben werden) --- +# Pfad zum Projektverzeichnis anpassen! +data_dir: "/home/dschlueter/Python_Programs/integrity_scanner_fuer_statische_Webseiten/example.com/data" +reports_dir: "/home/dschlueter/Python_Programs/integrity_scanner_fuer_statische_Webseiten/example.com/reports" +logs_dir: "/home/dschlueter/Python_Programs/integrity_scanner_fuer_statische_Webseiten/example.com/logs" +config_dir: "/home/dschlueter/Python_Programs/integrity_scanner_fuer_statische_Webseiten/example.com/config" + +# --- Crawl-Einstellungen --- +crawl: + # Maximale Anzahl Seiten pro Crawl (Schutz vor endlosen Websites) + max_pages: 200 + + # Wartezeit zwischen zwei Seitenanfragen in Sekunden (Server schonen) + delay_seconds: 1.0 + + respect_robots_txt: false + + # Pfade, die vom Scan ausgeschlossen werden sollen. + # Nützlich für Bereiche mit gewollt häufig wechselnden Inhalten, + # z. B. RSS-Feeds, News-Archive, Nutzerprofile. + # Beispiel: ["/rss/", "/feed/", "/news/archiv/", "/user/"] + exclude_paths: [] + + # Dateiendungen, die nicht gecrawlt werden (Binärdateien) + skip_extensions: + - ".jpg" + - ".jpeg" + - ".png" + - ".gif" + - ".webp" + - ".svg" + - ".ico" + - ".pdf" + - ".zip" + - ".woff" + - ".woff2" + - ".ttf" + - ".otf" + - ".eot" + - ".mp4" + - ".mp3" + - ".webm" + - ".avi" + - ".mov" + +# --- Bewertungsgewichte --- +# Jedes Ereignis erhöht den Score. Ab 20 = gelb, ab 60 = rot. +# Die Werte können hier für diese Website angepasst werden. +scoring: + new_external_domain: 50 # Neuer Verweis auf fremde Domain + new_internal_url: 30 # Neue interne Seite aufgetaucht + missing_internal_url: 20 # Bekannte Seite verschwunden + hidden_content: 40 # Unsichtbarer Text/Link (display:none) + unexpected_canonical: 35 # Canonical-Tag geändert + meta_refresh: 40 # Automatische Weiterleitung eingebaut + unexpected_jsonld: 35 # Unbekannter JSON-LD-Typ + large_text_addition: 20 # Großer neuer Textblock (>200 Zeichen) + new_inline_script_suspicious: 30 # Verdächtiges inline JavaScript + comment_links: 25 # Link in HTML-Kommentar versteckt + new_broken_link: 20 # Neuer kaputt interner Link + suspicious_filename: 60 # Webshell-typischer Dateiname verlinkt + cloaking_extra_link: 60 # Nur für Google-Bot sichtbarer Link + cloaking_extra_text: 40 # Nur für Google-Bot sichtbarer Text + cloaking_vary_ua: 25 # Server sendet verschiedene Inhalte je UA + changed_script: 40 # JavaScript-Datei verändert + changed_stylesheet: 30 # CSS-Datei verändert + changed_asset: 20 # Bild/PDF/sonstige Datei verändert + +thresholds: + yellow: 20 # Ab diesem Score: Warnung (gelb) — Bitte prüfen + red: 60 # Ab diesem Score: Alarm (rot) — Sofort prüfen + large_text_block_chars: 200 + +# --- Wöchentliche Zusatzprüfungen --- +# Laufen automatisch beim täglichen `scan` mit — kein separater Aufruf nötig. +periodic_checks: + enabled: true + interval_days: 7 + cloak_check: true # Prüft ob Google andere Inhalte sieht als Besucher + ext_links: true # Prüft ob externe Links noch erreichbar sind + assets: true # Prüft ob CSS/JS/Bilder sich verändert haben + +# --- E-Mail-Benachrichtigung --- +# Passwort NIEMALS hier eintragen — nur als Umgebungsvariable: +# export SCANNER_SMTP_PASSWORD="geheimesPasswort" +alerting: + min_level: "yellow" # "yellow" = bei Gelb und Rot mailen; "red" = nur bei Rot + email: + enabled: false # Auf true setzen wenn SMTP konfiguriert + smtp_host: "mail.example.com" + smtp_port: 587 + smtp_tls: true + smtp_user: "scanner@example.com" + smtp_password_env: "SCANNER_SMTP_PASSWORD" + from: "scanner@example.com" + to: + - "admin@example.com" + webhook: + enabled: false + url: "" # z.B. Slack-Webhook oder Telegram-Bot-URL + +# --- Normalisierung --- +# Elemente, die vor dem Vergleich aus dem HTML entfernt werden +# (z. B. dynamische Datums-/Zeitanzeigen die sich täglich ändern). +normalization: + strip_html_comments: true + collapse_whitespace: true + ignore_selectors: + # - "#last-modified" # Element mit dieser ID ignorieren + # - ".timestamp" # Alle Elemente mit dieser CSS-Klasse ignorieren + ignore_patterns: + # - '\d{1,2}\.\d{1,2}\.\d{4}' # Datumsangaben im Text ignorieren + # - 'Stand:\s+\S+' + +# --- Erlaubte JSON-LD-Typen --- +# Alles, was hier nicht steht und auf der Website auftaucht, löst Alarm aus. +allowed_jsonld_types: + - "Organization" + - "WebSite" + - "WebPage" + - "Article" + - "BreadcrumbList" + - "ItemList" + - "LocalBusiness" + - "Place" + - "Person" + - "Event" + - "FAQPage" + - "Question" + - "Answer" + - "ImageObject" + - "SiteLinksSearchBox" + - "ContactPage" + - "AboutPage" + +# --- Erwartete Security-Header --- +# Fehlen diese Header, erscheint ein Hinweis im Report (kein Score-Einfluss). +security_headers: + - "Content-Security-Policy" + - "Strict-Transport-Security" + - "X-Content-Type-Options" + - "Referrer-Policy" diff --git a/example.com/config/allowed_external.yaml b/example.com/config/allowed_external.yaml new file mode 100644 index 0000000..1c9d583 --- /dev/null +++ b/example.com/config/allowed_external.yaml @@ -0,0 +1,11 @@ +# Erlaubte externe Domains für example.com +# +# Nach dem ersten `init`-Crawl alle legitimen externen Domains eintragen, +# die auf der Website verlinkt sind (z.B. CDNs, Social-Media, Partner). +# Jede Domain, die hier NICHT steht, löst beim nächsten Scan Alarm aus. +# +# Beispiele: +# - fonts.googleapis.com +# - cdn.jsdelivr.net +# - www.youtube.com +# - maps.googleapis.com diff --git a/example.com/config/ignore_rules.yaml b/example.com/config/ignore_rules.yaml new file mode 100644 index 0000000..f325c14 --- /dev/null +++ b/example.com/config/ignore_rules.yaml @@ -0,0 +1,20 @@ +# Ignorierregeln für example.com +# +# ignore_selectors: CSS-Selektoren — passende HTML-Elemente werden vor dem +# Vergleich entfernt. Nützlich für dynamische Bereiche (Datum, Uhrzeit, +# Zähler, zufällige Werbebanner). +# +# ignore_patterns: Reguläre Ausdrücke — passende Textstellen werden durch +# [IGNORED] ersetzt. Nützlich für Datumsangaben oder sich ändernde Zahlen. +# +# Diese Regeln ergänzen die Einstellungen in config.yaml (normalization). + +ignore_selectors: + # - "#dynamic-counter" + # - ".last-updated" + # - ".ad-banner" + +ignore_patterns: + # - '\d{1,2}\.\d{1,2}\.\d{4}' # Datumsangaben TT.MM.JJJJ + # - '\d{1,2}:\d{2}\s*(Uhr)?' # Zeitangaben + # - 'zuletzt geändert am \S+'