5 configuration
pijukka edited this page 2026-07-30 17:40:26 +02:00

Konfiguration und Secrets

Das Repository trennt öffentliche Deployment-Metadaten von verschlüsselten Credentials:

  • variables.nix enthält die eingecheckten Standard-Infrastrukturwerte.
  • variables-local.nix enthält lokale Overrides und ist git-ignoriert.
  • secrets/*.age enthält mit agenix verschlüsselte Credentials.

Infrastrukturparameter

variables-local.nix im Root des NixOS-Konfigurationsrepos anlegen:

{ ... }:
{
  domain = "example.org";
  domain2 = "example.net";
  adminEmail = "admin@example.org";
  ldapBaseDN = "dc=example,dc=org";
  publicIPv4 = "203.0.113.10";

  tailnetIPs = {
    blunix = "100.64.0.1";
    pinix = "100.64.0.2";
    dietpi = "100.64.0.3";
  };
}

Die lokale Datei wird automatisch geladen, wenn sie existiert. Sie ist für Domains, IP-Adressen, E-Mail-Adressen und LDAP-Benennung gedacht. Das sind Deployment-Parameter, keine Secrets.

Verschlüsselte Credentials

Niemals Passwörter, API-Tokens, private Keys oder OIDC-Client-Secrets in variables-local.nix oder einem Nix-String ablegen. Sie gehören in verschlüsselte *.age-Dateien.

Das aktive Inventar:

Secret Genutzt von Klartextformat
bindPW.age Prosody LDAP Prosody-Lua-Konfiguration
dns-challenge.age Traefik ACME Cloudflare-systemd-Environment-Datei
go-sendxmpp.age pinix-Webhooks rohes XMPP-Passwort
headscalePreAuthKey.age Tailscale-Clients roher Headscale-Pre-Auth-Key
lldapAdmin.age LLDAP, Dex, Radicale rohes LLDAP-Administratorpasswort
mailPW.age aerc und msmtp rohes Mailbox-Passwort
motd.age Prosody Prosody-Lua-Konfiguration
oauth2Cookie.age oauth2-proxy rohes Cookie-Verschlüsselungs-Secret
oidc*.age Dex und die genannte Anwendung rohes OIDC-Client-Secret
oidcGTSEnv.age GoToSocial GTS_OIDC_CLIENT_SECRET=...
resticPW.age Restic rohes Repository-Passwort
traefikBasicAuth.age Traefik-Dashboard htpasswd-Zeile user:password-hash
webdav.age WebDAV ENV_USERNAME=... und ENV_PASSWORD=...
wirelessSecretsFile.age wpa_supplicant key=value-Zeilen, referenziert über ext:key

oidcGTS.age und oidcGTSEnv.age enthalten dasselbe OIDC-Secret in zwei Formaten und müssen zusammen rotiert werden.

oidcOauth2.age und oauth2Cookie.age: oauth2-proxy nutzte sie, um 0ff.space mit Dex/LLDAP-Login zu schützen — seit 29.07.2026 deaktiviert (0ff.space ist offen erreichbar), oauth2-proxy selbst läuft weiter und der Schutz lässt sich in hosts/blunix/localServices/launcher.nix mit einer Zeile reaktivieren. Audiobookshelf und Quantum laufen auf fastpi (eigenständig betriebenes DietPi-Gerät im Tailnet, siehe Übersicht) — das lief zwischenzeitlich, ist aber seit 29.07.2026 wieder eingeschaltet; ihre rotierten OIDC-Secrets sind entsprechend einzutragen, falls das noch nicht geschehen ist.

Für das vollständige Inventar inklusive vorbereiteter und veralteter Dateien siehe secrets/README.md.

Agenix-Workflow

Empfänger-SSH-Public-Keys sind in secrets/secrets.nix registriert.

# Verschlüsselte Datei bearbeiten oder anlegen
agenix -e secrets/<name>.age

# Registrierte Dateien nach Empfänger-Änderungen neu verschlüsseln
agenix -r

# Nach versehentlich committetem Klartext suchen
nix run nixpkgs#gitleaks -- dir --redact .

Wenn ein Empfänger den Zugriff verliert, verhindert Rekeying künftige Entschlüsselung, kann aber bereits entschlüsselte Kopien nicht zurückholen. Das zugrunde liegende Passwort oder Token zusätzlich rotieren.

Nach dem Bearbeiten von Parametern oder Secrets den betroffenen Host vor dem Deployment evaluieren:

nix eval --raw \
  .#nixosConfigurations.<hostname>.config.system.build.toplevel.drvPath