# Changelog Alle nennenswerten Änderungen an Roster stehen hier. Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die Versionen [Semantic Versioning](https://semver.org/lang/de/). Englische Fassung: [CHANGELOG.md](https://github.com/boonkerz/roster/blob/master/CHANGELOG.md). ## [Unreleased] ## [0.28.0] - 2026-11-11 ### Hinzugefügt - Nativer Viewer und Taskleisten-App zeigen ihre Version: der Viewer im Fenstertitel („· Viewer 0.28.0“), die Tray-App in der Fußzeile; beide melden „Update … verfügbar“, wenn der Server neuer ist (die Tray-App in Rot). `--version` gibt sie aus. ### Behoben - **Einstellungen → Downloads lieferte veraltete Viewer- und Tray-Pakete aus** (Stand September/Oktober): ein mit `make server` gebauter Server baute sie nicht neu. `make server` bettet Viewer und Tray (Linux x86-64/ARM64, Windows) jetzt in der Version des Servers ein – damit kommen Dateiübertragungen über 32 MB und die Fortschrittsanzeige auch im nativen Viewer an. ## [0.27.0] - 2026-11-11 ### Geändert - Dateiübertragung (Dateibrowser, Drag & Drop auf den Fernsteuerungs-Bildschirm, Dateimanager des nativen Viewers): **bis 4 GB statt 32 MB**. Dateien werden gestreamt – der Server hält sie als Zwischendatei neben der Datenbank statt im Arbeitsspeicher (prüft vorher den freien Platz) und löscht sie direkt nach der Abholung; der Agent schreibt in eine Zwischendatei und benennt sie erst nach vollständigem Empfang um, ein Abbruch hinterlässt also nie eine halbe Datei; die Übertragung läuft im Hintergrund, der Agent meldet sich weiter. Die Weboberfläche zeigt den Upload in Prozent und den Fortschritt auf dem Gerät; das Warten bricht nicht mehr nach einer Minute ab, solange der Agent Fortschritt meldet. Große Uploads an Agents vor 0.27.0 werden mit klarem Hinweis abgelehnt (die konnten nur 32 MB). ## [0.26.0] - 2026-11-10 ### Hinzugefügt - Fernsteuerung unter Linux: **Zwischenablage-Abgleich** in beide Richtungen – X11 über die CLIPBOARD-Auswahl, Wayland über das Data-Control-Protokoll (labwc/Raspberry Pi OS, Sway, Wayfire, niri, Hyprland). ## [0.25.0] - 2026-11-10 ### Hinzugefügt - Fernsteuerung unter **Linux**: echter Bildschirm, Maus und Tastatur statt des Farbverlauf-Testbilds – Wayland mit wlroots (labwc auf Raspberry Pi OS, Wayfire, Sway, niri, Hyprland) über `wlr-screencopy` und virtuellen Zeiger/virtuelle Tastatur sowie X11 über den X-Server mit XTEST. Der Agent findet die Sitzung des angemeldeten Nutzers selbst, nichts nachzuinstallieren. GNOME/KDE unter Wayland und andere Systeme zeigen einen klaren Hinweis statt des Testbilds; ohne Sitzung wartet der Viewer auf eine Anmeldung. ## [0.24.1] - 2026-11-09 ### Behoben - Abläufe: Läufe/Abläufe löschen sowie Testlauf und Rollout starten nutzen nicht mehr die Rückfrage des Browsers – nach „Weitere Dialoge verhindern“ beantworten Browser sie stumm mit „Abbrechen“, der Löschen-Knopf schien wirkungslos (außer mit offener Konsole). Der Knopf fragt jetzt selbst („Sicher? Nochmal klicken“). ### Neu - Ablauf-Editor: Rückmeldung beim Speichern – „✓ Gespeichert um …“ nach dem Speichern und „● Ungespeicherte Änderungen“ beim Bearbeiten. ## [0.24.0] - 2026-11-09 ### Behoben - Abläufe: Der Baustein *Zurückrollen* mit „Dienste neu starten“ fährt jetzt das **ganze Compose-Projekt** hoch – bisher gingen nur die von *Dateien finden* gefundenen Dienste (z. B. php-fpm) zurück, web/cron liefen mit dem neuen Image weiter. ### Neu - Abläufe: fünf neue Bausteine – **Dateisystem** (`mkdir`/`chmod`/`chown`/`file`, idempotent, Zurückrollen entfernt neu angelegte Verzeichnisse/Dateien und stellt Rechte/Besitzer wieder her), **Befehl im Container** (`docker exec` in einem Compose-Dienst, z. B. Cache leeren/Migrationen), **Datenbank sichern** (Dump aus MySQL/MariaDB, MongoDB, PostgreSQL mit Zugangsdaten aus der Container-Umgebung, gzip, behält die neuesten N, bleibt beim Zurückrollen erhalten), **Docker aufräumen** (namenlose oder ungenutzte Images, Vorschau listet sie) und **Benachrichtigen** (vom Server über die Alarm-Kanäle verschickt, auch im Wartungsfenster). Jeder Baustein bekommt die optionale Bedingung **„Nur ausführen, wenn …“** (leerer Wert = überspringen, `!` = nur wenn leer). *Prüfen* kann testen, ob ein **Pfad existiert**. Die Vorschau merkt sich, was frühere Zeilen anlegen würden. Vorlage *Compose: Version anheben, wenn älter* erweitert: optionale DB-Sicherung, Volume-Verzeichnis mit Bind-Volume, Befehl nach dem Update, Aufräumen, Erfolgs-/Fehlermeldung. ## [0.23.3] - 2026-11-09 ### Behoben - Abläufe, *Dateien finden* (Compose-Image): Der **Image-Name genügt** (`php-fpm-prod` findet `registry…/docker/php-fpm-prod`), `*` wirkt als Platzhalter. Bisher passte nur das vollständige Repository. Der Versionsvergleich ignoriert **Anhängsel** wie `_tp` (`2.4.0_tp` gilt als 2.4.0 – bisher nicht vergleichbar, solche Server wurden als „nicht betroffen“ übersprungen). Neuer Platzhalter `{{value.suffix}}`; die Vorlage *Compose: Version anheben, wenn älter* behält das Anhängsel (`2.4.0_tp` → `2.5.0_tp`). ## [0.23.2] - 2026-11-09 ### Geändert - Abläufe, *YAML ändern*: Ein Wert in Kurzform (`{driver: local, driver_opts: {…}}`, `[a, b]`) wird beim Anlegen als eingerückter Block geschrieben – ein benanntes Volume mit Treiber-Optionen passt jetzt in eine `ensure`-Zeile. `{}`/`[]` bleiben, wie sie sind. ## [0.23.1] - 2026-11-09 ### Neu - Abläufe: **YAML-Änderungen ausprobieren** – *Ausprobieren …* am Baustein *YAML ändern* öffnet ein Fenster mit drei Spalten (Eingabe-YAML + Parameterwerte | Operationen, direkt im Baustein | Live-Vorschau als Diff oder Ergebnis, mit Meldung je Operation). Gerechnet wird serverseitig mit demselben Code wie im Agent (`POST /flows/yaml-preview`); nichts wird gespeichert oder ausgeführt. YAML-Logik und Diff liegen jetzt in gemeinsamen Paketen (`internal/shared/yamledit`, `textdiff`). ## [0.23.0] - 2026-11-09 ### Neu - Abläufe: neue Bausteine **Wert lesen** (YAML/JSON-Pfad oder `.env`-Schlüssel, Image-Tag/-Repository herauslösen → `{{steps.ID.value}}`) und **YAML ändern** (`set`/`append`/`ensure`/`delete` mit Klammer-Erweiterung `{web,php-fpm,cron}` und `{{value.repo}}`; Änderungen positionsgenau, Kommentare, Anführungszeichen und Einrückung bleiben; Ergebnis wird vor dem Schreiben geprüft, Backup/Diff/Vorschau, idempotent). *Prüfen* vergleicht **Versionen** (`version_lt` … `version_eq`) und kann bei Nichterfüllung den **Ablauf ohne Fehler beenden** („sonst nichts tun“). Vorlage **Compose: Version anheben, wenn älter** (php-fpm-Tag lesen, < 2.5.0 → web/php-fpm/cron anheben, Mount + Volume eintragen, pull, up, prüfen, bei Fehler zurück). JSON-Schema erweitert (Formatversion bleibt 1). ## [0.22.0] - 2026-11-09 ### Neu - Abläufe: **Austauschformat `roster-flow` (Version 1)** – Ablauf als `.roster-flow.json` exportieren (Liste und Editor) und auf einem anderen Server importieren (Upload oder Einfügen, *Prüfen* validiert ohne Änderung; gleichnamige Abläufe bleiben unberührt, der Import heißt „Name (Import)“). Bibliotheks-Skripte werden beim Export eingebettet. Veröffentlichtes **JSON-Schema** `https://roster-rmm.dev/schemas/roster-flow-1.schema.json` für Prüfung/Vervollständigung im Editor. API `GET /flows/{id}/export`, `POST /flows/import` (`?dry_run=1`). ## [0.21.6] - 2026-11-07 ### Neu - Container-Sicherheit: Zahl der **behebbaren** Treffer je Image (Docker-Tab und *Sicherheit → Container*), Filter „nur behebbare“, Kopf-Badge „mit behebbaren kritisch/hoch“, Sortierung behebbare kritisch/hoch zuerst. Wo Debian eine eigene Dringlichkeit vergibt (unimportant/low/medium/high), ersetzt sie die allgemeine CVSS-Stufe. ### Behoben - Container-Sicherheit: „Behoben in“ kommt nur noch aus dem Release des Images (z. B. Debian 13). Bisher stand dort teils eine Version aus einem anderen Release (Debian 14 `8.21.0~rc2-1` bei curl in trixie) – als ließe sich das mit einem neuen Image beheben. Offene Treffer zeigen jetzt „noch kein Fix“. Container-Scans übernehmen keine Fix-Angaben mehr aus Host-Scans. Migration 0079 gleicht alle Images einmal neu ab. ## [0.21.5] - 2026-11-07 ### Behoben - Container-Sicherheit: Image-Scans und ihre Schwachstellen verschwinden bei jedem Checkin, sobald kein Container (laufend oder gestoppt) das Image mehr nutzt – z. B. das alte `jrcs/letsencrypt-nginx-proxy-companion` nach der Umstellung, das lokal bis zu `docker image prune` liegen bleibt. Bisher blieben sie unter *Sicherheit → Container* stehen, bis das Image selbst gelöscht war; Hosts ohne Container/Images verlieren jetzt auch alle Scans und Datenbank-Bestände. ## [0.21.4] - 2026-11-07 ### Behoben - Abläufe: Beim Öffnen eines gespeicherten Laufs aus dem Verlauf zeigt der Assistent jetzt die Parameter und den Vorschau-Server dieses Laufs statt der Standardwerte des Ablaufs. ## [0.21.3] - 2026-11-07 ### Geändert - Abläufe: *Dateien finden* trifft nie die eigenen Backups (`*.roster-bak-*`, `*.roster-tmp`) – bisher erfasste ein Muster wie `verzeichnis/*` sie beim zweiten Lauf. *Text ersetzen* ohne Treffer **beendet den Ablauf jetzt ohne Fehler** (Status „nicht betroffen“: Gerät schon umgestellt), pull/up/Neustart entfallen; die Option „Weitermachen, auch wenn nichts ersetzt wurde“ behält das alte Verhalten. ## [0.21.2] - 2026-11-07 ### Neu - Abläufe: Ablauf **kopieren** (Liste und Editor, „Name (Kopie)“; im Editor wird der aktuelle, auch ungespeicherte Stand kopiert) und **einzelne Läufe löschen** im Lauf-Verlauf. Route `POST /flows/{id}/copy`, `DELETE /flow-runs/{id}`. ## [0.21.1] - 2026-11-07 ### Behoben - Abläufe: Der Baustein *Docker Compose* funktioniert jetzt auch nach *Dateien finden* im Pfad-Modus – Compose-Dateien unter den Treffern (docker-compose*.yml, compose*.yaml) werden zum Projekt (Name aus den Labels laufender Container im Verzeichnis, sonst der Ordnername). Bisher brach die Vorschau mit „kein Compose-Projekt bekannt“ ab. ## [0.21.0] - 2026-11-07 ### Neu - **Abläufe (Flow-Designer).** Neue Seite *Abläufe*: Bausteine (Dateien finden, Text ersetzen, Docker Compose, Befehl/Skript, API abfragen, Prüfen, Zurückrollen, Warten) auf einer Zeichenfläche (React Flow) über die Ausgänge ok/Fehler verbinden, mit Parametern und Platzhaltern (`{{param.X}}`, `{{steps.ID.value|out|json.pfad}}`, Gerätefelder). Der Agent führt den Graphen nativ aus (Befehl `run_flow`) – Vorschau als Trockenlauf mit Diffs auf einem Server, Testlauf auf diesem Server, danach Rollout auf Firma/Standort/Tag/alle oder die betroffenen Geräte. Backup je Datei, automatisches Zurückrollen bei unverbundenem Fehler-Ausgang, Lauf-Verlauf. Vorlagen: *Image in Compose ersetzen* (auch aus *Sicherheit → Container*: „Image ersetzen …“), *Wert in Datei ersetzen und Dienste neu starten*, *API abfragen und Wert eintragen*. Migration 0078. ## [0.20.2] - 2026-11-06 ### Neu - **OPNsense: Agent übersteht Firmware-Upgrades.** Der Agent registriert sich beim Start als OPNsense-Plugin `os-roster-agent`: lokales Paket, gebaut mit dem `pkg` der Firewall (ABI `FreeBSD:*:amd64`, sonst Host-ABI), lokales Repo `/var/lib/roster/pkg` (+ `/usr/local/etc/pkg/repos/roster.conf`), Eintrag in der `config.xml` per `register.php`, Dienst über `/etc/rc.conf.d/rosteragent`. Läuft nach jedem Selbst-Update erneut. Fehlen nach einem Upgrade Dateien, unter System → Firmware → Plugins neu installieren. Das Installationsskript schreibt zusätzlich `/etc/rc.conf.d/rosteragent`. ## [0.20.1] - 2026-11-06 ### Neu - **Sicherheit → Container:** Flottenübersicht aller Container-Images (über Geräte gebündelt, Filter kritisch/hoch und SSH/FTP/Telnet, aufklappbar mit Geräten und Treffern) und Datenbank-Bestand aller DB-Container mit Link zu den Datenbank-Abweichungen. Route `GET /security/containers`. ## [0.20.0] - 2026-11-06 ### Neu - **Container-Sicherheit.** Der Agent liest je Image eines laufenden Containers einmal täglich per `docker exec` os-release und Paketliste (apk/dpkg/rpm); der Server gleicht sie mit dem versionierten Ökosystem (Alpine 3.x, Debian 12, Ubuntu 24.04, Rocky/Alma) gegen OSV.dev ab. Ergebnis je Image im Docker-Tab (Basis-OS, Pakete, kritisch/hoch, erkannte Dienste wie sshd/ftpd, „nicht prüfbar“ bei distroless), vollständige Liste im Tab Schwachstellen und in der Flotten-Schwachstellenansicht („Container-Images“). Button „Images neu scannen“, Befehl `scan_images`. Migration 0077. - **Datenbank-Abweichung (`db_change`).** In MongoDB-, MySQL/MariaDB- und PostgreSQL-Containern listet der Agent je Checkin Datenbanken samt Collection-/Tabellenzahl (Zugangsdaten aus der Container-Umgebung, werden nie übertragen). Der Server vergleicht mit dem vorigen Checkin und meldet den Vorfall „Datenbank-Abweichung“: neue Datenbank = Warnung; gelöschte oder geleerte Datenbank, Erpresser-Namen (README/WARNING/RECOVER/…) oder „Daten weg + Hinweis-Datenbank“ = kritisch. MITRE T1485/T1486, Active-Response-Auslöser (Skript). Docker-Tab zeigt den Bestand je Container. - **Docker-Checks:** Modi „Datenbanken im Container“ (Erwartungsliste, optional Container-Filter) und „Kein Image älter als N Tage“ (nutzt den neuen Image-Erstellzeitpunkt). ### Behoben - CVE-Scan: „Behoben in“ nimmt jetzt die Version des abgefragten Ökosystems/Releases (Ubuntu/Debian-Datensätze führen je Release einen Eintrag; bisher stand oft die Version eines älteren Releases da). ## [0.19.1] - 2026-11-05 ### Neu - Ubuntu **Phased Updates**: Der Agent fragt per `apt-get -s dist-upgrade` ab, welche Updates apt wegen Phasing zurückstellt, und markiert sie in der Update-Liste (Badge „zurückgestellt (Phasing)“). Die Installationsaktionen am Gerät, in der Sammelaktion und auf der Patches-Seite bekommen die Option **Phased Updates sofort installieren** (`APT::Get::Always-Include-Phased-Updates=true`). Ohne sie überspringt apt diese Pakete – das sah aus, als würde dist-upgrade nicht alles installieren. Migration 0076. ## [0.19.0] - 2026-11-03 ### Neu - Datei-Integrität **Who-Data**: Mit dem Richtlinienschalter „Verursacher von Dateiänderungen ermitteln“ pflegt der Agent unter Linux auditd-Watch-Regeln (`-w -p wa -k roster_fim`, gelesen per `ausearch --checkpoint`) und setzt unter Windows Erfolgs-SACLs auf die überwachten Pfade und liest die Ereignisse 4663/4660. Änderungen tragen dann Benutzer und Prozess in der Ereignisliste (Spalte „Wer“) und in Benachrichtigungen. Migration 0075 ergänzt auch die Richtlinienschalter für Systemzustand und Rootkit-Prüfung. ### Neu - Compliance-Katalog von 48 auf 106 Regeln in Richtung CIS Level 1 ausgebaut: Linux (SSH-Leerlauf/Grace/leere Passwörter/rhosts/Sessions/LogLevel, pam_pwquality und pam_faillock, Passwortalterung und umask, Cron-Rechte und cron.allow, Logdatei-Rechte, Sticky-Bit, Mount-Optionen von /tmp und /dev/shm, Home-Rechte, sysctl rp_filter/log_martians/Redirects/Source-Route/ICMP-Broadcasts/kptr_restrict, persistentes journald, unnötige Dateisystemmodule) und Windows Server (Kennwortchronik/-alter, Sperrdauer, anonyme Aufzählung, SMB-Signierung, nur NTLMv2, RDP-Leerlauf, Bildschirmsperre, Firewall-Protokoll, Remoteregistrierung, Druckwarteschlange, WinRM Basic/unverschlüsselt, NetBIOS, Defender Cloud/PUA, UAC sicherer Desktop, SEHOP, DEP, PowerShell-Skriptblock-Protokollierung, Überwachungsrichtlinien für Anmeldung/Kontenverwaltung/Prozesserstellung/Richtlinienänderung, Protokollgrößen, zwischengespeicherte Anmeldungen, Autologon) – PowerShell-3-tauglich (`net accounts`, WMI, `auditpol` per GUID, `bcdedit`). Jede Regel trägt **Framework-Referenzen** (CIS, PCI DSS, ISO 27001) als Badges mit Rahmenwerk-Filter in Geräte-, Flotten- und Richtlinienansicht, dazu englische Beschreibungen und Empfehlungen. ### Neu - **Rootkit- und Malware-Prüfung** (Richtlinienschalter): Einmal täglich sucht der Linux-Agent nach versteckten Prozessen (antworten auf `kill(pid,0)`, fehlen aber in `/proc`), einem gefüllten `/etc/ld.so.preload`, versteckten Kernelmodulen, Schnittstellen im Promiscuous-Modus, ausführbaren/setuid-/ELF-Dateien in `/tmp`, `/var/tmp`, `/dev/shm`, regulären Dateien in `/dev` und bekannten Rootkit-Pfaden (Reptile, Diamorphine, Jynx, BEURK). Befunde werden zum kritischen Vorfall **Rootkit-Hinweis**. Laut Datei-Integritätsprüfung neue oder geänderte Dateien werden mit ClamAV (`clamdscan`/`clamscan`, Linux) bzw. Defender (`MpCmdRun`, Windows) geprüft, falls vorhanden → kritischer Vorfall **Malware**. Knopf „Rootkit-Prüfung jetzt“ im Geräte-Tab Datei-Integrität. ### Neu - **Systemzustand überwachen** (Richtlinienschalter): Der Agent vergleicht stündlich lauschende Ports, Kernelmodule, Cron-Einträge, UID-0- und Administratorkonten, aktivierte systemd-Units/Timer (Linux), Autostart-Dienste und geplante Aufgaben (Windows, über `net localgroup`/WMI/`schtasks`, Server-2012-tauglich) sowie launchd-Jobs (macOS) mit seiner Baseline. Jede Änderung wird zum Vorfall **Systemänderung** (kritisch bei neuem UID-0- oder Administratorkonto), aufgelistet als „+ neu, - weg“. ### Neu - Datei-Integritätsprüfung umfasst die **Windows-Registry**: Regelpfade wie `HKLM\SOFTWARE\…`, `HKU\*\…` (alle geladenen Benutzerprofile; `HKCU` wird darauf abgebildet) oder `HKCR\…`. Schlüssel zählen wie Verzeichnisse, Werte wie Dateien (Hash über Typ und Daten), neue oder entfernte Unterschlüssel werden gemeldet (z. B. ein neuer Dienst). Die Richtlinie bekommt einen Knopf mit 18 Registry-Standardpfaden: Run/RunOnce (Maschine, WOW6432Node, je Benutzer), Winlogon, Image File Execution Options, AppInit_DLLs, Dienste, LSA, Session Manager, Browser Helper Objects, Aufgaben-Cache, UAC-Richtlinien, Terminal Server, Defender-Ausnahmen. ### Neu - Log-Quellen: neue Formate **HAProxy** (HTTP-Log), **Traefik** (JSON oder Common Log), **MySQL/MariaDB**-Fehlerprotokoll (Access denied, Host not allowed) und **Firewall-Drops** (iptables/nft/ufw-Kernel-Log, Windows `pfirewall.log`), dazu `apache_access` als Alias des Combined Log. Neue Quelltypen **systemd-Journal** (Ziel `kernel` oder eine SYSLOG_IDENTIFIER-Kennung – nft-/iptables-Protokolle auf Hosts ohne rsyslog) und **Docker-Ereignisse** (`exec` im Container, Start/Stop/Die). Vorlagen für alle in der Richtlinie. - Neue Vorfälle **Portscan** (≥ N verschiedene Zielports einer IP im Brute-Force-Fenster, Standard 10, Einstellungen → Sicherheitsüberwachung; automatische Sperre wie bei Brute-Force) und **Befehl im Container** (`docker exec`). ### Neu - Windows-Anmeldeüberwachung liest neben dem Sicherheitsprotokoll jetzt auch **System** (7045 Dienst installiert) und **PowerShell/Operational** (4104 Skriptblock), mit eigenem Cursor je Protokoll, und wertet 4698/4702 (geplante Aufgabe angelegt/geändert), 1102 (Sicherheitsprotokoll gelöscht) und 4688 (Prozessstart – nur verdächtige Muster: certutil-/bitsadmin-Downloads, kodiertes oder verstecktes PowerShell, mimikatz/procdump/psexec, vssadmin delete shadows, wevtutil cl, schtasks /create, net user, Office startet Shell, …) aus. Neue Vorfallsarten **Persistenz** (Warnung), **Protokoll gelöscht** (kritisch) und **Verdächtiger Prozess** (Warnung). Voraussetzungen: Überwachungsrichtlinie „Prozesserstellung“ mit Befehlszeile, „Andere Objektzugriffsereignisse“, Skriptblock-Protokollierung (fehlende Protokolle werden übersprungen). ### Neu - **Bedrohungsdaten**: Der Server lädt täglich fünf öffentliche Blocklisten (Spamhaus DROP, blocklist.de, Feodo Tracker, CINS Army, Tor-Exit-Nodes; in der Datenbank zwischengespeichert, Feeds einzeln wählbar). Quell-IPs von Vorfällen, Anmeldungen und Sperren werden mit dem Listennamen markiert, beide Listen lassen sich auf gelistete IPs filtern. Eine gelistete IP erzeugt beim ersten Fehlversuch, Scan-Treffer oder Firewall-Drop den Vorfall **Bekannte Angriffsquelle** und wird sofort flottenweit gesperrt – unabhängig von Schwellwerten und vom allgemeinen Flottensperren-Schalter (Einstellungen → Sicherheitsüberwachung; Nie-sperren-Liste und private Adressen bleiben ausgenommen). Neuer Tab Sicherheit → **Bedrohungsdaten** mit Feed-Status, Aktualisieren und IP-Nachschlagen; Migration 0074. ### Neu - Sicherheit → Vorfälle: Jeder Vorfall trägt seine **MITRE-ATT&CK-Techniken** (z. B. T1110 Brute Force, T1070.001 Clear Windows Event Logs) als Links in die ATT&CK-Matrix, die Liste lässt sich nach Technik filtern. Der Katalog der Vorfallsarten (`GET /security/kinds`) ist jetzt die eine Quelle für Server, Richtlinien und Oberfläche. - Einstellungen → Sicherheitsüberwachung: **Schweregrad je Vorfallsart** überschreibt den Standard (Info unterdrückt die Benachrichtigung, die automatische Reaktion läuft trotzdem). ## [0.18.19] - 2026-11-03 ### Geändert - Agent: Ergebnisse von `block_ip`/`unblock_ip` werden nur noch mit dem nächsten regulären Checkin gemeldet (kein zusätzlicher Checkin mehr). Die Minuten-Bündelung aus 0.18.18 feuerte trotzdem jede Minute je Gerät, weil mit Flottensperre etwa alle 30 s ein Sperrbefehl ankommt. ## [0.18.18] - 2026-11-03 ### Geändert - Agent: Ergebnisse von `block_ip`/`unblock_ip` werden gebündelt gemeldet, höchstens ein Checkin je Minute statt sofort nach jedem Befehl. Mit Flottensperre bekam jedes Gerät etwa jede Minute einen Sperrbefehl und checkte alle 30 s ein (das Sechsfache der regulären Rate). Interaktive Befehle melden weiter sofort. ## [0.18.17] - 2026-11-03 ### Behoben - Geräteliste (alle 15 s von Dashboard und Geräteseite geladen) war je Gerät teuer: Die Unterabfrage „letztes Ergebnis je Task“ lief quadratisch über die Task-Ergebnisse des Geräts, die Zählung offener Vorfälle las Zeilen statt eines Index. Migration 0073 ergänzt `task_results(device_id, task_id, ran_at)` und `security_incidents(device_id, status)`. ### Neu - Regressionstest für den Windows-Agent: schlägt fehl, wenn die eingebettete EXE nicht mehr auf Windows Server 2012 starten würde (PE-Mindestversion über 6.1 oder statische Importe von Windows-10-APIs). ## [0.18.16] - 2026-11-03 ### Behoben - Dashboard brauchte Sekunden und trieb die CPU hoch: Sicherheitsübersicht und Länder-Widgets verknüpften die großen Ereignis-/Sperrtabellen mit der Gerätetabelle, und sobald SQLite Planer-Statistiken hatte, ging es je Gerät durch (11 s für die Zählung gesperrter IPs, 1,5–2,3 s je Anmelde-Abfrage). Diese Abfragen lesen jetzt nur noch abdeckende Zeitindizes ohne Join (neuer Index `auth_events(ts, kind, source_ip, device_id)`, Migration 0072) und filtern die Geräte in Go. - SQLite lief über eine einzige Verbindung, jede Oberflächen-Anfrage wartete hinter jedem Checkin-Schreibzugriff und umgekehrt. Der Server nutzt jetzt einen kleinen Pool (WAL-Leser laufen parallel; Transaktionen starten mit `BEGIN IMMEDIATE`, Busy-Timeout 15 s, `synchronous=NORMAL`). - Erledigte `block_ip`-Befehle werden nach zwei Tagen gelöscht, unabhängig von der Ergebnis-Aufbewahrung – mit Flottensperre waren das 155 MB Massenzeilen. ### Neu - Anfragen über 5 s werden mit Pfad, Status und Dauer protokolliert (Long-Polls ausgenommen). - `ROSTER_PPROF_ADDR` (z. B. `127.0.0.1:6060`) schaltet die pprof-Endpunkte von Go zur Diagnose frei. ## [0.18.15] - 2026-11-03 ### Behoben - Die Flottensperre weckte für jede kopierte Sperre sofort alle Geräte, sodass bei tausenden Vorfällen am Tag die ganze Flotte etwa alle 20 s eincheckte (das Zwölffache, ~1.500 Checkins je 10 Minuten) und jeder Checkin die tausenden Sperrzeilen des Geräts nach verfallenen Befehlen durchsuchte. Die Kopien kommen jetzt mit dem nächsten regulären Checkin an, und die Verfallsprüfung geht über die wenigen offenen Befehle des Geräts (dazu Index `ip_blocks(status, device_id)`, Migration 0071). ## [0.18.14] - 2026-11-03 ### Behoben - Dashboard langsam: Jedes Widget berechnete bei jedem Abruf alle aktuellen Kennzahlen neu (alle Geräte, Check-Status, Länder gesperrter IPs und Angriffsquellen – zwei Durchläufe über die Sperrtabelle mit 380.000 Zeilen). Die Kennzahlen werden jetzt 30 s je Sichtbarkeitsbereich zwischengespeichert, die Zählung gesperrter IPs nutzt den Zeitstempel-Index statt die ganze Tabelle zu lesen (2,6 s → 0,3 s), und die Planer-Statistik von SQLite wird mit jedem Aufräumlauf aufgefrischt (`PRAGMA optimize`). ## [0.18.13] - 2026-11-03 ### Behoben - Server-CPU bei 100 % eines Kerns und weiterhin Checkin-Timeouts: Jede Befehlsrückmeldung suchte ihren Vorfall mit einem vollen Durchlauf von `security_incidents` (mit Flottensperre mehrmals pro Sekunde), und das Dashboard las alle 15 s die komplette `ip_blocks`-Tabelle für die Zählung gesperrter IPs. Migration 0070 ergänzt Indizes auf `security_incidents(response_command_id)` und `ip_blocks(created_at, ip, device_id)`; die Sicherheitsübersicht wird 60 s zwischengespeichert. ## [0.18.12] - 2026-11-03 ### Behoben - Agent: Ein hängender Ad-hoc-Befehl blockiert die Checkin-Schleife nicht mehr (das Gerät galt dann als offline, obwohl der Viewer noch ging). Synchrone Befehle sind auf 10 Minuten begrenzt, **Updates suchen** läuft im Hintergrund mit 30-Minuten-Obergrenze – die Windows-Update-Suche auf einem alten Windows Server 2012 ohne aktuelle Wartungsstack-Updates kann Stunden dauern. - Server: Sperrbefehle, die ein Gerät erst nach Ablauf der Sperre abholen könnte (Gerät war offline), werden beim Checkin verworfen statt einzeln abgearbeitet. ### Neu - Windows-Agent-Dienst schreibt sein Protokoll nach `C:\ProgramData\Roster\agent.log` (Rotation bei 5 MB), weil der Service Control Manager stderr verwirft. ## [0.18.11] - 2026-11-02 ### Behoben - Active Response bremst die Agent-Checkins nicht mehr aus: Bei eingeschalteter Flottensperre wurde jede Brute-Force-Sperre auf ~65 Geräten einzeln je Transaktion eingereiht, mitten im Checkin, mit zwei Suchen ohne Index je Gerät. Bei mehreren tausend Vorfällen am Tag liefen die Checkins in den 30-s-Timeout (`context deadline exceeded` beim Speichern von Check-Ergebnissen, Richtlinie und Befehlen). Reaktionen laufen jetzt in einem seriellen Hintergrund-Worker, die Flottensperre ist eine einzige Transaktion, und `ip_blocks` bekommt einen Index auf die Adresse (Migration 0069). ### Geändert - Aufbewahrung der Massen-Tabellen der Sicherheitsüberwachung: rohe Anmelde-/Log-Ereignisse 30 Tage (vorher 90), beendete IP-Sperren 14 Tage (vorher 90). Vorfälle bleiben weiter ein Jahr. Mit Web-Scannern kommen über 100.000 rohe Ereignisse am Tag zusammen, und die Flottensperre legt je Adresse einen Sperreintrag pro Gerät an. ## [0.18.10] - 2026-11-02 ### Behoben - Windows-Agent auf **Server 2012/2012 R2, Windows 7/8.1**: Die EXE wurde als „keine gültige Win32-Anwendung“ abgelehnt, weil der Go-Linker Windows 10 als Mindestversion in den PE-Kopf schreibt. Der Build senkt den Wert jetzt auf 6.1 (`tools/pepatch`, auch für Tray, Viewer und das Windows-Server-Binary); die Laufzeit selbst braucht nur Windows-7-APIs. Unter Wine mit gemeldetem Windows 6.2.9200 geprüft. - Windows-Installationsbefehl: erzwingt TLS 1.2 und nutzt `-UseBasicParsing`, damit er mit PowerShell 3/4 auf älteren Servern funktioniert (keine Internet-Explorer-Engine, TLS 1.0 als Standard). ## [0.18.9] - 2026-11-02 ### Neu - Log-Quellen: **SQL-Injektion** in Pfad oder Query zählt als verdächtige Anfrage – `union select`, `' or 1=1`, `sleep(`, `benchmark(`, `waitfor delay`, `information_schema`, `load_file(`, `into outfile`, `extractvalue(`, `admin'--` u. a.; geprüft wird zusätzlich die URL-dekodierte Form (`%27%20or%201%3d1`, `union/**/select`). POST-Bodies stehen nicht im Zugriffsprotokoll und bleiben unsichtbar; dafür braucht es eine WAF (ModSecurity-Meldungen werden im Web-Fehlerprotokoll erkannt) oder ein eigenes Anwendungsprotokoll als Log-Quelle „eigenes Muster“. ### Geändert - Aufräumen: beendete IP-Sperren (aufgehoben, abgelaufen, fehlgeschlagen) werden nach 90 Tagen gelöscht; bisher wuchs die Tabelle unbegrenzt (Flotten-Sperre erzeugt je Vorfall einen Eintrag pro Gerät). ## [0.18.8] - 2026-11-01 ### Neu - Sicherheit → Vorfälle: **Filter nach Land** der Quell-IP (Auswahl mit Flagge, „Unbekannt“ für Adressen ohne Zuordnung); Klick auf ein Land in der Kachel *Angriffsquellen nach Land* setzt den Filter. API: `GET /security/incidents?country=DE` (`?` = unbekannt). ## [0.18.7] - 2026-11-01 ### Geändert - Gerät → Sicherheit: eigener Tab **Vorfälle** (Sicherheitsvorfälle, aktive IP-Sperren, Zähler offener Vorfälle); **Anmeldungen** zeigt nur noch die Überwachungskarte und die Anmeldeereignisse – wie auf der Flotten-Seite getrennt. - Gerät → Anmeldungen: Spalte heißt jetzt „Ereignisse seit Agent-Start“ (mit Erklärung), da der Zähler nur neue Zeilen zählt, „Testen“ aber rückwirkend liest. ## [0.18.6] - 2026-11-01 ### Geändert - Dashboard: Länder-Kennzahlen zeigen als Balken bis zu 40 Länder absteigend sortiert (statt 12 + „Andere“); der Rest heißt „Andere (n Länder)“. ## [0.18.5] - 2026-11-01 ### Behoben - **Automatische Sperre sperrt keine privaten/internen Adressen mehr** (10/8, 172.16/12, 192.168/16, 100.64/10, fd00::/7, Link-Local). Hintergrund: Eine Log-Quelle hinter einem Reverse-Proxy sah nur die Docker-interne Adresse des Proxys; der Vorfall „Angriffsmuster“ sperrte sie flottenweit in DOCKER-USER und trennte den Proxy von den Backends. Der Vorfall wird weiter angelegt, die Reaktion steht auf *skipped: private address*. Wer es wirklich will, schaltet es unter Einstellungen → Sicherheitsüberwachung ein; manuelle Sperren bleiben möglich. ### Neu - Sicherheit → Sperren: **Suche** (IP/Netz, Gerät, Grund, Ersteller) und **Status-Filter** (wirksam/eingereiht, abgelaufen, aufgehoben, fehlgeschlagen) – serverseitig, bis 1.000 Zeilen; Knopf **überall** hebt eine IP mit einem Klick auf allen Geräten auf (`POST /security/unblock-ip`). ## [0.18.4] - 2026-11-01 ### Behoben - Log-Quellen: Protokollzeilen von **nginx-proxy** (forego-Präfix mit Farbcodes) wurden nicht sauber ausgepackt; dadurch griff die Erkennung von Anfragen an die nackte Server-IP nicht. Jetzt werden ANSI-Codes entfernt. Dazu neue Angriffsmuster: Befehls-/Code-Injection in Pfad oder Query (`cmd=`, `=curl`, `${jndi`, ` Standort > Firma), nach Änderungsart (installiert/entfernt/ aktualisiert) und über Ignorier-Muster (z. B. `Microsoft Edge*`) filtern. Die Einstellung am Gerät ist jetzt dreistufig (*Wie Richtlinie / Melden / Nicht melden*) und zeigt den wirksamen Wert samt Quelle. - Checks: Verlaufsdiagramm je Check am Gerät (Messwert + Statusstreifen, 1 h–30 d), `check_samples` mit 10 Tagen Aufbewahrung. - Übersicht: konfigurierbare Diagramme (Kennzahlen, Check-Status, Feldwerte) mit stündlicher Statistik-Historie; Geräte-Status und Status-Wechsel als Kacheln; Kachelbreite und Drag-and-drop. - Geräteliste: Filter auf benutzerdefinierte Felder (gesetzt/nicht gesetzt, typgerechter Vergleich); wählbare Spalten inkl. benutzerdefinierter Felder, gespeichert im Benutzerkonto; markierte Geräte als CSV exportieren mit Spaltenauswahl. - Taskleisten-App: Neustart-Knopf, SSH-Schlüssel für SFTP, helles Thema, Einstellungen; Suche trifft auch benutzerdefinierte Felder. - Doku: zweisprachige Website (DE/EN) mit Landing-Page und neuen Screenshots auf roster-rmm.dev. - Changelog (diese Datei) und automatische GitHub-Release-Notizen. ### Geändert - API: `PUT /settings/general` ändert nur noch die gesendeten Felder (Zeitzone, EOL-Vorwarnzeit, EOL-Alarme). - API: `POST /bulk/install-updates` versteht `approved`, `security_only` und `apt_mode`; `POST /devices/{id}/install-updates` versteht `security_only`. Update-Einträge tragen `version`, `current_version`, `source`, `security` und `kind`. - Check-Alarme bei Auto-Remediation werden erst gemeldet, wenn die Remediation nicht geholfen hat. - Geräteliste: Sammelleiste bestätigt inline statt per Browser-Dialog. - Web-UI: `no-cache` für index.html und `immutable` für gehashte Assets. - Übersicht: Diagramme füllen die Kachelbreite und sitzen mittig. ### Entfernt - Checkbox „Software-Änderungen nicht melden“ am Gerät (ersetzt durch die dreistufige Einstellung; stummgeschaltete Geräte werden zu *Nicht melden* migriert). API: `PUT /devices/{id}/mute-software` ersetzt durch `PUT/GET /devices/{id}/software-alerts`. ## [0.16.2] - 2026-09-29 ### Neu - Proxmox-Backups: Aufbewahrung „behalte die letzten N“ und Aufräumen voller Speicher. - Taskleisten-App: Detail-Panel mit Custom Fields, scharfer Text; als Download in den Einstellungen. - Geräteliste: nach fehlerhaftem Check filtern und Auswahl per Sammelaktion behandeln. - Viewer und Taskleisten-App: `--install` richtet alles in einem Schritt ein. ## [0.16.1] - 2026-09-22 ### Behoben - Backup-Check: erfolgreicher Lauf zählt, auch wenn das Zielgerät schläft. ## [0.16.0] - 2026-09-18 ### Neu - Zentrale Zeitzone für Backup- und Agent-Zeitpläne. - Backup-Zielspeicher je Gast. ## [0.15.0] - 2026-09-18 ### Neu - Backup-Bereich in den Richtlinien (serverseitig geplant, Startbedingung, Folgeaktion auf anderem Gerät). - Viewer-Downloads in den Einstellungen. ## [0.14.0] - 2026-09-13 ### Neu - Taskleisten-App (Tray + Fenster mit Check-/Task-Status, Terminal, Viewer, SFTP). - Proxmox-Gäste über den Agent auf dem PVE-Host (Start/Stop, Backup-Status). - Temperatursensoren mit Verlauf und Check `temperature`. [Unreleased]: https://github.com/boonkerz/roster/compare/v0.28.0...HEAD [0.28.0]: https://github.com/boonkerz/roster/compare/v0.27.0...v0.28.0 [0.27.0]: https://github.com/boonkerz/roster/compare/v0.26.0...v0.27.0 [0.26.0]: https://github.com/boonkerz/roster/compare/v0.25.0...v0.26.0 [0.25.0]: https://github.com/boonkerz/roster/compare/v0.24.1...v0.25.0 [0.24.1]: https://github.com/boonkerz/roster/compare/v0.24.0...v0.24.1 [0.24.0]: https://github.com/boonkerz/roster/compare/v0.23.3...v0.24.0 [0.23.3]: https://github.com/boonkerz/roster/compare/v0.23.2...v0.23.3 [0.23.2]: https://github.com/boonkerz/roster/compare/v0.23.1...v0.23.2 [0.23.1]: https://github.com/boonkerz/roster/compare/v0.23.0...v0.23.1 [0.23.0]: https://github.com/boonkerz/roster/compare/v0.22.0...v0.23.0 [0.22.0]: https://github.com/boonkerz/roster/compare/v0.21.6...v0.22.0 [0.21.6]: https://github.com/boonkerz/roster/compare/v0.21.5...v0.21.6 [0.21.5]: https://github.com/boonkerz/roster/compare/v0.21.4...v0.21.5 [0.21.4]: https://github.com/boonkerz/roster/compare/v0.21.3...v0.21.4 [0.21.3]: https://github.com/boonkerz/roster/compare/v0.21.2...v0.21.3 [0.21.2]: https://github.com/boonkerz/roster/compare/v0.21.1...v0.21.2 [0.21.1]: https://github.com/boonkerz/roster/compare/v0.21.0...v0.21.1 [0.21.0]: https://github.com/boonkerz/roster/compare/v0.20.2...v0.21.0 [0.20.2]: https://github.com/boonkerz/roster/compare/v0.20.1...v0.20.2 [0.20.1]: https://github.com/boonkerz/roster/compare/v0.20.0...v0.20.1 [0.20.0]: https://github.com/boonkerz/roster/compare/v0.19.1...v0.20.0 [0.19.1]: https://github.com/boonkerz/roster/compare/v0.19.0...v0.19.1 [0.19.0]: https://github.com/boonkerz/roster/compare/v0.18.19...v0.19.0 [0.18.19]: https://github.com/boonkerz/roster/compare/v0.18.18...v0.18.19 [0.18.18]: https://github.com/boonkerz/roster/compare/v0.18.17...v0.18.18 [0.18.17]: https://github.com/boonkerz/roster/compare/v0.18.16...v0.18.17 [0.18.16]: https://github.com/boonkerz/roster/compare/v0.18.15...v0.18.16 [0.18.15]: https://github.com/boonkerz/roster/compare/v0.18.14...v0.18.15 [0.18.14]: https://github.com/boonkerz/roster/compare/v0.18.13...v0.18.14 [0.18.13]: https://github.com/boonkerz/roster/compare/v0.18.12...v0.18.13 [0.18.12]: https://github.com/boonkerz/roster/compare/v0.18.11...v0.18.12 [0.18.11]: https://github.com/boonkerz/roster/compare/v0.18.10...v0.18.11 [0.18.10]: https://github.com/boonkerz/roster/compare/v0.18.9...v0.18.10 [0.18.9]: https://github.com/boonkerz/roster/compare/v0.18.8...v0.18.9 [0.18.8]: https://github.com/boonkerz/roster/compare/v0.18.7...v0.18.8 [0.18.7]: https://github.com/boonkerz/roster/compare/v0.18.6...v0.18.7 [0.18.6]: https://github.com/boonkerz/roster/compare/v0.18.5...v0.18.6 [0.18.5]: https://github.com/boonkerz/roster/compare/v0.18.4...v0.18.5 [0.18.4]: https://github.com/boonkerz/roster/compare/v0.18.3...v0.18.4 [0.18.3]: https://github.com/boonkerz/roster/compare/v0.18.2...v0.18.3 [0.18.2]: https://github.com/boonkerz/roster/compare/v0.18.1...v0.18.2 [0.18.1]: https://github.com/boonkerz/roster/compare/v0.18.0...v0.18.1 [0.18.0]: https://github.com/boonkerz/roster/compare/v0.17.3...v0.18.0 [0.17.3]: https://github.com/boonkerz/roster/compare/v0.17.2...v0.17.3 [0.17.2]: https://github.com/boonkerz/roster/compare/v0.17.1...v0.17.2 [0.17.1]: https://github.com/boonkerz/roster/compare/v0.17.0...v0.17.1 [0.17.0]: https://github.com/boonkerz/roster/compare/v0.16.2...v0.17.0 [0.16.2]: https://github.com/boonkerz/roster/compare/v0.16.1...v0.16.2 [0.16.1]: https://github.com/boonkerz/roster/compare/v0.16.0...v0.16.1 [0.16.0]: https://github.com/boonkerz/roster/compare/v0.15.0...v0.16.0 [0.15.0]: https://github.com/boonkerz/roster/compare/v0.14.0...v0.15.0 [0.14.0]: https://github.com/boonkerz/roster/releases/tag/v0.14.0