Skip to content

Hinweis zur Token-Verschlüsselung (4.0.0): Multi-Modus bleibt außen vor, und der Systemschlüssel liegt im selben Archiv #1503

Description

@randomname32

Zuerst danke für 4.0.x — das Update lief hier sauber durch, und dass ihr euch
die Zugangsdaten überhaupt vorgenommen habt, finde ich gut. Beim Nacheintragen
der Token sind mir zwei Dinge aufgefallen, die ich gern zurückspiele. Beides
ist keine Fehlfunktion des Backups, eher eine Frage, wie weit die Zusage aus
der Release-Notiz reicht:

„Mit dieser Version wurde der Datensicherheit noch mehr Aufmerksamkeit
gewidmet, und die Werte für das Dropbox-Zugriffstoken, den Grafana-API-Schlüssel
und das InfluxDB-Token wurden verschlüsselt. Nach dem Update müssen diese Token
in der Backitup-Konfiguration erneut eingegeben werden!"

1. Im InfluxDB-Multi-Modus greift die Verschlüsselung nicht

encryptedNative in der io-package.json listet influxDBToken, also das
Einzelfeld. Bei aktiviertem „Backup mehrerer Systeme" nutzt der Adapter aber
influxDBEvents[].token — und Array-Elemente kann encryptedNative
prinzipbedingt nicht erfassen. Der Token bleibt dort im Klartext stehen:

$ iobroker object get system.adapter.backitup.0
...
"influxDBEvents": [
  { "dbName": "iobroker_14d", "nameSuffix": "14d", "token": "<88 Zeichen im Klartext>", ... },
  ...
]
"influxDBToken": ""        <- im Multi-Modus ungenutzt

Zum Vergleich steht cifsPassword daneben als $/aes-192-cbc:….

Für die anderen Multi-Tabellen gibt es den Entschlüsselungspfad ja schon —
decryptEvents() in src/main.ts behandelt ccuEvents[].pass,
mySqlEvents[].pass und pgSqlEvents[].pass. influxDBEvents[].token ist die
einzige Multi-Tabelle ohne Gegenstück, was für mich eher nach einer Lücke beim
Nachziehen aussieht als nach Absicht.

Von außen ist das schwer zu erkennen: die Spalte ist type: 'password' wie
überall sonst, wird also maskiert eingegeben. Wer die Release-Notiz liest und
den Token neu einträgt, geht verständlicherweise davon aus, dass er nun
verschlüsselt liegt.

2. Für gesicherte Daten trägt die Verschlüsselung nicht weit

Der Schlüssel wandert mit ins Backup. system.config.native.secret steht
unverschlüsselt in objects.jsonl, und genau diese Datei landet in
iobroker_<datum>_backupiobroker.tar.gz und damit bei Dropbox, Google Drive,
OneDrive, WebDAV oder FTP. An einem frischen Archiv nachgesehen:

$ tar -xzOf iobroker_2026_09_05-10_00_02_backupiobroker.tar.gz | grep -c -F "<Wert von system.config.native.secret>"
1

Wer das Archiv hat, hat also die verschlüsselten Werte und den Schlüssel dazu.
Das betrifft alle $/aes-…-Felder aller Adapter, nicht nur backitup — für die
adaptereigene decrypt() (XOR mit demselben Systemschlüssel) gilt es
entsprechend.

Der Nutzen bleibt damit: Schutz vor Blicken in die Admin-Oberfläche und vor
Werten in Logdateien. Das ist real und keine Kleinigkeit. Nur beim Szenario
„Archiv liegt in der Cloud" ändert sich nichts — und weil die Release-Notiz von
Datensicherheit spricht, könnte man das leicht mitlesen.

Randnotiz: der Dropbox-TokenRefresher liegt im Backup

Das Gleiche trifft die Dropbox-Zugangsdaten, und zwar an
encryptedNative vorbei. native.dropboxAccessToken ist nach dem Update
verschlüsselt; das tatsächlich genutzte Credential liegt aber im State
backitup.0.info.dropboxTokens, den der TokenRefresher gegen
https://oauth2.iobroker.in/dropbox pflegt (src/main.ts, instanceObjects
in der io-package.json). Dieser State ist unverschlüsselt und enthält neben
dem kurzlebigen access_token auch den nicht ablaufenden refresh_token.

States sichert backitup mit, in backup/states.jsonl:

$ tar -xzf iobroker_2026_09_05-10_00_02_backupiobroker.tar.gz
$ grep -rl "<Wert von refresh_token>" .
backup/states.jsonl

Der TokenRefresher kommt aus adapter-core, das Speichermuster ist also nichts
backitup-Eigenes — backitup ist nur die Stelle, an der der State das Haus
verlässt. Ich erwähne es, weil es für Dropbox genau den Punkt betrifft, den die
Verschlüsselung von native.dropboxAccessToken adressieren wollte.

Ideen, falls hilfreich

  1. influxDBEvents[].token analog zu den anderen Multi-Tabellen behandeln —
    dann ist das Verhalten wenigstens in sich stimmig. Falls das aus anderen
    Gründen nicht gewollt ist, wäre auch ein Hinweis in der Oberfläche bei
    aktiviertem Multi-Modus schon viel wert.
  2. Vielleicht ein Satz in der Doku oder Release-Notiz dazu, wogegen die
    Verschlüsselung schützt und wogegen nicht. Das nimmt Erwartungen raus, ohne
    dass sich am Code etwas ändern muss.
  3. Ob der Refresh-Token wirklich in einem normalen State liegen muss, ist wohl
    eher eine Frage an adapter-core als an euch — wollte es aber nicht
    unerwähnt lassen.
  4. Wirklich zu lösen wäre der Cloud-Fall nur über eine Verschlüsselung des
    Archivs selbst mit einer Passphrase, die nicht in ioBroker liegt. Mir ist
    klar, dass das eine deutlich größere Sache ist und vermutlich weit über
    diese Meldung hinausgeht — ich nenne es nur der Vollständigkeit halber.

Wenn etwas davon schon bekannt oder bewusst so entschieden ist, ignoriert es
einfach. Falls ihr Details oder Tests aus meinem Setup braucht, liefere ich
gern nach.

Umgebung

  • Backitup 4.0.3, js-controller 7.2, Node 22
  • InfluxDB 2.9.1, InfluxDB-Backup im Multi-Modus mit vier Buckets
  • Dropbox als Ziel aktiv

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions