diff --git a/app/Support/NextcloudOcc.php b/app/Support/NextcloudOcc.php index 439dace..7b8240e 100644 --- a/app/Support/NextcloudOcc.php +++ b/app/Support/NextcloudOcc.php @@ -79,10 +79,20 @@ final class NextcloudOcc * * command() taugt fuer `--password-from-env`, wo occ selbst die * Umgebungsvariable liest. `config:system:set` kann das nicht: es will den - * Wert als Argument. Setzte die aeussere Shell ihn ein, stuende das - * Passwort in der Prozessliste der KUNDEN-VM — dort, wo jeder mit einer - * Shell auf der Maschine `ps` ausfuehren kann. So steht es nur in der des - * Containers. + * Wert als Argument. + * + * Ohne diese Methode staende der Wert an drei Stellen: im Argv der + * VM-Shell (wo HttpProxmoxClient::guestExec() die ganze Zeichenkette als + * ['/bin/sh', '-c', $command] uebergibt), im Argv des docker-Aufrufs, und + * im Argv von `php occ` im Container. Mit dieser Methode reist der Wert + * als Umgebungsvariable in den Container und wird erst dort von der `sh` + * eingesetzt — der Gewinn ist, dass er nicht im Prozessabbild DES + * CONTAINERS steht, wo jeder Nextcloud-Prozess und jeder, der sich + * hineinhängt, ihn aus der Umgebung auslesen kann. + * + * Der Wert bleibt im Argv der VM-Shell sichtbar, fuer die Dauer des + * Aufrufs: Debians `dash` (die Standard-Shell in den Kunden-VMs) + * optimiert den Elternprozess nicht weg, wie `bash` es täte. * * EHRLICHERWEISE ist das Hygiene, kein Schutz: Nextcloud legt * `mail_smtppassword` anschliessend im Klartext in config/config.php ab. diff --git a/tests/Feature/NextcloudOccTest.php b/tests/Feature/NextcloudOccTest.php index 686d6c1..f665752 100644 --- a/tests/Feature/NextcloudOccTest.php +++ b/tests/Feature/NextcloudOccTest.php @@ -2,19 +2,20 @@ use App\Support\NextcloudOcc; -it('setzt den Wert erst IM Container ein, nicht in der VM', function () { +it('haelt den Wert aus dem occ-Aufruf heraus', function () { $befehl = NextcloudOcc::commandExpandingEnv( 'config:system:set mail_smtppassword --value="$CLUPILOT_SMTP_PW"', ['CLUPILOT_SMTP_PW' => 'geheim'], ); - // Das Geheimnis steht als Zuweisung da (die aeussere Shell reicht es - // durch), aber der occ-Aufruf traegt nur den VARIABLENNAMEN — eingesetzt - // wird er von der sh INNERHALB des Containers. + // Der Wert steht als Zuweisung VOR dem docker-Aufruf (die aeussere Shell + // reicht ihn durch), aber der occ-Aufruf selbst (ab `sh -c`) traegt nur + // den VARIABLENNAMEN. Damit sitzt das Geheimnis nicht im Argv des + // Containers. expect($befehl)->toContain("CLUPILOT_SMTP_PW='geheim'") ->and($befehl)->toContain('-e CLUPILOT_SMTP_PW') ->and($befehl)->toContain('sh -c') - // Entscheidend: hinter `php occ` steht der Name, nicht der Wert. + // Entscheidend: ab `sh -c` (der Innenteil des Containers) steht nur der Name. ->and(substr($befehl, strpos($befehl, 'sh -c')))->not->toContain('geheim'); });