Zum Inhalt

Person austragen

Ungeprüft

Diese Anleitung ist noch nicht durchgespielt worden; Befehle, Bezeichnungen und erwartete Ausgaben können abweichen. Was noch zu prüfen ist, steht in todo/doku.md.

Ziel

Die Person kommt nicht mehr an Repo, Hosts, Webspaces, Vaultwarden und die Admin-Oberfläche von Authentik, und die Secrets und Tokens, die sie kannte, sind getauscht.

Voraussetzungen

Schritte

1. Stand holen und plan prüfen

Wie in Änderung ausrollen, Schritte 1 bis 3, für syslet/werner, syslet/containerhost und desec. Erwartet: Die Hosts zeigen No changes detected. All units are up to date., DNS zeigt keine Änderungen.

2. Zugang zum Repo entziehen

Entferne die Person in den Einstellungen der Organisation garagelab auf Codeberg aus dem Team, über das sie Zugriff auf garagelab/infra hat, oder in den Einstellungen des Repos unter „Collaborators“, falls sie dort einzeln eingetragen ist.

Erwartet: Sie steht weder im Team noch unter „Collaborators“.

3. SSH-Schlüssel auf beiden Hosts entfernen

Prüf zuerst, dass genau eine Zeile zum Kommentar passt:

Bash
ssh werner.garage-lab.de "grep -c '<name>@garagelab$' /root/.ssh/authorized_keys"
ssh vm-containerhost.garage-lab.net "grep -c '<name>@garagelab$' /root/.ssh/authorized_keys"

Erwartet: jeweils 1. Bei einer anderen Zahl hör hier auf und sieh dir die Datei an; sonst löschst du womöglich den Zugang einer anderen Person.

Bash
ssh werner.garage-lab.de "sed -i.bak '/<name>@garagelab$/d' /root/.ssh/authorized_keys"
ssh vm-containerhost.garage-lab.net "sed -i.bak '/<name>@garagelab$/d' /root/.ssh/authorized_keys"

sed legt vorher eine Kopie als authorized_keys.bak an. Wiederhol die grep-Befehle von oben. Erwartet: jeweils 0, und ssh werner.garage-lab.de hostname funktioniert für dich weiterhin.

Entferne denselben Schlüssel außerdem in der Web-Oberfläche von hosting.de bei den SSH-Zugängen der beiden Webspaces, für die Webseite und das Wiki (siehe hosting.de).

4. Zugang zu Vaultwarden entziehen

Entferne die Person in Vaultwarden aus der Organisation des Vereins.

Erwartet: Sie steht nicht mehr in der Liste der Mitglieder der Organisation.

5. Admin-Konto in Authentik deaktivieren

Öffne in der Admin-Oberfläche von Authentik unter Directory → Users das persönliche Admin-Konto der Person und deaktiviere es.

Erwartet: In der Liste steht bei dem Konto, dass es inaktiv ist.

6. age-Schlüssel entfernen und Datenschlüssel erneuern

Lösch in syslet/.sops.yaml die Zeile - &admin_<name> age1… unter keys: und in beiden creation_rules die Zeile - *admin_<name>.

Bash
git diff syslet/.sops.yaml

Erwartet: drei entfernte Zeilen, keine neuen.

Bash
1
2
3
4
cd syslet
sops updatekeys -y werner/creds-*.enc.yaml containerhost/creds-*.enc.yaml
for f in werner/creds-*.enc.yaml containerhost/creds-*.enc.yaml; do sops rotate -i "$f"; done
git status --short

updatekeys nimmt die Person aus den Empfängern, rotate verschlüsselt jede Datei mit einem neuen Datenschlüssel. Erwartet: git status zeigt syslet/.sops.yaml und alle creds-*.enc.yaml beider Hosts als geändert.

7. Tokens aus der .envrc tauschen

Die Person kennt die Tokens für deSEC und für Terraform aus ihrer .envrc (Arbeitsrechner einrichten, Schritt 9).

deSEC: Leg in der Web-Oberfläche von deSEC unter Tokens ein neues Token mit denselben Einstellungen wie das bisherige an. Ersetz es im Vaultwarden und in deiner .envrc und führ direnv allow aus.

Bash
cd desec
cue cmd plan

Erwartet: kein 401 oder 403, keine Änderungen. Lösch danach das alte Token bei deSEC.

Terraform: Tausch das Token von terraform-mgmt nach Terraform für Authentik einrichten, Schritte 1 bis 3.

8. Secrets tauschen

Tausch jedes Secret aus der Tabelle so:

  1. neuen Wert dort erzeugen, wo er herkommt (Spalte „Neuer Wert“); den alten dort noch nicht löschen
  2. neuen Wert mit sops edit eintragen wie in Secret anlegen oder ändern, Schritte 2 bis 4
  3. erst nach dem Ausrollen in Schritt 9 den alten Wert an der Quelle löschen
Datei Schlüssel Neuer Wert
creds-mailjet (beide Hosts) username, password neuer API-Schlüssel in der Web-Oberfläche von Mailjet: API Key als username, Secret Key als password
creds-caddy (beide Hosts) desectoken neues Token in der Web-Oberfläche von deSEC; ersetz danach die ID des alten Tokens unter desec: tokenPolicies in der Zonendatei des Hosts durch die ID des neuen (siehe Unsere Zonen)
creds-attraccess, creds-hedgedoc-server, creds-membertool-server sessionsecret openssl rand -hex 32; alle, die angemeldet sind, werden abgemeldet
creds-discourse-server, creds-engelsystem-server, creds-hedgedoc-server, creds-membertool-server, creds-nextcloud-aio-nextcloud oidcclientsecret in der Admin-Oberfläche von Authentik unter Applications → Providers beim Provider der App ein neues Client-Secret setzen; bis zum Ausrollen klappt der Login bei der App nicht
creds-membertool-server weblingapikey neuer API-Schlüssel in Webling
creds-membertool-server authentikapitoken neues Token in der Admin-Oberfläche von Authentik unter Directory → Tokens and App passwords, für denselben Benutzer wie das bisherige
creds-redirect-updater discoursetoken neuer API-Key in der Admin-Oberfläche von Discourse unter API, für denselben Benutzer wie der bisherige
creds-vaultwarden-server admintoken openssl rand -hex 32; den neuen Wert zusätzlich im Vaultwarden ablegen
creds-grafana (containerhost) adminpassword openssl rand -hex 32; Grafana übernimmt den Wert nur beim ersten Start, setz ihn deshalb nach dem Ausrollen zusätzlich mit podman exec grafana grafana cli admin reset-admin-password '<neues Passwort>' auf containerhost
creds-engelsystem-server adminpassword neues Passwort; ändere es zusätzlich in Engelsystem beim Admin-Konto

Die Secrets für das Backup (creds-backup, creds-resticserver) tauschst du hier nicht; dafür gibt es noch keine Anleitung.

Ändert sich ein desectoken, gehört auch die geänderte Zonendatei in desec/ dazu.

9. Ausrollen

Zuerst DNS, falls sich in Schritt 8 eine Zonendatei geändert hat, dann beide Hosts:

Bash
1
2
3
cd desec
cue cmd plan
cue cmd apply

Erwartet: Bei DNS ändern sich nur die Token-Policies.

Bash
1
2
3
cd ../syslet/werner
cue cmd plan
cue cmd apply

Erwartet: Unter Secret changes: stehen alle Secrets des Hosts, in der Summary alle Container, die Secrets nutzen, mit secret updated, restarted; bei der Frage Continue? (yes/no) tippe yes. Die Apps sind dabei kurz nicht erreichbar; such dir dafür eine ruhige Zeit aus. Dasselbe in syslet/containerhost.

Danach die alten Werte an den Quellen löschen (Schritt 8) und das Passwort in Grafana setzen.

Bash
cd ../../apps/authentik/tf-core
terraform plan

Erwartet: No changes. Your infrastructure matches the configuration., obwohl sich die Client-Secrets geändert haben.

10. Committen und pushen

Bash
1
2
3
4
cd ../../..
git add syslet desec
git commit -m "remove <name> as admin, rotate secrets"
git push

Erwartet: am Ende von git push eine Zeile main -> main.

11. Den anderen Bescheid geben

Sag allen anderen Admins in Signal, dass sie git pull ausführen und die neuen Tokens für deSEC und Terraform aus dem Vaultwarden in ihre .envrc übernehmen müssen.

Prüfen

  • cue cmd plan zeigt in syslet/werner und syslet/containerhost wieder No changes detected. All units are up to date., in desec keine Änderungen.
  • grep -c admin_<name> syslet/.sops.yaml gibt 0 aus.
  • Der Login per Authentik funktioniert bei Discourse, Engelsystem, HedgeDoc, Membertool und Nextcloud.
  • Mails kommen an, etwa eine Einladung aus Vaultwarden.

Wenn etwas schiefgeht

  • Du hast in Schritt 3 die falsche Zeile gelöscht: Auf dem Host liegt die alte Datei als /root/.ssh/authorized_keys.bak; kopier sie mit cp zurück, solange deine eigene Verbindung noch offen ist.
  • sops updatekeys oder sops rotate meldet Failed to get the data key: Du kannst die Dateien selbst nicht entschlüsseln; prüfe mit sops -d werner/creds-mailjet.enc.yaml, ob dein eigener Schlüssel funktioniert.
  • Eine App meldet beim Login invalid_client: Das Client-Secret in Authentik und im Secret stimmen nicht überein; vergleiche sie wie in App per OIDC anbinden.
  • Caddy bekommt für einen Namen kein Zertifikat mehr: Die ID in der Token-Policy passt nicht zum neuen Token; vergleiche sie mit der ID in der Web-Oberfläche von deSEC.
  • Ein Container kommt nach dem apply nicht wieder hoch: Container-Status und Logs ansehen