From ac1d5c9916bfc5ae6506a50feb49a669f899b31a Mon Sep 17 00:00:00 2001 From: Dogfather Date: Wed, 26 Aug 2026 19:37:45 +0200 Subject: [PATCH] Waechter: Rechte wurden gesetzt, aber wirkten nicht Nachgemessen: /var/lib/dogfather-waechter stand auf 755 -- weltweit lesbar, mit einer vollstaendigen Liste aller Dienste, Adressen und ihres Zustands darin. Also genau das, was der Commit von heute Nachmittag verhindern sollte. Die Absicht stand im Code, die Wirkung fehlte. Zwei Gruende, beide still: 1. "mode" bei mkdirSync gilt nur, wenn das Verzeichnis dabei NEU entsteht. Beim zweiten Lauf existiert es immer -- dann laesst mkdirSync die Rechte unberuehrt. Hier war es sogar schon vor dem Einbau der Zeile angelegt worden. 2. Selbst beim Neuanlegen zieht die umask des Prozesses Bits ab. Der Unterschied zur Sicherung ist lehrreich: /var/backups/dogfather steht korrekt auf 700, weil dort ein ausdrueckliches chmod im Skript steht. Dieselbe Ueberlegung, einmal umgesetzt und einmal nur gemeint. Jetzt chmod bei jedem Lauf, fuer Verzeichnis UND Dateien. Aufgefallen ist es nur, weil die Rechte nachgesehen wurden statt angenommen -- der Code sah richtig aus. Co-Authored-By: Claude Opus 5 --- server-internal/waechter.mjs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/server-internal/waechter.mjs b/server-internal/waechter.mjs index 0427ef64..e25ca3a5 100644 --- a/server-internal/waechter.mjs +++ b/server-internal/waechter.mjs @@ -37,7 +37,7 @@ ===================================================================== */ import { execFileSync } from "node:child_process"; -import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs"; +import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import tls from "node:tls"; @@ -303,8 +303,33 @@ async function meldung(titel, text) { Adressen und ihres Zustands -- fuer jemanden, der einen Angriff vorbereitet, eine bequeme Landkarte. Sie kostet nichts, also gibt es auch keinen Grund, sie herzugeben. */ +/* ⚠️ mode: 0o700 beim Anlegen REICHT NICHT (nachgemessen 26.08.2026). + + Zwei Gruende, und beide sind still: + + 1. "mode" gilt nur, wenn das Verzeichnis dabei NEU entsteht. Existiert + es schon -- und beim zweiten Lauf existiert es immer --, laesst + mkdirSync die Rechte unberuehrt. Das Verzeichnis war beim allerersten + Lauf entstanden, bevor diese Zeile ueberhaupt eingebaut war, und + blieb deshalb auf 755. + + 2. Selbst beim Neuanlegen zieht die umask des Prozesses noch Bits ab. + + Gemessen: /var/backups/dogfather steht auf 700, weil dort ein + ausdrueckliches chmod im Skript steht. /var/lib/dogfather-waechter + stand auf 755 -- weltweit lesbar, mit einer vollstaendigen Liste + aller Dienste, Adressen und ihres Zustands darin. + + Die Absicht stand also im Code, die Wirkung fehlte. Deshalb jetzt + ausdruecklich chmod, bei jedem Lauf, fuer Verzeichnis UND Datei. */ function verzeichnisSichern(pfad) { - mkdirSync(dirname(pfad), { recursive: true, mode: 0o700 }); + const ordner = dirname(pfad); + mkdirSync(ordner, { recursive: true, mode: 0o700 }); + try { chmodSync(ordner, 0o700); } catch { /* nicht Eigentuemer: dann eben nicht */ } +} + +function dateiSichern(pfad) { + try { chmodSync(pfad, 0o600); } catch { /* Datei noch nicht da */ } } function protokoll(text) { @@ -327,6 +352,7 @@ function zustandLesen() { function zustandSchreiben(z) { verzeichnisSichern(ZUSTAND_DATEI); writeFileSync(ZUSTAND_DATEI, JSON.stringify(z, null, 1), { encoding: "utf8", mode: 0o600 }); + dateiSichern(ZUSTAND_DATEI); } /* ---------------------------------------------------------------------