Secret-Datei mit KEY=VALUE-Zeile beim Start abweisen #2

Merged
nexus merged 1 commit from fix/secret-file-key-value into main 2026-08-04 18:34:17 +02:00
Owner

Aufgefallen durch die Frage, was in einer HETZNER_API_TOKEN_FILE eigentlich stehen muss.

Problem

Die Datei wird ganz gelesen und nur aussen getrimmt. Steht darin eine Zeile HETZNER_API_TOKEN=abc123, wird die komplette Zeile zum Token — Praefix inklusive.

Das Symptom ist ein 401. Das deutet auf ein falsches Token hin, nicht auf eine falsch aufgebaute Datei, und weil der Wert im Log redigiert wird, gibt es auch nichts zum Vergleichen. Eine naheliegende Annahme mit einer Fehlermeldung, die in die falsche Richtung zeigt.

Aenderung

Beim Start werden jetzt zwei Faelle erkannt und benannt:

HETZNER_API_TOKEN_FILE: file /run/secrets/tok contains HETZNER_API_TOKEN=… —
  it must hold the value alone, so just the 12 characters after the equals sign

HETZNER_API_TOKEN_FILE: file /run/secrets/tok has more than one line —
  it must hold the value alone, with nothing else in the file

Ein abschliessender Zeilenumbruch bleibt erlaubt, weil jeder Editor ihn schreibt.

Die Pruefung auf das KEY=-Praefix vergleicht bewusst gegen genau den erwarteten Variablennamen, nicht gegen ein allgemeines Muster. Ein Wert, der zufaellig ein = enthaelt — etwa Base64 mit Padding —, wird dadurch nicht faelschlich abgewiesen.

Dokumentation

README und .env.example sagen jetzt ausdruecklich, dass nur der blanke Wert in die Datei gehoert, mit Gegenbeispiel und printf-Befehl statt echo.

Getestet

  • Drei neue Testfaelle: KEY=VALUE abgewiesen, mehrzeilige Datei abgewiesen, abschliessender Zeilenumbruch akzeptiert
  • Praxistest mit falsch und richtig befuellter Datei gegen das gebaute Binary
  • make lint test-race gruen, 0 Lint-Issues, Domain-Schranke gruen
Aufgefallen durch die Frage, was in einer `HETZNER_API_TOKEN_FILE` eigentlich stehen muss. ## Problem Die Datei wird ganz gelesen und nur aussen getrimmt. Steht darin eine Zeile `HETZNER_API_TOKEN=abc123`, wird die **komplette Zeile** zum Token — Praefix inklusive. Das Symptom ist ein `401`. Das deutet auf ein falsches Token hin, nicht auf eine falsch aufgebaute Datei, und weil der Wert im Log redigiert wird, gibt es auch nichts zum Vergleichen. Eine naheliegende Annahme mit einer Fehlermeldung, die in die falsche Richtung zeigt. ## Aenderung Beim Start werden jetzt zwei Faelle erkannt und benannt: ``` HETZNER_API_TOKEN_FILE: file /run/secrets/tok contains HETZNER_API_TOKEN=… — it must hold the value alone, so just the 12 characters after the equals sign HETZNER_API_TOKEN_FILE: file /run/secrets/tok has more than one line — it must hold the value alone, with nothing else in the file ``` Ein abschliessender Zeilenumbruch bleibt erlaubt, weil jeder Editor ihn schreibt. Die Pruefung auf das `KEY=`-Praefix vergleicht bewusst gegen **genau den erwarteten Variablennamen**, nicht gegen ein allgemeines Muster. Ein Wert, der zufaellig ein `=` enthaelt — etwa Base64 mit Padding —, wird dadurch nicht faelschlich abgewiesen. ## Dokumentation README und `.env.example` sagen jetzt ausdruecklich, dass nur der blanke Wert in die Datei gehoert, mit Gegenbeispiel und `printf`-Befehl statt `echo`. ## Getestet - Drei neue Testfaelle: `KEY=VALUE` abgewiesen, mehrzeilige Datei abgewiesen, abschliessender Zeilenumbruch akzeptiert - Praxistest mit falsch und richtig befuellter Datei gegen das gebaute Binary - `make lint test-race` gruen, 0 Lint-Issues, Domain-Schranke gruen
Reject a secret file that holds a KEY=VALUE line
All checks were successful
CI / test (pull_request) Successful in 1m41s
CI / image (push) Successful in 36s
CI / test (push) Successful in 1m37s
CI / image (pull_request) Successful in 37s
5a0bbc2566
The file is read whole and trimmed, so writing HETZNER_API_TOKEN=… into it
made the prefix part of the token. The only symptom was a 401, which points at
the token being wrong rather than at the file being shaped wrong — and the
value is redacted in the log, so there was nothing to compare against either.

Both that and a file with a second line are now named at startup, and the
documentation says outright that only the bare value belongs in the file.
nexus merged commit d4c92006e9 into main 2026-08-04 18:34:17 +02:00
nexus deleted branch fix/secret-file-key-value 2026-08-04 18:34:17 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
nexus/hetzner-ddns!2
No description provided.