From e518e750229c4f66f0006963c2a346b283e20608 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Mon, 12 Oct 2026 13:02:11 +0200 Subject: [PATCH 1/2] feat(abgleich): Drift-Erkennung, Zeitplan und Uebernahme (#021, #022) Ein Abgleich liest je Host alle authorized_keys in einem SSH-Aufruf, als jeweiliger Benutzer, und vergleicht sie mit dem Soll: fehlende, von Hand geaenderte und unbekannte Keys, falsche Rechte, beschaedigte Bloecke und veraenderte Private Keys. Befunde werden geoeffnet und wieder geschlossen, Zustaende von Verwendungen und Host nachgezogen. Auf dem Host aendert der Abgleich nichts. Der Zeitplan liegt in pg-boss und feuert auch bei mehreren Workern nur einmal. Auf der Hostseite stehen Abweichungen und der Ist-Zustand je Benutzer; unbekannte Keys lassen sich uebernehmen - nur bekannt machen oder mit Dry-Run in den verwalteten Block holen. Co-Authored-By: Claude Opus 5.5 --- docs/issues/021-abgleich-drift.md | 17 +- docs/issues/022-import.md | 12 +- .../migration.sql | 2 + prisma/schema.prisma | 3 + src/app/(app)/hosts/[id]/page.tsx | 13 + src/app/(app)/page.tsx | 5 +- src/components/abgleich/AbgleichKarten.tsx | 139 ++++++++ .../abgleich/AlleAbgleichenKnopf.tsx | 33 ++ src/components/abgleich/UebernehmenDialog.tsx | 91 +++++ src/lib/ssh/abgleich.ts | 165 +++++++++ src/lib/ssh/authorized-keys.ts | 21 +- src/server/actions/abgleich.ts | 58 ++++ src/server/queries/abgleich.ts | 46 +++ src/server/services/abgleich.ts | 32 ++ src/server/services/soll.ts | 7 +- src/server/services/uebernahme.ts | 105 ++++++ src/worker/ablaeufe/abgleich.ts | 314 ++++++++++++++++++ src/worker/ablaeufe/ausrollen.ts | 4 +- src/worker/handler.ts | 4 +- src/worker/index.ts | 20 +- tests/integration/abgleich.test.ts | 169 ++++++++++ tests/integration/hilfen/host.ts | 3 +- tests/ssh/abgleich.test.ts | 81 +++++ tests/ssh/authorized-keys.test.ts | 11 + 24 files changed, 1334 insertions(+), 21 deletions(-) create mode 100644 prisma/migrations/20261012131000_verwendung_ausserhalb_entfernen/migration.sql create mode 100644 src/components/abgleich/AbgleichKarten.tsx create mode 100644 src/components/abgleich/AlleAbgleichenKnopf.tsx create mode 100644 src/components/abgleich/UebernehmenDialog.tsx create mode 100644 src/lib/ssh/abgleich.ts create mode 100644 src/server/actions/abgleich.ts create mode 100644 src/server/queries/abgleich.ts create mode 100644 src/server/services/abgleich.ts create mode 100644 src/server/services/uebernahme.ts create mode 100644 src/worker/ablaeufe/abgleich.ts create mode 100644 tests/integration/abgleich.test.ts create mode 100644 tests/ssh/abgleich.test.ts diff --git a/docs/issues/021-abgleich-drift.md b/docs/issues/021-abgleich-drift.md index b75aae0..790103e 100644 --- a/docs/issues/021-abgleich-drift.md +++ b/docs/issues/021-abgleich-drift.md @@ -1,20 +1,27 @@ # #021 Abgleich und Drift-Erkennung -**Status:** offen +**Status:** erledigt **Meilenstein:** v0.4.0 **Labels:** backend -**Geschätzt:** 3 h **Tatsächlich:** – +**Geschätzt:** 3 h **Tatsächlich:** 0 h 45 min ## Ziel Periodischer und manueller Abgleich, Befunde je Host/Benutzer. ## Aufgaben -- [ ] Zeitplan konfigurierbar -- [ ] Befundarten +- [x] Zeitplan konfigurierbar +- [x] Befundarten ## Akzeptanzkriterien -- [ ] Integrationstest +- [x] Integrationstest ## Abhängigkeiten #016 ## Notizen / Entscheidungen +- **Ein SSH-Aufruf je Host** liest `authorized_keys` aller Benutzer mit UID 0 oder ≥ 1000 plus aller Benutzer mit Zuweisungen – als jeweiliger Benutzer, base64-kodiert (Zeilenenden und fremde Bytes kommen unversehrt an). Dazu Rechte und Eigentümer von `~/.ssh` und Datei. +- **Befunde** (rein, `src/lib/ssh/abgleich.ts`): fehlender Key im Block, Block von Hand geändert (zusätzlicher Key oder andere Optionen), unbekannter Key außerhalb (bekannte Keys außerhalb sind kein Befund), Rechte (für Gruppe/Welt beschreibbar oder fremder Eigentümer), beschädigter Block, Private Key fehlt oder verändert (Hash gegen den versiegelten Key). +- **Abweichungen** werden geöffnet und – sobald behoben – geschlossen, nie doppelt. Host-Key-Abweichungen bleiben bei #009. +- **Zustände:** Public-Verwendungen AUSGEROLLT ↔ ABWEICHUNG, GEPLANT bleibt bis zum Ausrollen; Host SYNCHRON/DRIFT, letzter Abgleich, erreichbar. +- **Zeitplan** über pg-boss (`SSHKV_SYNC_CRON`, Standard `30 2 * * *`, Europe/Berlin) – liegt in der Datenbank, feuert also auch bei mehreren Workern nur einmal. Hosts mit laufendem Abgleich werden übersprungen. +- **Ändert nichts auf dem Host.** Korrekturen laufen über Dry-Run und Ausrollen. +- `DATEI_GEAENDERT` meldet nur einen beschädigten Block; eine bloße Hash-Änderung ist kein Befund, weil sshkv selbst schreibt. diff --git a/docs/issues/022-import.md b/docs/issues/022-import.md index 4b60741..6c09f13 100644 --- a/docs/issues/022-import.md +++ b/docs/issues/022-import.md @@ -1,19 +1,23 @@ # #022 Import bestehender Schlüssel -**Status:** offen +**Status:** erledigt **Meilenstein:** v0.4.0 **Labels:** backend, ui -**Geschätzt:** 2 h **Tatsächlich:** – +**Geschätzt:** 2 h **Tatsächlich:** 0 h 20 min ## Ziel Unbekannte Schlüssel eines Hosts übernehmen und zuordnen. ## Aufgaben -- [ ] wird zu Beginn der Phase verfeinert +- [x] wird zu Beginn der Phase verfeinert ## Akzeptanzkriterien -- [ ] wird zu Beginn der Phase verfeinert +- [x] wird zu Beginn der Phase verfeinert ## Abhängigkeiten #021 ## Notizen / Entscheidungen +- **Grundlage ist die letzte Beobachtung** des Abgleichs: Übernommen wird nur, was sshkv dort wirklich gesehen hat. +- **Zwei Wege:** „bekannt“ (nur als Schlüssel aufnehmen – der Befund verschwindet, auf dem Host ändert sich nichts) oder „verwalten“ (Zuweisung mit `ausserhalbEntfernen`: beim nächsten Ausrollen wandert die Zeile mit ihren Optionen in den Block, die alte Zeile außerhalb verschwindet – mit Dry-Run). +- Neues Feld `PublicVerwendung.ausserhalbEntfernen` (Migration `20261012131000`). Ohne dieses Feld fasst sshkv Zeilen außerhalb des Blocks weiterhin nie an. +- Optionen der Zeile werden mit `optionenPruefen` übernommen; unbekannte Optionen verhindern das Verwalten mit klarer Meldung. diff --git a/prisma/migrations/20261012131000_verwendung_ausserhalb_entfernen/migration.sql b/prisma/migrations/20261012131000_verwendung_ausserhalb_entfernen/migration.sql new file mode 100644 index 0000000..f9f6586 --- /dev/null +++ b/prisma/migrations/20261012131000_verwendung_ausserhalb_entfernen/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "PublicVerwendung" ADD COLUMN "ausserhalbEntfernen" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 38d6161..f372c12 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -333,6 +333,9 @@ model PublicVerwendung { zielbenutzer String /// authorized_keys-Optionen, z. B. restrict,from="10.0.0.12". optionen String? + /// Beim Ausrollen dieselbe Zeile ausserhalb des Blocks entfernen – nur fuer uebernommene + /// Keys (#022), sonst fasst sshkv fremde Zeilen nie an. + ausserhalbEntfernen Boolean @default(false) zustand VerwendungsZustand @default(GEPLANT) zuletztAngewendetAm DateTime? angelegtVonId String? diff --git a/src/app/(app)/hosts/[id]/page.tsx b/src/app/(app)/hosts/[id]/page.tsx index 8ddf26d..ba0a910 100644 --- a/src/app/(app)/hosts/[id]/page.tsx +++ b/src/app/(app)/hosts/[id]/page.tsx @@ -18,7 +18,9 @@ import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { hostDetail, type HostDetail } from "@/server/queries/hosts"; import { BootstrapAktionen } from "./BootstrapAktionen"; import { sshdHinweise } from "@/lib/sshd-hinweise"; +import { AbgleichKarten } from "@/components/abgleich/AbgleichKarten"; import { AusrollenPanel } from "@/components/ausrollen/AusrollenPanel"; +import { istZustand } from "@/server/queries/abgleich"; import { VerwendungsZustand } from "@/components/ausrollen/VerwendungsZustand"; import { verwendungenAufHost } from "@/server/queries/ziele"; import { HostKeyAktionen } from "./HostKeyAktionen"; @@ -100,6 +102,7 @@ export default async function HostSeite({ params }: { params: Promise<{ id: stri const darfEntscheiden = darf(benutzer.rolle, "hostKeyEntscheiden") && !archiviert; const darfAusrollen = darf(benutzer.rolle, "publicKeyAusrollen") && !archiviert; const verwendungen = await verwendungenAufHost(host.id); + const ist = await istZustand(host.id); const jetzt = new Date(); return ( @@ -295,6 +298,16 @@ export default async function HostSeite({ params }: { params: Promise<{ id: stri )} + {host.bootstrapAm && ( + + )} + {verwalten && (
diff --git a/src/app/(app)/page.tsx b/src/app/(app)/page.tsx index 775a60f..bd5151c 100644 --- a/src/app/(app)/page.tsx +++ b/src/app/(app)/page.tsx @@ -1,4 +1,4 @@ -import { ArrowRight, Plus, RefreshCw, Route } from "lucide-react"; +import { ArrowRight, Plus, Route } from "lucide-react"; import type { Metadata } from "next"; import Link from "next/link"; import { @@ -10,6 +10,7 @@ import { letzterAbgleich, type AktionsArt, } from "@/beispiel/uebersicht"; +import { AlleAbgleichenKnopf } from "@/components/abgleich/AlleAbgleichenKnopf"; import { Badge } from "@/components/ui/Badge"; import { Button } from "@/components/ui/Button"; import { Karte } from "@/components/ui/Karte"; @@ -52,7 +53,7 @@ export default async function Uebersicht() { } aktionen={ <> - + diff --git a/src/components/abgleich/AbgleichKarten.tsx b/src/components/abgleich/AbgleichKarten.tsx new file mode 100644 index 0000000..80c43f2 --- /dev/null +++ b/src/components/abgleich/AbgleichKarten.tsx @@ -0,0 +1,139 @@ +import { Badge } from "@/components/ui/Badge"; +import { Karte } from "@/components/ui/Karte"; +import { Leerzustand } from "@/components/ui/Leerzustand"; +import { VorgangsKnopf } from "@/components/vorgang/VorgangsKnopf"; +import { datumZeit } from "@/lib/format"; +import { abgleichAktion } from "@/server/actions/abgleich"; +import type { IstZustand } from "@/server/queries/abgleich"; +import { UebernehmenDialog } from "./UebernehmenDialog"; + +/** Abweichungen und Ist-Zustand eines Hosts (#021, #022). */ +const ART_TEXT: Record = { + UNBEKANNTER_SCHLUESSEL: "Unbekannter Schlüssel", + FEHLENDER_SCHLUESSEL: "Schlüssel fehlt", + ZUSAETZLICH_IM_BLOCK: "Block von Hand geändert", + DATEI_GEAENDERT: "Block beschädigt", + RECHTE: "Rechte", + HOSTKEY_GEAENDERT: "Host-Key geändert", + PRIVATE_KEY_FEHLT: "Private Key fehlt/verändert", +}; + +const HERKUNFT: Record = { + verwaltet: { text: "verwaltet", variante: "ok" }, + bekannt: { text: "bekannt", variante: "neutral" }, + fremd: { text: "unbekannt", variante: "gefahr" }, +}; + +export function AbgleichKarten({ + hostId, + zustand, + darfAbgleichen, + darfUebernehmen, + darfVerwalten, +}: { + hostId: string; + zustand: IstZustand; + darfAbgleichen: boolean; + darfUebernehmen: boolean; + darfVerwalten: boolean; +}) { + return ( + <> + + ) : null + } + > + {zustand.abweichungen.length === 0 ? ( +

● Keine offenen Abweichungen.

+ ) : ( +
    + {zustand.abweichungen.map((a) => ( +
  • + + ● {ART_TEXT[a.art] ?? a.art} + {a.zielbenutzer && ( + · {a.zielbenutzer} + )} + + {a.text} + + {a.fingerprint ? `${a.fingerprint} · ` : ""}seit {datumZeit(a.eroeffnetAm)} + +
  • + ))} +
+ )} +
+ + + {zustand.beobachtungen.length === 0 ? ( + + ) : ( +
+ {zustand.beobachtungen.map((b) => ( +
+

+ {b.zielbenutzer}{" "} + · {datumZeit(b.beobachtetAm)} +

+ {b.eintraege.length === 0 ? ( +

Datei leer.

+ ) : ( +
    + {b.eintraege.map((e) => { + const herkunft = HERKUNFT[e.herkunft]!; + return ( +
  • +
    +

    + {e.typ} {e.fingerprint} +

    +

    + {e.kommentar || "(ohne Kommentar)"} + {e.optionen ? ` · ${e.optionen}` : ""} + {e.imBlock ? " · im verwalteten Block" : ""} +

    +
    +
    + {herkunft.text} + {e.herkunft === "fremd" && darfUebernehmen && ( + + )} +
    +
  • + ); + })} +
+ )} +
+ ))} +
+ )} +
+ + ); +} diff --git a/src/components/abgleich/AlleAbgleichenKnopf.tsx b/src/components/abgleich/AlleAbgleichenKnopf.tsx new file mode 100644 index 0000000..1a1e0c0 --- /dev/null +++ b/src/components/abgleich/AlleAbgleichenKnopf.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { RefreshCw } from "lucide-react"; +import { useState, useTransition } from "react"; +import { Button } from "@/components/ui/Button"; +import { alleAbgleichenAktion } from "@/server/actions/abgleich"; + +/** „Jetzt abgleichen“ auf der Uebersicht (#021): reiht fuer jeden Host einen Abgleich ein. */ +export function AlleAbgleichenKnopf() { + const [meldung, setMeldung] = useState(); + const [laeuft, starten] = useTransition(); + return ( + + + {meldung && ( + + {meldung} + + )} + + ); +} diff --git a/src/components/abgleich/UebernehmenDialog.tsx b/src/components/abgleich/UebernehmenDialog.tsx new file mode 100644 index 0000000..3923b45 --- /dev/null +++ b/src/components/abgleich/UebernehmenDialog.tsx @@ -0,0 +1,91 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import { Ankreuzfeld, Button, Feld, Formularfehler } from "@/components/ui"; +import { Auswahlliste } from "@/components/ui/Feld"; +import { useFormularAktion } from "@/components/hosts/useFormularAktion"; +import { uebernehmenAktion } from "@/server/actions/abgleich"; + +/** Fremden Key aus dem Ist-Zustand uebernehmen (#022). */ +export function UebernehmenDialog({ + hostId, + zielbenutzer, + fingerprint, + kommentar, + personen, + darfVerwalten, +}: { + hostId: string; + zielbenutzer: string; + fingerprint: string; + kommentar: string; + personen: { id: string; name: string }[]; + darfVerwalten: boolean; +}) { + const dialog = useRef(null); + const [offen, setOffen] = useState(false); + const [verwalten, setVerwalten] = useState(darfVerwalten); + const { zustand, absenden, laeuft } = useFormularAktion(async (vorher, formular) => { + const ergebnis = await uebernehmenAktion(vorher, formular); + if (!ergebnis.fehler && !ergebnis.feldfehler) setOffen(false); + return ergebnis; + }); + + useEffect(() => { + const element = dialog.current; + if (!element) return; + if (offen && !element.open) element.showModal(); + if (!offen && element.open) element.close(); + }, [offen]); + + return ( + <> + + setOffen(false)} + className="border-border-strong bg-surface text-text rounded-karte m-auto w-[calc(100%-32px)] max-w-lg border p-5 backdrop:bg-black/70 sm:p-6" + > +

Schlüssel übernehmen

+

+ {zielbenutzer} · {fingerprint} +

+
+ + + + + + + + + + + + {personen.map((p) => ( + + ))} + + {darfVerwalten && ( + setVerwalten(e.target.checked)} + beschriftung="In den verwalteten Block holen" + erklaerung="Beim nächsten Ausrollen wandert die Zeile in den Block, die alte Zeile außerhalb wird entfernt – mit Dry-Run." + /> + )} + + +
+ + ); +} diff --git a/src/lib/ssh/abgleich.ts b/src/lib/ssh/abgleich.ts new file mode 100644 index 0000000..6adef5f --- /dev/null +++ b/src/lib/ssh/abgleich.ts @@ -0,0 +1,165 @@ +import { + authorizedKeysLesen, + blockSetzen, + type SchluesselZeile, + type SollEintrag, +} from "@/lib/ssh/authorized-keys"; + +/** + * Abgleich einer authorized_keys mit dem Soll (#021) – rein, damit jede Befundregel einzeln + * testbar ist. Der Worker liefert Inhalt und Rechte, die Datenbank Soll und bekannte Keys. + * + * Befundarten: + * - FEHLENDER_SCHLUESSEL: ein zugewiesener Key fehlt im verwalteten Block. + * - ZUSAETZLICH_IM_BLOCK: im Block steht etwas, das nicht (mehr) zugewiesen ist – oder mit + * anderen Optionen. Jemand hat den Block von Hand bearbeitet. + * - UNBEKANNTER_SCHLUESSEL: ausserhalb des Blocks steht ein Key, den sshkv gar nicht kennt. + * Bekannte Keys ausserhalb des Blocks sind kein Befund (sie wurden bewusst dort gelassen). + * - RECHTE: ~/.ssh oder die Datei sind fuer Gruppe/Welt beschreibbar (sshd ignoriert sie dann + * bei StrictModes) oder gehoeren nicht dem Benutzer. + * - DATEI_GEAENDERT: der verwaltete Block ist beschaedigt (Anfang ohne Ende o. Ae.). + */ +export type Befund = { + readonly art: + "FEHLENDER_SCHLUESSEL" | "ZUSAETZLICH_IM_BLOCK" | "UNBEKANNTER_SCHLUESSEL" | "RECHTE" | "DATEI_GEAENDERT"; + readonly fingerprint?: string; + readonly text: string; +}; + +/** Was der Hostdetail-Seite je Zeile gezeigt wird – nur oeffentliche Angaben. */ +export type IstEintrag = { + readonly fingerprint: string; + readonly typ: string; + readonly kommentar: string; + readonly optionen: string | null; + readonly imBlock: boolean; + /** verwaltet = im Soll; bekannt = in sshkv, aber hier nicht zugewiesen; fremd = unbekannt. */ + readonly herkunft: "verwaltet" | "bekannt" | "fremd"; + /** Die ganze Zeile, damit sich ein fremder Key uebernehmen laesst (#022). */ + readonly zeile: string; +}; + +export type DateiRechte = { + /** Oktal wie `stat -c %a`, z. B. "700". */ + readonly sshVerzeichnis: string | null; + readonly datei: string | null; + readonly eigentuemerPasst: boolean; +}; + +export type AbgleichErgebnis = { + readonly befunde: Befund[]; + readonly eintraege: IstEintrag[]; + /** Fingerprints des Solls, die im Block korrekt stehen. */ + readonly vorhanden: string[]; +}; + +function beschreibbarFuerAndere(modus: string | null): boolean { + if (!modus) return false; + const zahl = Number.parseInt(modus, 8); + return Number.isFinite(zahl) && (zahl & 0o022) !== 0; +} + +function zeileText(zeile: SchluesselZeile): string { + return zeile.roh.endsWith("\r") ? zeile.roh.slice(0, -1) : zeile.roh; +} + +export function authorizedKeysAbgleichen( + inhalt: string | null, + soll: readonly SollEintrag[], + bekannteFingerprints: ReadonlySet, + rechte?: DateiRechte, +): AbgleichErgebnis { + const befunde: Befund[] = []; + const datei = authorizedKeysLesen(inhalt ?? ""); + + if (datei.block.art === "beschaedigt") { + befunde.push({ art: "DATEI_GEAENDERT", text: `Verwalteter Block beschädigt: ${datei.block.grund}` }); + } + if (rechte) { + if (beschreibbarFuerAndere(rechte.sshVerzeichnis)) { + befunde.push({ art: "RECHTE", text: `~/.ssh hat die Rechte ${rechte.sshVerzeichnis} (erwartet 700).` }); + } + if (beschreibbarFuerAndere(rechte.datei)) { + befunde.push({ art: "RECHTE", text: `authorized_keys hat die Rechte ${rechte.datei} (erwartet 600).` }); + } + if (!rechte.eigentuemerPasst) { + befunde.push({ art: "RECHTE", text: "~/.ssh oder authorized_keys gehört nicht dem Benutzer." }); + } + } + + const sollNachFingerprint = new Map(soll.map((e) => [e.fingerprint, e])); + const schluessel = datei.zeilen.filter((z): z is SchluesselZeile => z.art === "schluessel"); + const imBlock = schluessel.filter((z) => z.imBlock); + + // Erwartete Zeile im Block, genau wie blockSetzen sie schreibt – dann faellt auch eine + // geaenderte Option auf. + const erwartet = new Map(); + if (soll.length) { + const muster = authorizedKeysLesen(blockSetzen("", soll).inhalt).zeilen.filter( + (z): z is SchluesselZeile => z.art === "schluessel", + ); + for (const zeile of muster) erwartet.set(zeile.fingerprint, zeileText(zeile)); + } + + const vorhanden: string[] = []; + for (const eintrag of soll) { + const treffer = imBlock.find((z) => z.fingerprint === eintrag.fingerprint); + if (!treffer) { + befunde.push({ + art: "FEHLENDER_SCHLUESSEL", + fingerprint: eintrag.fingerprint, + text: "Zugewiesener Schlüssel fehlt im verwalteten Block.", + }); + } else if (zeileText(treffer) !== erwartet.get(eintrag.fingerprint)) { + befunde.push({ + art: "ZUSAETZLICH_IM_BLOCK", + fingerprint: eintrag.fingerprint, + text: "Schlüssel steht mit anderen Optionen im Block als zugewiesen.", + }); + } else { + vorhanden.push(eintrag.fingerprint); + } + } + for (const zeile of imBlock) { + if (!sollNachFingerprint.has(zeile.fingerprint)) { + befunde.push({ + art: "ZUSAETZLICH_IM_BLOCK", + fingerprint: zeile.fingerprint, + text: "Im verwalteten Block steht ein Schlüssel, der hier nicht zugewiesen ist.", + }); + } + } + for (const zeile of schluessel.filter((z) => !z.imBlock)) { + if (!bekannteFingerprints.has(zeile.fingerprint)) { + befunde.push({ + art: "UNBEKANNTER_SCHLUESSEL", + fingerprint: zeile.fingerprint, + text: `Unbekannter Schlüssel außerhalb des Blocks${zeile.kommentar ? ` („${zeile.kommentar}“)` : ""}.`, + }); + } + } + + const eintraege: IstEintrag[] = schluessel.map((zeile) => ({ + fingerprint: zeile.fingerprint, + typ: zeile.typ, + kommentar: zeile.kommentar, + optionen: zeile.optionen, + imBlock: zeile.imBlock, + herkunft: sollNachFingerprint.has(zeile.fingerprint) + ? "verwaltet" + : bekannteFingerprints.has(zeile.fingerprint) + ? "bekannt" + : "fremd", + zeile: zeileText(zeile), + })); + + // Doppelte Befunde (derselbe Key zweimal ausserhalb) nur einmal. + const gesehen = new Set(); + const eindeutig = befunde.filter((b) => { + const schluesselText = `${b.art}\u0000${b.fingerprint ?? b.text}`; + if (gesehen.has(schluesselText)) return false; + gesehen.add(schluesselText); + return true; + }); + return { befunde: eindeutig, eintraege, vorhanden }; +} diff --git a/src/lib/ssh/authorized-keys.ts b/src/lib/ssh/authorized-keys.ts index b033d31..d553d6c 100644 --- a/src/lib/ssh/authorized-keys.ts +++ b/src/lib/ssh/authorized-keys.ts @@ -197,6 +197,12 @@ export function blockSetzen( inhalt: string, soll: readonly SollEintrag[], pflicht: readonly string[] = [], + /** + * Fingerprints, deren Zeilen ausserhalb des Blocks entfernt werden (#022): nur fuer Keys, + * die ein Mensch ausdruecklich in die Verwaltung uebernommen hat. Sonst gilt: fremde + * Zeilen bleiben bytegenau stehen. + */ + ausserhalbEntfernen: readonly string[] = [], ): BlockErgebnis { const datei = authorizedKeysLesen(inhalt); if (datei.block.art === "beschaedigt") { @@ -227,11 +233,18 @@ export function blockSetzen( let rohNeu: string[]; let endetMitZeilenende = datei.endetMitZeilenende; + const entfernen = new Set(ausserhalbEntfernen); + const bleibt = (z: Zeile) => !(z.art === "schluessel" && !z.imBlock && entfernen.has(z.fingerprint)); const roh = datei.zeilen.map((z) => z.roh); + const rohOhne = (von: number, bis?: number) => + datei.zeilen + .slice(von, bis) + .filter(bleibt) + .map((z) => z.roh); if (datei.block.art === "ok") { - rohNeu = [...roh.slice(0, datei.block.anfang), ...neuerBlock, ...roh.slice(datei.block.ende + 1)]; + rohNeu = [...rohOhne(0, datei.block.anfang), ...neuerBlock, ...rohOhne(datei.block.ende + 1)]; } else { - rohNeu = [...roh, ...neuerBlock]; + rohNeu = [...rohOhne(0), ...neuerBlock]; // Ein neuer Block beginnt auf einer eigenen Zeile; die bisher letzte Zeile bekommt dafuer // ihre fehlende Zeilenschaltung – die einzige Aenderung ausserhalb des Blocks. endetMitZeilenende = true; @@ -241,7 +254,9 @@ export function blockSetzen( const hinweise: string[] = []; const ausserhalb = datei.zeilen.filter((z): z is SchluesselZeile => z.art === "schluessel" && !z.imBlock); for (const eintrag of eintraege) { - const doppelt = ausserhalb.find((z) => z.fingerprint === eintrag.fingerprint); + const doppelt = ausserhalb.find( + (z) => z.fingerprint === eintrag.fingerprint && !entfernen.has(z.fingerprint), + ); if (doppelt) { hinweise.push( `${eintrag.fingerprint} steht zusätzlich außerhalb des Blocks${doppelt.optionen ? "" : " – dort ohne Einschränkungen"}.`, diff --git a/src/server/actions/abgleich.ts b/src/server/actions/abgleich.ts new file mode 100644 index 0000000..32100f7 --- /dev/null +++ b/src/server/actions/abgleich.ts @@ -0,0 +1,58 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { z } from "@/lib/validierung"; +import { akteurVon, fehlerZustand, textfeld, type FormularZustand } from "@/server/actions/formular"; +import { RechteFehler, rechtErforderlich } from "@/server/auth/sitzungspflicht"; +import { abgleichAnfordern, alleHostsAbgleichen } from "@/server/services/abgleich"; +import { keyUebernehmen } from "@/server/services/uebernahme"; + +/** Abgleich anstossen und vorhandene Keys uebernehmen (#021, #022). */ + +export async function abgleichAktion(hostId: string): Promise<{ vorgangId?: string; fehler?: string }> { + try { + const { benutzer } = await rechtErforderlich("hostsVerwalten"); + return { vorgangId: await abgleichAnfordern(z.string().min(1).max(64).parse(hostId), benutzer.id) }; + } catch (fehler) { + if (fehler instanceof RechteFehler) return { fehler: fehler.message }; + throw fehler; + } +} + +export async function alleAbgleichenAktion(): Promise<{ anzahl?: number; fehler?: string }> { + try { + const { benutzer } = await rechtErforderlich("hostsVerwalten"); + return { anzahl: await alleHostsAbgleichen(benutzer.id) }; + } catch (fehler) { + if (fehler instanceof RechteFehler) return { fehler: fehler.message }; + throw fehler; + } +} + +export async function uebernehmenAktion( + _vorher: FormularZustand, + formular: FormData, +): Promise { + const verwalten = formular.get("verwalten") === "ja"; + const hostId = textfeld(formular, "hostId") ?? ""; + try { + // Aufnehmen ist Schluesselverwaltung; in den Block holen ist zusaetzlich Ausrollen. + const { benutzer } = await rechtErforderlich(verwalten ? "publicKeyAusrollen" : "schluesselVerwalten"); + await keyUebernehmen( + { + hostId, + zielbenutzer: textfeld(formular, "zielbenutzer") ?? "", + fingerprint: textfeld(formular, "fingerprint") ?? "", + name: (textfeld(formular, "name") ?? "").trim(), + kategorie: textfeld(formular, "kategorie") === "DIENST" ? "DIENST" : "PERSON", + personId: textfeld(formular, "personId") ?? null, + verwalten, + }, + akteurVon(benutzer), + ); + } catch (fehler) { + return fehlerZustand(fehler); + } + revalidatePath(`/hosts/${hostId}`); + return {}; +} diff --git a/src/server/queries/abgleich.ts b/src/server/queries/abgleich.ts new file mode 100644 index 0000000..d1e59cd --- /dev/null +++ b/src/server/queries/abgleich.ts @@ -0,0 +1,46 @@ +import { prisma } from "@/lib/db"; +import type { IstEintrag } from "@/lib/ssh/abgleich"; + +/** Ist-Zustand und offene Abweichungen eines Hosts (#021) – nur oeffentliche Angaben. */ +export async function istZustand(hostId: string) { + const [beobachtungen, abweichungen, personen] = await Promise.all([ + prisma.beobachtung.findMany({ + where: { hostId }, + select: { zielbenutzer: true, beobachtetAm: true, eintraege: true }, + orderBy: { zielbenutzer: "asc" }, + }), + prisma.abweichung.findMany({ + where: { hostId, behobenAm: null }, + select: { + id: true, + art: true, + zielbenutzer: true, + fingerprint: true, + details: true, + eroeffnetAm: true, + }, + orderBy: { eroeffnetAm: "asc" }, + }), + prisma.person.findMany({ + where: { archiviertAm: null }, + select: { id: true, name: true }, + orderBy: { name: "asc" }, + }), + ]); + return { + beobachtungen: beobachtungen.map((b) => ({ + zielbenutzer: b.zielbenutzer, + beobachtetAm: b.beobachtetAm, + eintraege: b.eintraege as unknown as IstEintrag[], + })), + abweichungen: abweichungen.map((a) => ({ + ...a, + text: + ((a.details ?? {}) as { text?: string; erwartet?: string }).text ?? + (a.art === "HOSTKEY_GEAENDERT" ? "Host-Key hat sich geändert." : a.art), + })), + personen, + }; +} + +export type IstZustand = Awaited>; diff --git a/src/server/services/abgleich.ts b/src/server/services/abgleich.ts new file mode 100644 index 0000000..c4eb9de --- /dev/null +++ b/src/server/services/abgleich.ts @@ -0,0 +1,32 @@ +import { prisma } from "@/lib/db"; +import { vorgangEinreihen } from "@/server/vorgaenge/vorgaenge"; + +/** + * Zeitplan (#021): reiht fuer jeden eingerichteten Host einen Abgleich ein – ausser fuer Hosts, + * deren letzter Abgleich noch wartet oder laeuft. + */ +export async function alleHostsAbgleichen(angefordertVonId: string | null): Promise { + const hosts = await prisma.host.findMany({ + where: { archiviertAm: null, bootstrapAm: { not: null } }, + select: { id: true }, + }); + const laufend = new Set( + ( + await prisma.vorgang.findMany({ + where: { art: "ABGLEICH", status: { in: ["WARTEND", "LAEUFT"] } }, + select: { hostId: true }, + }) + ).map((v) => v.hostId), + ); + let anzahl = 0; + for (const host of hosts) { + if (laufend.has(host.id)) continue; + await vorgangEinreihen({ art: "ABGLEICH", angefordertVonId, hostId: host.id }); + anzahl += 1; + } + return anzahl; +} + +export async function abgleichAnfordern(hostId: string, angefordertVonId: string): Promise { + return vorgangEinreihen({ art: "ABGLEICH", angefordertVonId, hostId }); +} diff --git a/src/server/services/soll.ts b/src/server/services/soll.ts index 9c312a3..727904c 100644 --- a/src/server/services/soll.ts +++ b/src/server/services/soll.ts @@ -20,6 +20,8 @@ export type Soll = { readonly eintraege: SollEintrag[]; /** Fingerprints, die nie aus dem Block fallen duerfen (Deployment-Key). */ readonly pflicht: string[]; + /** Uebernommene Keys (#022), deren Zeile ausserhalb des Blocks verschwinden soll. */ + readonly ausserhalbEntfernen: string[]; /** Verwendungen, die in diesem Soll stecken oder entfernt werden – fuer den Zustand danach. */ readonly verwendungIds: { readonly drin: string[]; readonly raus: string[] }; }; @@ -58,6 +60,7 @@ export async function sollFuer(hostId: string, zielbenutzer: string): Promise { + const beobachtung = await prisma.beobachtung.findUnique({ + where: { + hostId_zielbenutzer_datei: { + hostId: eingabe.hostId, + zielbenutzer: eingabe.zielbenutzer, + datei: ".ssh/authorized_keys", + }, + }, + include: { host: { select: { name: true } } }, + }); + const eintrag = ((beobachtung?.eintraege ?? []) as unknown as IstEintrag[]).find( + (e) => e.fingerprint === eingabe.fingerprint, + ); + if (!beobachtung || !eintrag) { + throw new FachFehler( + "Diesen Schlüssel hat der letzte Abgleich dort nicht gesehen. Bitte erneut abgleichen.", + ); + } + const zeile = authorizedKeysLesen(eintrag.zeile).zeilen.find( + (z): z is SchluesselZeile => z.art === "schluessel", + ); + if (!zeile) throw new FachFehler("Die Zeile ließ sich nicht lesen."); + + let optionen: string | null = null; + if (eingabe.verwalten && zeile.optionen) { + try { + optionen = optionenPruefen(zeile.optionen) || null; + } catch (fehler) { + if (fehler instanceof OptionenFehler) { + throw new FachFehler(`Die Optionen der Zeile lassen sich nicht übernehmen: ${fehler.message}`); + } + throw fehler; + } + } + + const neu = await publicKeyAnlegen( + { + name: eingabe.name, + slug: null, + kategorie: eingabe.kategorie, + publicKey: `${zeile.typ} ${zeile.base64}${zeile.kommentar ? ` ${zeile.kommentar}` : ""}`, + kommentar: null, + tags: ["übernommen"], + ablaufAm: null, + personId: eingabe.personId, + vorlageId: null, + }, + akteur, + "schluessel.uebernommen", + ); + + if (eingabe.verwalten) { + await prisma.publicVerwendung.create({ + data: { + schluesselId: neu.id, + hostId: eingabe.hostId, + zielbenutzer: eingabe.zielbenutzer, + optionen, + ausserhalbEntfernen: true, + angelegtVonId: akteur.id, + }, + }); + } + await protokollieren({ + akteur, + aktion: eingabe.verwalten ? "uebernahme.verwalten" : "uebernahme.bekannt", + ergebnis: "ERFOLG", + hostName: beobachtung.host.name, + zielbenutzer: eingabe.zielbenutzer, + fingerprint: neu.fingerprint, + details: { optionen }, + }); + return { schluesselId: neu.id }; +} diff --git a/src/worker/ablaeufe/abgleich.ts b/src/worker/ablaeufe/abgleich.ts new file mode 100644 index 0000000..793130f --- /dev/null +++ b/src/worker/ablaeufe/abgleich.ts @@ -0,0 +1,314 @@ +import { createHash } from "node:crypto"; +import type { Client } from "ssh2"; +import type { Host, Prisma } from "@/generated/prisma/client"; +import type { AbweichungsArt } from "@/generated/prisma/enums"; +import { prisma } from "@/lib/db"; +import { BENUTZERNAME_MUSTER, shellQuote } from "@/lib/shell"; +import { authorizedKeysAbgleichen, type Befund, type DateiRechte } from "@/lib/ssh/abgleich"; +import { anmeldebenutzerVon, sollFuer } from "@/server/services/soll"; +import { protokollieren } from "@/server/services/protokoll"; +import { VorgangsFehler, type Handler } from "@/worker/ausfuehren"; +import { hostLaden } from "@/worker/ablaeufe/hostkey"; +import { privateKeyLaden } from "@/worker/geheimnisse"; +import { hostVerbinden } from "@/worker/ssh/host"; +import { relativenPfadPruefen } from "@/worker/ssh/ssh-dateien"; +import { befehlAusfuehren } from "@/worker/ssh/verbindung"; + +/** + * Abgleich eines Hosts (#021): Ist-Zustand lesen, mit dem Soll vergleichen, Befunde und + * Zustaende festhalten. Aendert auf dem Host nichts – Korrekturen laufen ueber Dry-Run und + * Ausrollen, damit ein Mensch sie sieht. + */ + +type GelesenerBenutzer = { + readonly benutzer: string; + readonly inhalt: string | null; + readonly rechte?: DateiRechte; +}; + +/** + * Liest authorized_keys aller Benutzer mit UID 0 oder ≥ 1000 sowie der ausdruecklich + * genannten. Inhalt als base64, damit Zeilenenden und fremde Bytes unversehrt ankommen; gelesen + * wird als der jeweilige Benutzer (Symlink-Schutz wie beim Schreiben). + */ +async function authorizedKeysAllerBenutzer( + verbindung: Client, + host: Host, + zusaetzlich: string[], +): Promise { + const namen = [...new Set(zusaetzlich)].filter((n) => BENUTZERNAME_MUSTER.test(n)); + const skript = `set -u +LISTE=$( { getent passwd | awk -F: '($3==0 || $3>=1000) && $3!=65534 {print $1}'; printf '%s\\n' ${namen.map(shellQuote).join(" ")}; } | sort -u) +for B in $LISTE; do + H=$(getent passwd "$B" | cut -d: -f6) || continue + [ -n "$H" ] || continue + D="$H/.ssh/authorized_keys" + if runuser -u "$B" -- test -e "$D" 2>/dev/null; then + RD=$(stat -c '%a:%U' "$H/.ssh" 2>/dev/null || echo "-:-") + RF=$(stat -c '%a:%U' "$D" 2>/dev/null || echo "-:-") + INHALT=$(runuser -u "$B" -- base64 -w0 "$D" 2>/dev/null || echo FEHLER) + echo "SSHKV-DATEI|$B|$RD|$RF|$INHALT" + else + echo "SSHKV-KEINE|$B" + fi +done +echo SSHKV-ENDE`; + const praefix = host.anmeldeart === "ROOT" ? "" : "sudo -n "; + const ergebnis = await befehlAusfuehren(verbindung, `${praefix}sh -c ${shellQuote(skript)}`); + if (!ergebnis.stdout.includes("SSHKV-ENDE")) + throw new VorgangsFehler(`Abgleich auf ${host.name} ließ sich nicht ausführen.`); + + const gelesen: GelesenerBenutzer[] = []; + for (const zeile of ergebnis.stdout.split("\n")) { + const teile = zeile.split("|"); + if (teile[0] === "SSHKV-KEINE" && teile[1]) gelesen.push({ benutzer: teile[1], inhalt: null }); + if (teile[0] === "SSHKV-DATEI" && teile.length === 5) { + const [, benutzer, rd, rf, inhalt] = teile as [string, string, string, string, string]; + const [modusD, besitzerD] = rd.split(":"); + const [modusF, besitzerF] = rf.split(":"); + gelesen.push({ + benutzer, + inhalt: inhalt === "FEHLER" ? null : Buffer.from(inhalt, "base64").toString("utf8"), + rechte: { + sshVerzeichnis: modusD && modusD !== "-" ? modusD : null, + datei: modusF && modusF !== "-" ? modusF : null, + eigentuemerPasst: besitzerD === benutzer && besitzerF === benutzer, + }, + }); + } + } + return gelesen; +} + +/** Prueft ausgerollte Private Keys: Datei da und unveraendert? */ +async function privateKeysPruefen( + verbindung: Client, + host: Host, +): Promise<{ befunde: (Befund & { benutzer: string })[]; ok: string[]; fehlt: string[] }> { + const verwendungen = await prisma.privateVerwendung.findMany({ + where: { hostId: host.id, zustand: { in: ["AUSGEROLLT", "ABWEICHUNG"] } }, + select: { + id: true, + zielbenutzer: true, + pfad: true, + schluesselId: true, + schluessel: { select: { fingerprint: true, masterKeyVersion: true } }, + }, + }); + const befunde: (Befund & { benutzer: string })[] = []; + const ok: string[] = []; + const fehlt: string[] = []; + const praefix = host.anmeldeart === "ROOT" ? "" : "sudo -n "; + for (const v of verwendungen) { + const relativ = relativenPfadPruefen(v.pfad); + const skript = `H=$(getent passwd ${shellQuote(v.zielbenutzer)} | cut -d: -f6); runuser -u ${shellQuote(v.zielbenutzer)} -- sha256sum "$H/"${shellQuote(relativ)} 2>/dev/null | cut -d' ' -f1`; + const ergebnis = await befehlAusfuehren(verbindung, `${praefix}sh -c ${shellQuote(skript)}`); + const ist = ergebnis.stdout.trim(); + let erwartet: string | null = null; + // Ist der Private Key aus sshkv geloescht, laesst sich nur noch das Vorhandensein pruefen. + if (v.schluessel.masterKeyVersion !== null) { + const klartext = await privateKeyLaden(v.schluesselId); + erwartet = createHash("sha256").update(klartext).digest("hex"); + klartext.fill(0); + } + if (!ist || (erwartet && ist !== erwartet)) { + fehlt.push(v.id); + befunde.push({ + benutzer: v.zielbenutzer, + art: "FEHLENDER_SCHLUESSEL", + fingerprint: v.schluessel.fingerprint, + text: ist ? `Private Key unter ${v.pfad} wurde verändert.` : `Private Key unter ${v.pfad} fehlt.`, + }); + } else { + ok.push(v.id); + } + } + return { befunde, ok, fehlt }; +} + +function befundSchluessel( + art: string, + benutzer: string | null, + fingerprint: string | null, + text: string, +): string { + return [art, benutzer ?? "", fingerprint ?? text].join("\u0000"); +} + +export async function hostAbgleichen(host: Host): Promise<{ befunde: number; benutzer: number }> { + const publicVerwendungen = await prisma.publicVerwendung.findMany({ + where: { + zustand: { not: "ENTFERNT" }, + OR: [{ hostId: host.id }, { hostgruppe: { mitglieder: { some: { hostId: host.id } } } }], + }, + select: { zielbenutzer: true }, + }); + const sollBenutzer = [ + ...new Set([anmeldebenutzerVon(host), ...publicVerwendungen.map((v) => v.zielbenutzer)]), + ]; + + const verbindung = await hostVerbinden(host); + let gelesen: GelesenerBenutzer[]; + let privat: Awaited>; + try { + gelesen = await authorizedKeysAllerBenutzer(verbindung, host, sollBenutzer); + privat = await privateKeysPruefen(verbindung, host); + } finally { + verbindung.end(); + } + + const bekannt = new Set( + (await prisma.schluessel.findMany({ select: { fingerprint: true } })).map((s) => s.fingerprint), + ); + const aktuell = new Map< + string, + { art: AbweichungsArt; benutzer: string | null; fingerprint: string | null; text: string } + >(); + const jetzt = new Date(); + + for (const { benutzer, inhalt, rechte } of gelesen) { + const soll = await sollFuer(host.id, benutzer); + // Benutzer ohne Datei und ohne Soll interessieren nicht. + if (inhalt === null && soll.eintraege.length === 0) continue; + const ergebnis = authorizedKeysAbgleichen(inhalt, soll.eintraege, bekannt, rechte); + for (const befund of ergebnis.befunde) { + aktuell.set(befundSchluessel(befund.art, benutzer, befund.fingerprint ?? null, befund.text), { + art: befund.art, + benutzer, + fingerprint: befund.fingerprint ?? null, + text: befund.text, + }); + } + const datei = ".ssh/authorized_keys"; + await prisma.beobachtung.upsert({ + where: { hostId_zielbenutzer_datei: { hostId: host.id, zielbenutzer: benutzer, datei } }, + create: { + hostId: host.id, + zielbenutzer: benutzer, + datei, + sha256: inhalt === null ? "keine-datei" : createHash("sha256").update(inhalt).digest("hex"), + eintraege: ergebnis.eintraege as unknown as Prisma.InputJsonValue, + beobachtetAm: jetzt, + }, + update: { + sha256: inhalt === null ? "keine-datei" : createHash("sha256").update(inhalt).digest("hex"), + eintraege: ergebnis.eintraege as unknown as Prisma.InputJsonValue, + beobachtetAm: jetzt, + }, + }); + + // Zustand der Public-Verwendungen nachziehen: was im Block stimmt, ist synchron; was fehlt, + // obwohl es ausgerollt war, ist Drift. GEPLANT bleibt GEPLANT, bis jemand ausrollt. + const vorhanden = new Set(ergebnis.vorhanden); + const verwendungen = await prisma.publicVerwendung.findMany({ + where: { + zielbenutzer: benutzer, + id: { in: soll.verwendungIds.drin }, + }, + select: { id: true, zustand: true, schluessel: { select: { fingerprint: true } } }, + }); + for (const v of verwendungen) { + const da = vorhanden.has(v.schluessel.fingerprint); + if (da && v.zustand === "ABWEICHUNG") { + await prisma.publicVerwendung.update({ where: { id: v.id }, data: { zustand: "AUSGEROLLT" } }); + } else if (!da && v.zustand === "AUSGEROLLT") { + await prisma.publicVerwendung.update({ where: { id: v.id }, data: { zustand: "ABWEICHUNG" } }); + } + } + } + // Benutzer, die nicht mehr gelesen wurden (Datei weg), verlieren ihre Beobachtung. + await prisma.beobachtung.deleteMany({ + where: { + hostId: host.id, + zielbenutzer: { notIn: gelesen.filter((g) => g.inhalt !== null).map((g) => g.benutzer) }, + }, + }); + + for (const befund of privat.befunde) { + aktuell.set( + befundSchluessel("PRIVATE_KEY_FEHLT", befund.benutzer, befund.fingerprint ?? null, befund.text), + { + art: "PRIVATE_KEY_FEHLT", + benutzer: befund.benutzer, + fingerprint: befund.fingerprint ?? null, + text: befund.text, + }, + ); + } + await prisma.privateVerwendung.updateMany({ + where: { id: { in: privat.fehlt } }, + data: { zustand: "ABWEICHUNG" }, + }); + await prisma.privateVerwendung.updateMany({ + where: { id: { in: privat.ok }, zustand: "ABWEICHUNG" }, + data: { zustand: "AUSGEROLLT" }, + }); + + // Abweichungen: neue oeffnen, verschwundene schliessen. Host-Key-Abweichungen verwaltet #009. + const offen = await prisma.abweichung.findMany({ + where: { hostId: host.id, behobenAm: null, art: { not: "HOSTKEY_GEAENDERT" } }, + }); + const offenSchluessel = new Map( + offen.map((a) => [ + befundSchluessel( + a.art, + a.zielbenutzer, + a.fingerprint, + ((a.details ?? {}) as { text?: string }).text ?? "", + ), + a, + ]), + ); + for (const [schluessel, befund] of aktuell) { + if (offenSchluessel.has(schluessel)) continue; + await prisma.abweichung.create({ + data: { + hostId: host.id, + zielbenutzer: befund.benutzer, + art: befund.art, + fingerprint: befund.fingerprint, + details: { text: befund.text }, + }, + }); + } + const behoben = [...offenSchluessel] + .filter(([schluessel]) => !aktuell.has(schluessel)) + .map(([, a]) => a.id); + await prisma.abweichung.updateMany({ where: { id: { in: behoben } }, data: { behobenAm: jetzt } }); + + const hostKeyOffen = await prisma.abweichung.count({ + where: { hostId: host.id, behobenAm: null, art: "HOSTKEY_GEAENDERT" }, + }); + await prisma.host.update({ + where: { id: host.id }, + data: { + driftZustand: aktuell.size > 0 || hostKeyOffen > 0 ? "DRIFT" : "SYNCHRON", + letzterAbgleichAm: jetzt, + erreichbar: true, + zuletztGeprueftAm: jetzt, + }, + }); + return { befunde: aktuell.size, benutzer: gelesen.filter((g) => g.inhalt !== null).length }; +} + +export const abgleichHandler: Handler = async ({ vorgang }) => { + const host = await hostLaden(vorgang.hostId); + if (!host.bootstrapAm) throw new VorgangsFehler("Der Host ist noch nicht eingerichtet (Bootstrap fehlt)."); + try { + const ergebnis = await hostAbgleichen(host); + await protokollieren({ + akteur: "System", + aktion: "abgleich", + ergebnis: "ERFOLG", + hostName: host.name, + details: ergebnis, + }); + return { ergebnis }; + } catch (fehler) { + await prisma.host.update({ + where: { id: host.id }, + data: { erreichbar: false, zuletztGeprueftAm: new Date() }, + }); + throw fehler; + } +}; diff --git a/src/worker/ablaeufe/ausrollen.ts b/src/worker/ablaeufe/ausrollen.ts index 332f80f..1f932ec 100644 --- a/src/worker/ablaeufe/ausrollen.ts +++ b/src/worker/ablaeufe/ausrollen.ts @@ -146,7 +146,7 @@ export const trockenlaufHandler: Handler = async ({ vorgang }) => { return privatPlanZiel(host, benutzer, await privatPlanen(verbindung, host, benutzer)); const stand = await authorizedKeysHolen(verbindung, host, benutzer); const soll = await sollFuer(host.id, benutzer); - const ergebnis = blockSetzen(stand.inhalt, soll.eintraege, soll.pflicht); + const ergebnis = blockSetzen(stand.inhalt, soll.eintraege, soll.pflicht, soll.ausserhalbEntfernen); return { art: "public", hostId: host.id, @@ -249,7 +249,7 @@ export const ausrollenHandler: Handler = async ({ vorgang }) => { ); } const soll = await sollFuer(host.id, benutzer); - const ergebnis = blockSetzen(stand.inhalt, soll.eintraege, soll.pflicht); + const ergebnis = blockSetzen(stand.inhalt, soll.eintraege, soll.pflicht, soll.ausserhalbEntfernen); if (hashVon(ergebnis.inhalt) !== ziel.nachher) { throw new VorgangsFehler( `Die Zuweisungen für ${benutzer}@${host.name} haben sich seit dem Trockenlauf geändert. Bitte neuen Trockenlauf starten.`, diff --git a/src/worker/handler.ts b/src/worker/handler.ts index ebe8e06..6c00277 100644 --- a/src/worker/handler.ts +++ b/src/worker/handler.ts @@ -1,4 +1,5 @@ import type { HandlerTabelle } from "@/worker/ausfuehren"; +import { abgleichHandler } from "@/worker/ablaeufe/abgleich"; import { ausrollenHandler, trockenlaufHandler } from "@/worker/ablaeufe/ausrollen"; import { bootstrapHandler } from "@/worker/ablaeufe/bootstrap"; import { erreichbarkeitHandler, hostKeyAbrufenHandler } from "@/worker/ablaeufe/hostkey"; @@ -8,7 +9,7 @@ import { verbindungstestHandler } from "@/worker/ablaeufe/verbindungstest"; import { zielkontoAnlegenHandler, zielkontoEntfernenHandler } from "@/worker/ablaeufe/zielkonto"; /** - * Welche Vorgangsart wer ausfuehrt. Waechst mit den Issues: Abgleich (#021) … + * Welche Vorgangsart wer ausfuehrt. */ export const HANDLER: HandlerTabelle = { HOSTKEY_ABRUFEN: hostKeyAbrufenHandler, @@ -21,6 +22,7 @@ export const HANDLER: HandlerTabelle = { PRIVATE_KEY_ABHOLEN: privateKeyAbholenHandler, PRIVATE_KEY_LOESCHEN: privateKeyLoeschenHandler, VERBINDUNGSTEST: verbindungstestHandler, + ABGLEICH: abgleichHandler, ZIELKONTO_ANLEGEN: zielkontoAnlegenHandler, ZIELKONTO_ENTFERNEN: zielkontoEntfernenHandler, }; diff --git a/src/worker/index.ts b/src/worker/index.ts index 219e5b3..3cf7d37 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -1,7 +1,13 @@ import "dotenv/config"; import type { Job } from "pg-boss"; import { VERSION } from "@/lib/version"; -import { WARTESCHLANGE, warteschlangeHolen, type VorgangsJob } from "@/server/vorgaenge/warteschlange"; +import { alleHostsAbgleichen } from "@/server/services/abgleich"; +import { + WARTESCHLANGE, + ZEITPLAN_ABGLEICH, + warteschlangeHolen, + type VorgangsJob, +} from "@/server/vorgaenge/warteschlange"; import { vorgangAusfuehren } from "@/worker/ausfuehren"; import { abholungenAufraeumen } from "@/worker/ablaeufe/privatekey"; import { deploymentKeySicherstellen } from "@/worker/geheimnisse"; @@ -45,7 +51,17 @@ async function starten(): Promise { await aufraeumen(); const takt = setInterval(() => void aufraeumen(), 30_000); - console.log(`sshkv-worker ${VERSION} bereit.`); + // Periodischer Abgleich (#021). Der Zeitplan liegt in pg-boss und damit in der Datenbank: + // laufen spaeter mehrere Worker, feuert er trotzdem nur einmal. + const zeitplan = process.env["SSHKV_SYNC_CRON"]?.trim() || "30 2 * * *"; + await boss.createQueue(ZEITPLAN_ABGLEICH); + await boss.schedule(ZEITPLAN_ABGLEICH, zeitplan, null, { tz: "Europe/Berlin" }); + await boss.work(ZEITPLAN_ABGLEICH, async () => { + const anzahl = await alleHostsAbgleichen(null); + console.log(`Zeitplan: ${anzahl} Abgleich(e) eingereiht.`); + }); + + console.log(`sshkv-worker ${VERSION} bereit (Abgleich: ${zeitplan}).`); const beenden = async (signal: string) => { console.log(`${signal} empfangen, beende laufende Vorgänge …`); diff --git a/tests/integration/abgleich.test.ts b/tests/integration/abgleich.test.ts new file mode 100644 index 0000000..f5eea9f --- /dev/null +++ b/tests/integration/abgleich.test.ts @@ -0,0 +1,169 @@ +import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { prisma } from "@/lib/db"; +import { schluesselpaarErzeugen } from "@/lib/ssh/openssh"; +import { zieleVonPrivatVerwendungen, zieleVonVerwendungen } from "@/server/services/soll"; +import { privateVerwendungAnlegen, publicVerwendungAnlegen } from "@/server/services/verwendungen"; +import { keyUebernehmen } from "@/server/services/uebernahme"; +import { deploymentKeySicherstellen, schluesselpaarVersiegeltErzeugen } from "@/worker/geheimnisse"; +import { datenbankLeeren } from "../hilfen/db"; +import { eingerichteterHost, masterKeyAnlegen, vorgangLaufen } from "./hilfen/host"; +import { befehlAlsRoot, zielA, zielBereit } from "./hilfen/ziele"; + +/** Abgleich und Drift-Erkennung gegen ein echtes sshd (#021). */ + +const AKTEUR = { id: "test", name: "Test" }; +let aufraeumen: () => void; + +beforeAll(async () => { + await zielBereit(zielA); + aufraeumen = masterKeyAnlegen(); +}); +afterAll(() => aufraeumen()); + +beforeEach(async () => { + await datenbankLeeren(); + await deploymentKeySicherstellen(); + await befehlAlsRoot( + zielA, + "userdel -r sshkv 2>/dev/null; rm -f /etc/sudoers.d/sshkv; rm -rf /root/.ssh; true", + ); +}); + +async function ausgerollterHost() { + const host = await eingerichteterHost(zielA, "ziel-a"); + const paar = await schluesselpaarErzeugen("ED25519", { kommentar: "sshkv:abgleich" }); + const schluessel = await prisma.schluessel.create({ + data: { + name: "Abgleich", + slug: "abgleich", + typ: "ED25519", + kategorie: "DIENST", + publicKey: paar.publicKeyZeile, + fingerprint: paar.fingerprint, + kommentar: "sshkv:abgleich", + }, + }); + await publicVerwendungAnlegen( + { schluesselId: schluessel.id, hostId: host.id, zielbenutzer: "root" }, + AKTEUR, + ); + const trockenlauf = await vorgangLaufen("TROCKENLAUF", { + eingabe: { ziele: await zieleVonVerwendungen({ schluesselId: schluessel.id }) }, + }); + await vorgangLaufen("AUSROLLEN", { eingabe: { trockenlaufId: trockenlauf.id } }); + return { host, schluessel }; +} + +const abgleichen = (hostId: string) => vorgangLaufen("ABGLEICH", { hostId }); +// Postgres sortiert Enums nach Deklaration; fuer lesbare Erwartungen alphabetisch in JS. +const offen = async (hostId: string) => + (await prisma.abweichung.findMany({ where: { hostId, behobenAm: null } })).sort((a, b) => + a.art.localeCompare(b.art), + ); + +describe("Abgleich", () => { + it("ist nach dem Ausrollen synchron und haelt den Ist-Zustand je Benutzer fest", async () => { + const { host } = await ausgerollterHost(); + const vorgang = await abgleichen(host.id); + expect(vorgang.fehler).toBeNull(); + expect(await offen(host.id)).toEqual([]); + const aktuell = await prisma.host.findUniqueOrThrow({ where: { id: host.id } }); + expect(aktuell.driftZustand).toBe("SYNCHRON"); + expect(aktuell.letzterAbgleichAm).not.toBeNull(); + const beobachtet = await prisma.beobachtung.findMany({ + where: { hostId: host.id }, + orderBy: { zielbenutzer: "asc" }, + }); + expect(beobachtet.map((b) => b.zielbenutzer)).toEqual(["root", "sshkv"]); + expect(JSON.stringify(beobachtet[0]?.eintraege)).toContain('"herkunft":"verwaltet"'); + }); + + it("findet fremde Keys, fehlende Keys und falsche Rechte – und schliesst behobene Befunde", async () => { + const { host } = await ausgerollterHost(); + const fremd = await schluesselpaarErzeugen("ED25519", { kommentar: "fremd@laptop" }); + await befehlAlsRoot( + zielA, + `echo '${fremd.publicKeyZeile}' >> /root/.ssh/authorized_keys && sed -i '/sshkv:abgleich/d' /root/.ssh/authorized_keys && chmod 777 /root/.ssh`, + ); + await abgleichen(host.id); + const arten = (await offen(host.id)).map((a) => a.art); + expect(arten).toEqual(["FEHLENDER_SCHLUESSEL", "RECHTE", "UNBEKANNTER_SCHLUESSEL"]); + expect((await prisma.host.findUniqueOrThrow({ where: { id: host.id } })).driftZustand).toBe("DRIFT"); + expect((await prisma.publicVerwendung.findFirstOrThrow()).zustand).toBe("ABWEICHUNG"); + + // Zweiter Lauf ohne Aenderung: keine doppelten Befunde. + await abgleichen(host.id); + expect(await offen(host.id)).toHaveLength(3); + + // Von Hand bereinigen: fremden Key raus, Rechte zurueck – der fehlende Key bleibt Befund. + await befehlAlsRoot(zielA, "sed -i '/fremd@laptop/d' /root/.ssh/authorized_keys && chmod 700 /root/.ssh"); + await abgleichen(host.id); + expect((await offen(host.id)).map((a) => a.art)).toEqual(["FEHLENDER_SCHLUESSEL"]); + }); + + it("bemerkt einen veraenderten Private Key", async () => { + const host = await eingerichteterHost(zielA, "ziel-a"); + const neu = await schluesselpaarVersiegeltErzeugen("ED25519", "sshkv:privat"); + const schluessel = await prisma.schluessel.create({ + data: { + id: neu.id, + name: "Privat", + slug: "privat", + typ: "ED25519", + kategorie: "DIENST", + publicKey: neu.publicKeyZeile, + fingerprint: neu.fingerprint, + kommentar: "sshkv:privat", + ...neu.versiegelt, + }, + }); + await privateVerwendungAnlegen( + { schluesselId: schluessel.id, hostId: host.id, zielbenutzer: "root", pfad: "~/.ssh/id_privat" }, + AKTEUR, + ); + const trockenlauf = await vorgangLaufen("TROCKENLAUF", { + eingabe: { ziele: await zieleVonPrivatVerwendungen({ schluesselId: schluessel.id }) }, + }); + await vorgangLaufen("AUSROLLEN", { eingabe: { trockenlaufId: trockenlauf.id } }); + await abgleichen(host.id); + expect(await offen(host.id)).toEqual([]); + + await befehlAlsRoot(zielA, "echo kaputt > /root/.ssh/id_privat"); + await abgleichen(host.id); + expect((await offen(host.id)).map((a) => a.art)).toEqual(["PRIVATE_KEY_FEHLT"]); + expect((await prisma.privateVerwendung.findFirstOrThrow()).zustand).toBe("ABWEICHUNG"); + }); + + it("uebernimmt einen fremden Key in den verwalteten Block (#022)", async () => { + const { host } = await ausgerollterHost(); + const fremd = await schluesselpaarErzeugen("ED25519", { kommentar: "anna@laptop" }); + await befehlAlsRoot(zielA, `sed -i '1i no-pty ${fremd.publicKeyZeile}' /root/.ssh/authorized_keys`); + await abgleichen(host.id); + expect((await offen(host.id)).map((a) => a.art)).toEqual(["UNBEKANNTER_SCHLUESSEL"]); + + const admin = await prisma.benutzer.create({ data: { id: "test", name: "Test", rolle: "ADMIN" } }); + const { schluesselId } = await keyUebernehmen( + { + hostId: host.id, + zielbenutzer: "root", + fingerprint: fremd.fingerprint, + name: "Laptop Anna", + kategorie: "PERSON", + personId: null, + verwalten: true, + }, + { id: admin.id, name: admin.name }, + ); + const trockenlauf = await vorgangLaufen("TROCKENLAUF", { + eingabe: { ziele: await zieleVonVerwendungen({ schluesselId }) }, + }); + await vorgangLaufen("AUSROLLEN", { eingabe: { trockenlaufId: trockenlauf.id } }); + const datei = (await befehlAlsRoot(zielA, "cat /root/.ssh/authorized_keys")).stdout; + expect(datei.startsWith("# BEGIN SSHKV MANAGED")).toBe(true); + expect(datei.match(/anna@laptop/g)).toHaveLength(1); + expect(datei).toContain(`no-pty ${fremd.publicKeyZeile}`); + + await abgleichen(host.id); + expect(await offen(host.id)).toEqual([]); + }); +}); diff --git a/tests/integration/hilfen/host.ts b/tests/integration/hilfen/host.ts index b8e5a0f..9dc3c5c 100644 --- a/tests/integration/hilfen/host.ts +++ b/tests/integration/hilfen/host.ts @@ -28,7 +28,8 @@ export async function vorgangLaufen( | "AUSROLLEN" | "VERBINDUNGSTEST" | "ZIELKONTO_ANLEGEN" - | "ZIELKONTO_ENTFERNEN", + | "ZIELKONTO_ENTFERNEN" + | "ABGLEICH", daten: { hostId?: string; eingabe?: object; diff --git a/tests/ssh/abgleich.test.ts b/tests/ssh/abgleich.test.ts new file mode 100644 index 0000000..9a8678e --- /dev/null +++ b/tests/ssh/abgleich.test.ts @@ -0,0 +1,81 @@ +import { generateKeyPairSync } from "node:crypto"; +import { describe, expect, it } from "vitest"; +import { authorizedKeysAbgleichen } from "@/lib/ssh/abgleich"; +import { blockSetzen, type SollEintrag } from "@/lib/ssh/authorized-keys"; +import { fingerprintSha256 } from "@/lib/ssh/openssh"; + +/** Abgleich einer authorized_keys mit dem Soll (#021). */ + +function key(kommentar: string) { + const { publicKey } = generateKeyPairSync("ed25519"); + const roh = publicKey.export({ format: "der", type: "spki" }).subarray(-32); + const typ = Buffer.from("ssh-ed25519"); + const blob = Buffer.concat([Buffer.from([0, 0, 0, typ.length]), typ, Buffer.from([0, 0, 0, 32]), roh]); + return { + publicKey: `ssh-ed25519 ${blob.toString("base64")} ${kommentar}`, + fingerprint: fingerprintSha256(blob), + }; +} + +const DEPLOY = key("deploy"); +const BACKUP = key("backup"); +const FREMD = key("hacker@irgendwo"); +const BEKANNT = key("bekannt"); + +const soll: SollEintrag[] = [DEPLOY, { ...BACKUP, optionen: 'from="10.0.0.1"' }]; +const bekannt = new Set([DEPLOY.fingerprint, BACKUP.fingerprint, BEKANNT.fingerprint]); + +describe("authorized_keys abgleichen", () => { + it("ist ohne Befund, wenn der Block dem Soll entspricht", () => { + const inhalt = blockSetzen(`${BEKANNT.publicKey}\n`, soll).inhalt; + const ergebnis = authorizedKeysAbgleichen(inhalt, soll, bekannt, { + sshVerzeichnis: "700", + datei: "600", + eigentuemerPasst: true, + }); + expect(ergebnis.befunde).toEqual([]); + expect(ergebnis.vorhanden).toEqual([DEPLOY.fingerprint, BACKUP.fingerprint]); + expect(ergebnis.eintraege.map((e) => e.herkunft)).toEqual(["bekannt", "verwaltet", "verwaltet"]); + }); + + it("findet fehlende, geaenderte und zusaetzliche Keys im Block", () => { + const inhalt = blockSetzen("", [DEPLOY, BACKUP, FREMD]).inhalt; // BACKUP ohne Optionen, FREMD zu viel + const arten = authorizedKeysAbgleichen(inhalt, soll, bekannt).befunde.map((b) => [b.art, b.fingerprint]); + expect(arten).toEqual([ + ["ZUSAETZLICH_IM_BLOCK", BACKUP.fingerprint], + ["ZUSAETZLICH_IM_BLOCK", FREMD.fingerprint], + ]); + const leer = authorizedKeysAbgleichen(null, soll, bekannt).befunde.map((b) => b.art); + expect(leer).toEqual(["FEHLENDER_SCHLUESSEL", "FEHLENDER_SCHLUESSEL"]); + }); + + it("meldet nur unbekannte Keys ausserhalb des Blocks", () => { + const inhalt = blockSetzen(`${FREMD.publicKey}\n${FREMD.publicKey}\n${BEKANNT.publicKey}\n`, soll).inhalt; + const befunde = authorizedKeysAbgleichen(inhalt, soll, bekannt).befunde; + expect(befunde).toHaveLength(1); + expect(befunde[0]).toMatchObject({ art: "UNBEKANNTER_SCHLUESSEL", fingerprint: FREMD.fingerprint }); + expect(befunde[0]?.text).toContain("hacker@irgendwo"); + }); + + it("prueft Rechte und Eigentuemer", () => { + const befunde = authorizedKeysAbgleichen("", [], bekannt, { + sshVerzeichnis: "777", + datei: "664", + eigentuemerPasst: false, + }).befunde; + expect(befunde.map((b) => b.art)).toEqual(["RECHTE", "RECHTE", "RECHTE"]); + expect( + authorizedKeysAbgleichen("", [], bekannt, { + sshVerzeichnis: "755", + datei: "644", + eigentuemerPasst: true, + }).befunde, + ).toEqual([]); + }); + + it("meldet einen beschaedigten Block", () => { + expect(authorizedKeysAbgleichen("# BEGIN SSHKV MANAGED\n", [], bekannt).befunde[0]?.art).toBe( + "DATEI_GEAENDERT", + ); + }); +}); diff --git a/tests/ssh/authorized-keys.test.ts b/tests/ssh/authorized-keys.test.ts index d4adfca..a6b3556 100644 --- a/tests/ssh/authorized-keys.test.ts +++ b/tests/ssh/authorized-keys.test.ts @@ -209,3 +209,14 @@ describe("Diff", () => { expect(kurz[0]?.text).toMatch(/8 unveränderte Zeile/); }); }); + +describe("uebernommene Keys (#022)", () => { + it("entfernt nur ausdruecklich genannte Zeilen ausserhalb des Blocks", () => { + const vorher = `# Kommentar\n${FREMD.zeile}\n${BACKUP.zeile}\n`; + const ergebnis = blockSetzen(vorher, soll(FREMD), [], [FREMD.fingerprint]); + expect(ergebnis.inhalt).toBe( + `# Kommentar\n${BACKUP.zeile}\n# BEGIN SSHKV MANAGED – nicht manuell bearbeiten\n${FREMD.zeile}\n# END SSHKV MANAGED\n`, + ); + expect(ergebnis.hinweise).toEqual([]); + }); +}); From cbeb0235f2709845cf214e66d91f16e9d70a447e Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Mon, 12 Oct 2026 13:05:20 +0200 Subject: [PATCH 2/2] test(abgleich): Abgleich und Uebernahme im Browser (#021, #022) Gebauter Stand mit Worker: fremder Key auf dem Testziel, Abgleich zeigt ihn als unbekannt, Uebernahme in den Block mit Dry-Run, danach keine offenen Abweichungen. Der Test raeumt einen Benutzer deploy aus frueheren Laeufen weg - genau den hat der Abgleich zu Recht als von Hand geaenderten Block gemeldet. Co-Authored-By: Claude Opus 5.5 --- docs/anleitung/bilder/abgleich-desktop.png | Bin 0 -> 186650 bytes tests/e2e/abgleich.spec.ts | 74 +++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 docs/anleitung/bilder/abgleich-desktop.png create mode 100644 tests/e2e/abgleich.spec.ts diff --git a/docs/anleitung/bilder/abgleich-desktop.png b/docs/anleitung/bilder/abgleich-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..85869d469e9fa008fdc3d28f91bddc13688f6000 GIT binary patch literal 186650 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

L4id~Q ztRek#JI99v4;KrW<-ULVN~V-dWyDb|=-=!_Znn@(HhSy2RVe~phVxY`;uFf5q1Q~^ z_mHnqq<^TL^gj>|hntN#EvFd(vH&ePWur^` zg$>+Hb-ahRMu+;8g2!f7Jn97CLbe)K942J_%t2MTI{MTt;~7 zOxEp0l_cIN#+=%%Si$Gs+v9szg%-dXO-jAk3X(ys zTl+UH=C>bD1GcX8mhYH8=gp?NyZPF#5wkGQg&Yl<<%_e7M#<{dQ_yNLs18wV1eI{o zj#7aq+fbTVy%DbN{dd1Yl>)|S#`S2q9PIbJwdL4vjUt>zeexP(&c}TL`$KQln81}c z0)9}%Sf|r!PnSKh^k}}Npt-db8Yb%bFL4K&yE%> z2(vDDYc#0B5@4yWbtK}$Js8i41odhZO=)y0pcyRdMMAp$Y_5COQtHHZFPc}3eO{PxVlsCU~V|4xyYw^Z*0U!L3~mA@3ULR z%MUS1aL!xw#>)sm_}VOUqKdXcF()M{TIcS416<@fyMAGYO+qB?Vv(E7p|2U(7ws$c zA}mo9eAvZ)1V7^{mqWguphG|npY;()t13?ReAgUa^-1`XKm-YmBxbTVxRr1h>v%Kl z_8?l=LWYL7$w88(+s^mF-aV>B$^TCyaz$UGpSh-VK-t0jP*;~X>(!<4rpKs1JU^W# zOUDM3MEdv@I|F08JvL$=xhGHeo3KY+JcV0&ia9s8&+eDv~JJ|BGA!)z7mBXYL?zG@q}cd1ivoG)s4Onnab!}XZA)ap{L@Twzo zRq*Dlxn#PC?bx5Z<4#q?uNs;an^N;Db{A8dL58@`}JO}yHGXZJJ{*@JN-fM{G zoAsNH2IqLTnBWAXhAxkKE3jtS0}r)x_CHyFQvKu;0=Aa zn90=n3p^NwA3t*gKde(^K-b8my7HqB=|z_4#sH^emZrUog%r{?la}Y`KThY z%7q(Z9FJC|2uXWoIYkOC7}YC@3xkyi^pW`_E72N`_~g+I$}LBTX2pbIx|z7^wX`<~ z>NVJo;>lm_FSanBTc)7ngp;%{6S7|gXdJ$&=GTL;1+wDWd73&`Obpmf#1mahD`mzH z5gcUzslUP~i%Wyf_5)CK8?KsnYL-x(Ol{3cDZqA92_&?oSk&$9Ya5avG@0;WC_KD#JXwhox~op!hh$JJ$L>J3ss$dpfy9;cFi`)^T1NloZrVXJgKFt~ z>SiL7JOdbH{>G+)X{DxY!Bd_YpMwO{)+DaqEI@WUuu5G6tZj5NRJ%GUO?O$vTS?FB zCk3r$k`Ok2b@BE*YX)29e?CBO243%ant>Q2nN`PPQ->RH)t$k*dJYPiRTPUHB_Ioy z81s0v*eV5cg~G%lx3;? zK5529oS;JeG6rY#VHFL8gF(RXGFyK%onlvlYvHA$e9!BqEr})u(Fs-ifz9+u`){Vo zQBt1K&WVq9n#DT1BiJwvmSu(G4?7oeE8}|NV-m@dV?}_%BZ$^dX2tTA%asJ1_`u`V z|(0CA$$y93ZkVz2C zQxbbNwCuR-$ZsJG{CD<4Psre@o9>OkX$9Ek3r^LS=6?1B3(d2$*^(W;Ox_I~EeJE|~~bk@{Bpk7iz6XimK3U`VkA>xz+}Err;RqEq>i zB#R<`!%9%%byC?`567@U#V{BVo4WR4rw6kZJ*Txa>!f+*+aJRfLfSfb?2qad zZ`IrtE(7+|8N?2!r})j}z1J^b7pb zNCXkfly$M)&zEUfNo6|O-(HvA>7D$Z3+QeY7>6~bXfZ7_#KAM$GkdUOD%!ka&iU9+Qkxy^(z*UVprM9kZy=YCN66n7YcS zfLJ>q$;!=3jevqqfV#*-7l;ell0yRZ(;M=u;lozWWn%pZ z;4S@?%7r}!N&LVdk?uDx@DfuHZ z3op!9vVMjaD1?iW@LF-W-XWdW!(99L>e4B?GSK&QzjZ&-JEVccZ8X&UeE;a+429>; zn%bdvy#?BDoEfYabB&XXjn zv{%-1e})9Y67Llu>)gEafm*clM;=EKb%Po3{?CKQz@~bchNcCY(Iwzyy8@ypNI*qesNACF{$v!9FjPe^D-pozJh$NIuHB%Z`S5juobI zSB~9yNzV!NR_P8Z-5CntYe@KTyDN_m@v=wnO)2x1I+nxXJOGX{N^g$E2I)wYRUDCG zbHwi)^50&jTt%5JOJc1SK5X7bULnsnh_z^#aek1c68J1zr#^S-x*%{-aA4+Qx$%ox z-ez}1v*oz%kkQl(Jek%t)8I}rP&r+zS-^D#A7uTSv4VepoT#gQ(w|m)rCvTtr{7MN z(;;ZBr}0&@ZCqggvUHG_nQixgsN2!db{=|DSG);)oXRAjSUY&a;0}mTrQCw-mFy26 zPckoT#(Myo305};!GLx_7l^?7l*(&Bu9UrgNdvOHM>z0&u>jCE;4!dBh@|Yldrcjb z_>cyx>rY!rK#dAlu)IdF{MfMj#Cwxc?P9Y&B6umq*}tAs#)QGhuz0U z-a18YEqZUO59RF)Ie`OeQS0NLiM6!^L7Isr0-4p(a)nF7QZv1y(BA<;~{=9wB79;Nv9z z+hcSOic!?dcHCp=TMr5i10p_L8ZXS z@UihyS=9HT z!CmA;)Xs?$EhCApO*0J+2^C8~2r-%>oNg(aJtmK=st=FoSIL@%LrCF^(owSj*t|V| zUoC(1yy^3B)6!WN@MsyY%x2k7-%lpioU@n|zJ&|2ykM4<2V*XEb(Kcn&cD-5;}w%0 z0~M@|%SHyHtb4UDmb9M+?`=--dUmv)?s`4ox_Sm9Rh?4mX3Tt@Esuz7x9E$AGqHGN zFl`u_vJI9 zH8my!Rq}SGnImVxwT*~fz(V6o#(uVbmxGpeo!VfuHATbC=} z-Fb*;Lyfd~6B=9>v}{z6Dk{KvU8?OvNeJs2{kwZDGJCJiA44w@8Vf&~jE;92EZZjG zALs05NI*64Bx??f05x{0V7uVq4mb`{>$@J9bNHxgn|p+oSsjg4&%GVf#tPW-z+>{S9wZpRqm7k9uHHkQcq3~^MpLvgq4kV>4Gv& zX4*&4`5!OL$7p8UpxL&AGpN~N@tl)^)B!}}y4Eg2WK)XAOa%v@LeB%k^Mp`^9!IzR zu70rUwHhTqfZFXE)fyoad#S#y7p=?)#G+V6KkKC+C#yvZ)IA7}kuCJB13d=G$d)9w zGqYXd>uH_6D@;g}rhZM%*^4C6e>ea_VF^D~$2^?1uJd&fcghj+Cn`7#{ZQxL8f zdWrv*>eu2YkeHqy(j)DJbqn409%7P0_zDVM`*Sf%@c+dQZZcyAoP_l-tE^iC_>b(R z%>dC9zHDnywT+3BQK8KH`Rmz0RcZV?vESN4iXWQ`NZYw@HXqwe zcD$XKz|2g%J8j{~j~=L9pV zTbvX>YIAY}wlQ$v%i-t^fCN)kSb4!JfYh*Y+lU52I)$$nK82RdD{=qn_qxAGkHwu) zNN{n<@Ae?(tzHp7}cJUTNXZ&l7y*D;VI9{v#lm8wm=qjWM%bnHwE*oySZ_y*kv4PPp9y zNaN)V9_>fi+q*HTxvGpmI$d>@dY<|F?nK_Ta5c|aLd5g|WA|Fg?XE;uB^r~? zm(W8XXS zFKOyVq1E$vkB5Ut-qlkaWnUU|ck>N>KAiEi{i>pzhvUpe0@b$kiUb2O57r3zZ2HVKjE z^yTN)qw0gP+S@UfciI$mK57QTKVkW?b8b#$>$w{tWU|Cpd&uT?et%q!Hs8fG4_Bya z*g3W@r_>kmWeje)vwqwvdZ|d9nRe9DtheVHkw9ln)ZLJ7U8y3lby0Ri44L4`O2>3? z&Q6cwH6L-yH>a9^B&g{e!75Vu@Zr-t9LJ@EZt8l_C`DqZWPb`Y9PFo0QvR4c3Yv4l z%EXg~gId)eyoag~oG{v&aQdipM}gt={16TP3AT4g-huDa{y`GN^pvezXnwed5pK!4 z=^ARbG(})#2;skQEj?Izk6M?^$gr+x`0RoFnfwUOgV#fvzPqjU+cyq(gfx{gb+(6gc~H#kPRV4*QZ}`;Gq+(L2f8R1^H8CwiSMQJY%_*XK0bkPJ(A!Rk>ot)pw!^kB;BDF;Chcf^|BQmI%7|{+eDVK-RrwKZZbcc3?2BA? znZSo%_7FxD^axrK&5fRZe&3b^*(c-pR=-<6NJ@9Vz4>$G=vNqHZh857?tK*mhum&Y zo1nANoC<9`V-m2JmIhLrpYW+3JD;5WBOBGv&|C~(A+&5@0>6z{Pc6(cBsaBIhe5=BDE+V>FPd+C%{7Vh0 zCQbE8;&!8MY{wcs*hQp3%gn15aHa9+E7(#V;o`wmBkTIo6zHz{8AGWJo%i2SGOc9b z5VH&at1-iH^!Q(^r6r#}8~Uh(H|=o}q9HhAS#(xd9>O=_ab&&UUslVy#`jB)&1nrd ztOfNHw6kz&edTFSF(#ZI%=QOxRzk7i`cv7|2nLe?g29v{pyAL8te{T&PBD@m`!V)6 zs`Ii#{#GyyPjeqe8!JNF#i`54d)7clPxxj%x2NCoelbjpe;$EJzs2hLToW*$sjUCF zBpM`co5E+9Fwj2cP{X8x?b_y)*JtzY*U>-{11|tthwjesEc;?lIRogs7hk?F|Lf7t<-r*j5BqY+Ws#jNE2(l;z1)t8OAUF2v4<(nNvNOj!g@&i zfs*p!Mgd^N1#q3BNu~l6Un~*zC#h#%Xy_iF^9oaa@3l#xPsOvi&)x;SjqS(c`bN%R zPnD6-MncB3Zg%hbyt`u{&C z@qKA^$QywS7wB2MW8L?>#PnyJ!@jb*)+QjTw|__eT#qD9QP(uskl*ej(Cc1N%V-57 z`Wci>K8?GLD^#Jvhn~ag|iz-LCWAq1;z2!6j~*K<676+1_I}H zLgMUyr*(LF%LnAH#pj5Whuv(Cl6D)v?C9<5gnUv$3>zccAKTK>{fWT;&IR!3W&>w>&R&uasVFKr6-T144Gm#a6$FMM z2om)xJm3ZzZo3rW55%AFXVeHNls6<)EeC01Er!A+ZDx~;%^(e}{*^`S#-;Dg%azBr zsjN%R)x9EFT4cAD2nmI}$KoV6Lloh@g!7#BEvKiS5{hx~iIt-FKt;TqUl!c%I{M$M zObyj~Yjb?2t%4-EO>8As=f}L*57pL*O_7VwNUN4$jV=&SHO@{Nz{QrmEdnpXly}9X zPhwG7<0cnBQ6)qs@rV$9PQ}G$kdR3x>#uC6AbBjPk@lX2x;Z1Dn1VYV&hYHtUyY^d zmj!Ftf0DUAd+>`wMg`h+n9vfqJ-kHfqcJ=mA*|U5RCx?>KNZe5eK4|<*bKsDP=n z&hPtH!7OHWLutRqQZs1Qw`!4@%XM05?j0rF>Afk>g!6?Sr>0{E>zt`8P|ZwD3%*a5 z_n9-wX3Bt@y|fe3k`vg>vwxF^KLoem*X#h-((u_RVK)WTiWm@P&M@pL{M_D&xUUpu z5f^H~AAPKD{qX@8=UZPxu@(5Q+P3oDIT6I!$3O;ys@m6QwFr_;{@k2qqe2G1kfMV28gUwK^Y~uA z43v7#sbtckIwe(xt1O~a=i^5_-|dK6LgmjKT;=HG*e0dGfn;S-8Kkyq`7=L^yx zJ1K?&%%lI%_%LR@=6`l)m@Ixk2U`$HY?G^3(0-g%VBE3R^X+xQv;Q zEIVhtxVz7IgEO}vu}!j?a)$BwwYmn9@mppmgh18xtiO+KlxZ-Sl8uY5@pRCe%Zw!9 zmhA1;ox|n>Pj^&7`$^oIML&wF+Qi;6)jV=KQID7d20FTiNxJ+smkqoDp#UXfI4H^;5(fGL*ym12u} z>Ikij9@P>xEcLYj06;8g= zKCht9UJ)3Jp4A4iFT`|H3MBHmrS3)^x#7@n2xXN!5(ol#_$^xApvjSdJ2M&{?J$-$jfhoPxubgj3udtHsM&08cS;Gl*5 zX_&UY6A+0%RRQ+~tpQxKB_U)PbGzi7|VQs=9=;oZdU`XySr9~}yt zUh$^B7VD1T2$TRLLgY=pPxQBup63~U`KrC&<0+gn0*Y-7?nU?^T+b7C`2DNQfbR&7}bGZfJaYv9+dn^hw?~2zv7GF>@mussCfQwDx_yw=#0WVPWOPt(Vb6(>8Mqs5mkdBYtef(UPdDBy-P2jjqhc`YHHcb}B}CfT0PpPoG!#sPAFlM$~`uSLwgV@S;@E2_J9vxZX=t@~ASzv4Vv z?5tOMcBckMBK`Gx<@M{enzFJU^EI9hmdkaXju+ynl%E2L&|Tjc%2k}c{H9bsa%+~K zDaxxsN0Fd?RsOCkN5mhwo{G(MGR)b^YkV7;qb0eKjUQXO-KjT8kuM?CsR_Oyj{^^*28EgAm=#YFyG|KSh0{*F}VKjL?5a`(~myxR-VsP9X_K@cj&aIUmbUYHE2|#*ABu_RnGh zDg5ndgY36Y*v~~iaf?pPSda_8`fofq!lCS_A^al7fso5f(x9?&CHB{FIM;zBykl;I z^u>Sq5OfqyuFSa|n1Q*oG$`JFVsXg+i&cJwIIXdq0*G?;Us!O9u80?0U{16~7AEeI z@u8iPa6xJV^vyul_TKw4|fMlmX6&HUm*PE<{y{g zM{r~d7739^KLVH_7R(vkO;+Rebd3Q80$~r@rXjq4!t}g-8~mc7?rDF=@3m8!-~h@T zGK7WKWL8c(3A|%8IcY_hq$h8*k+!|U~|KXO9 zl54Syu~KF0`y-CvTGp{Y@V})Je!8MVq)XT57Ivq7Ud)E9caJZYKbOHSv#T{NpDK20PHO`vqSfuiIfa zCi;AJe;N2xeXBZl5LqbNnqcm=&$FwBcA*`Yr@!qmsCCrorYi*ta%OmJ;XU=p=*{UD zH=(Sjqe#E7`ojMGKsG85ImwgZt7caDG(vAlT`kZ!Gf9QC8ON}AKR(s{b3?X&UIDL<+r$dQn`rLoFK zWKwaym*bJ#YRAvU_dE&e#u4DZ8{nKxV^ma6(KzOUpl-7(`QhS!+Nm#NP|j>Kgw^IP zYk};bO#=Q&xsce;#WTp;7;n$MdXI*sWz;!{1^(SMPUJ{upt~-QJe@dOiDo~Ncua8>32>x~e5S zHLc@^0os=ii%*hzFz98Srqq&35tnqVy3OM07&h{%b2CoafL^-{!i^#XUH#5+UYqc0 z)O&}XZLTz#%=)2xH;_^)zFvXSwT&qR!1-BG?)(+(g;+cBHwyyqthG(dS@luy=?8fV za;l>Sl*@QxW?rA%yH^}~R9USc#O&c4l@-6YMdt0byZBpTV3!nG7*->A#+K2J>uP~i zZ>zRebbU4(u=`=~#W9EDm;ER*wG!z!CO!@b6^WaD=(;{HucO~(#Z<&g0}dQKLla zt?E1S(BtTxMn%6}*jZ#Ia_1*uBkQv-DSKwHucX6E8d3xdMj;V~P4cW)nZ~46jx|le zX(|in=S}Y-ZgHMB3760BrM6*mgOBRa-*du)T!M~VCM9F@yc1~+&r4}T35dM+gTus1 z`h8uXR05WAw_B&3HsHk=;EvzFSFHBaYa6vivw|z8=Poz&Tw6$K3R$6x3+8sJj!Lod_y^m(BC7hyE%sCu`V;XJ; zXg{?_(0vw@9Y;dO&%!POTJbqNq@S9%o(QyxsH>S zxlQecaLD)TDV&OJF2?~WDhcgZCofi=huOH~GTMsMV(Rvb`ZhC<84DfzS`N!_JTqs0 zRrVbqBp(F-Nj?gUyM8ELrQ z6_LAc|0?rr(#G#Q6DVk5>G2)Fqfjoyt^O$N4z%I23ZsuuGOZTQmynHHbhV1W-)zTa ze4UGO&+&mVGxfqJE$?n(U3v6H+URgfB-suBFIR;Nd z*~mzWa*g!$R^tV`30$?59M$oB)55Jc_>cSW2tevMAOW`0l6hyV(A|y@SeH&1*^Vb0 z5YjOwnMh!KE38=1)2W zuQ&H%IaEZ`d}8=@76^xtWp%61R#&tV=n4dENTI7U|5OV4B*@9+r9$5=$jEYDEjO3+ z8nQMof^_BPa=EIa*<;MaBy-OepHvEz)Rz~kYFy5v@bAq`Z)dPpeq5%+^ik$f3(;=B zlVaNoVKK7Y)w;d~ey;>^DJ4}}9BDHuB z6{`uscj{Hi#QU7-W02enWCQnbMLpQTaYdBK4<^N*lAQFQ3I@9Dx+UAwtW{967==8o8S-&rg z3^Zxp{pk}cF~(Z<0)cG*n^BKg=Djabhb+B?_;IXhC+eo6`wPDeFFHl&CqT8J2>l<$ zB$Xb{IWD1HC!MFi{VYaI%!^osCqPVxbq{y;L#M2cr^U(otWL=jN3E(c+_VweNTZ8B z`f`dRJqD@3+G03{DR_P;$b6sdz|=l|qALyn^=YM+WQU|HgRTTsuLU~7tM zNp1Y@DLkb6ArJEyYj8*nsH-Uhp{RMo7w*!Y;)@^aI}k`eMxg^uD55A59b6mpfuw+^ z0Qn4tPE5T;uBROq|5PdxKZ_kr5V}{BP$2jJL~$m-p?W4p7ELo?SHoJ5_b+B)dDAE@ z3-wpV#TD(tdm7%MnVAyAHmqDc#0>vBiGUM?T#(l!iHj@ThxK%Vg#3M=HyBs zH5y)Pb6RWjphg{nh6DXU{6GrT0TQ@vY+R!=LhU7bun^4PE+8i*_AeDVG_?QQ_idv~ z6hD%;&jg@W9uyQjv{e>>I&t>w8*?K;*%=-{VIQ+9^L65ZV~u+p9WSqT}GGz z#ndd7+;0V{G^V(P@k^&~fF4V_1B?0}L8UWY28;$HtYZ2tUBE}HLHs8}N`!WbNlgaf zV82mdyU-Fe>E6~6)@&-fMTa*v1d8#|{0>(RxQ5(-wX1Rbco$2Tyz-r+J=^~P5&GqA zTbhjvw~~WYS7B#p$sb74MoxJb5l72!Np%W!u(;@AypCvgPXwd4cRp zw#|^W{uI`mWza|>64|9-fT6_a<}2I0?-;Jxqbbvmr`g=4OV)%PdG{T*z7Ur39SF5B zLxys9ubO1yGj2DT^m6Z5$rQza}H=c5X@$2dv$+ z=5R-nH0wFpHe{IaCOO|u=yJo$BGy}w5~J4y;oZC?>_Sl~4D&c}q^MlY;8%+mMI3xV z{q;s)QSpLj^uL4!B<+~yZwHR|Xx=(@Mlud0u#+`gI{IE}RS;}!P*%2ItSC~9d&bqK zuw-^pXx_h%r}oa9a8w#qa!T}Vf}4uq_96>GYh0f;KcbJOpd{)^u`n%-0#=$HPQL6} zWfjsWA7Ri>FtnxjT^>rpYBR8i(dd!KE_q(jQnQ}KjQ32)Ks&9pnmHM^0CdrII_~|r z1@P&0G4Bf@@MiK#VN~?+JotEA4W>*na^%ALpL}N&0r7y0VPfbbWxCuY9RV=VFjA zdT*U;_uS6ucDSb$BC2IRnSS6q^&RA7$3{qT=qa6ykQ0+0wBsTn)?wOwoEjYkzsKX` zOeQ6URek@(_47QEfS6fz=l64LK1$vJLVHNHwV6{u!_Rq>b`hOJAv7W{Kb{TB{tHsV zj@twFWyBNVahxaC0N1*?eOuP^bD{E)cH-nqKBNmUc}|}B;~Z6v>Q~~yW)e58^;xlQ zOxyTV$*1&%tctQf7;3iVu_9vj%6*eZ6KHN+K5W)KHLl1gsrlAr=2bu~Vr+hWbIKT3 zwz7a;`g5-~*tS?e+f>jQn%Y-1!(Y%7jOo$6x_xu%2*=&0%4|LBN-@+cCmhL=^LpGN zTr4c-0Pi-_tg|UEZXPsOjKIs_@mfIFVIhErr>@MK%n;b<8?tg=5JsJtVI_6{L>BhV zNJ3H587m~&od1=feHqLA)e(aM7V(PSv=WTP1Z^uly+ewi{Rct|lfr=QZq!uFw(u~x z550&U@LXxL%B*ogO#imtk~a?=VUw3v+exbXV82iH*>oS=J<@cZf)MK>Kx%}rX!gLL zBjj91J{RcZPIIN>5sdp}1~Am{x7Q1|0p7)P7B$}bg)%SW(z6(}TTS^06su8AjaBCz z;ppl=5KC!8YNhc2TUGR}bG%^{AeRJl`!+v!w+5Bgi61R46pYXk*n)}DM$^{uyA#@y z{pWy`0!A~J+O`%B`@WIe`55*``vu&BIiJ+!>O|H)fkf{Q2&^+*>Ps{Ux^Ep%JACiM z{*%RpWz5xhYNnRX=8b}Wt(j~5C%P02Mz_tv zd7wE8p{@MAuQ1fqIaF`YN`>G*WZ?UAQ74_=?z>iDY~d|TnNs1$wZnr>GEvKvA5}Rv z_uNc~Pn{p6NZBUr`RlhNI=7H}YE!K~ zZJeB0cmG+q8dGvOaYA(^W)ikQ?XJcQhK z9e1-2eo=TOEV^Wfx2@D0H{CD|Xbi*YdS&^Qla7Xs(abnO&>e9Pf}5O`e`lPa3%mZb z^-%GH7N+-k2ZC}VJ8#PrMG=&G81&bjeiCrr?Z|f9XDxY}mXNd%mrbA9nJ=VB;FF=L z!;D4firz7NR@x%N6f0b20h#|Hf}X$Z7C z5UB!ibE{c;$Vihu?o@g31#x3Afz*KdbX>YLmslP_fG-{_r3xjNI6~5~PS)1eHB8NY zK5A`hob2-k#bcJwe1hc`k0YRY1533_uHg#Z)v`>f`jv-m8XNN5i;VBwnsaWBDtL=) zMyQzE-U7gK!BB>Q#hQb1vw<3K=^9HU9(x#ly)Z3*X$;h(N^rC5xn)Ulwdtkj$z|ss z7tQ-t_#*v*hHC|fG(*7FGg=F;-H4q!NPnKM_8^HW5l zJLG}UG*+HcyYaNu^;e!71#NJgqjx7}R?G$(Bo}2ex5r8v{$(lo=0(k*G|nUdk;UWT zLv2MzD#Bnc*sg;&naI(km{0Y`Vma0L-{8vfx%>o+O5N1$v^NmW__^Bo5nzv9Y$dda zd3df~s8MT4Pd5!T>?D@dtNElisCqD~T6WH@@!*NHD9gp@@-J zdS>O;Ffru>`T&{RFgBA)9{%hjF*AzjCx>O=_t6j1asgFFZs`*SUkzHeWmc0$oBMtL z^cEkkFeRn)HcmEhzqhTec=fu6=YI9yu>k*DQn<`hmz3`D*4MmhHS3kQTrS4S0p%)HkgP?yjCA3SUC=AOD2 zHUS;3>ta4>+>fl=QppN2Y?ZYja^PQH;QHfYNUP+h2QOz&&lCKd-x39USy zWr9H^<1|-9lI{}Z&)SG4@*(WD8Z}vuF7gC=UEIhoYCD;nO2AZXpgM3nuHS?NGgH{+ zPDj$^YNg6|T5M*L$je@_FWf9{63EZkdAlD7>u8p63mS510tO=@BYCB?(;_Mt&(GUN zI^Gu~rq%;Jg9!+Ft~~QYM*c*zCo61WOgmk;fsUvXKtdW8+!XfpdWZ(q~DCAwK)xUrobRrY%V>;b>GyR+H)f$;VNm>ne{PH zi-MWFn*bStQP$DZtKgqg2yt?)hNF2B-bWD3k!sLyyW5T)kg&q6V=H*>*D6b|xbpLA zg%-$D?qu;^7lfY$_gq(OdU#O+p{z(@6B(0Sv+6nni`PS@V@`g~uH|zuGT4TE?uK!# zfdx&CWpNNENt#IZD<7*e6?3uVT2NI^b92iZ3#EW*Mfl;IArQUh1Y&#K+B=< z*`o(vrLhQbU%ezSF0L>GYjCAG9yIFl9+^=sP~c_^YGL{xK$-RPv@eHJQF=2!)IS{}UO7^NE7&`r?5?f(BFmH)l5&6R+?be+Bfb z$yKwtgAd&u95LIQoZ!*`?!@?UOoS40X|S?cJ_H64(i5g7 zmAcva*q7hd+v=6s&1~3vKr=Fv7!qWg-YbFV3!Apq_a@KMYh>?2Y=bk$kd<{5ILLFm zq4(}NLiFxl>56)R=7=Fp2D4y<_cQMExTQypePec?59iD0TVQLy2}X$4`(e?#Cw0(( zpt+xHy!NuHXO!9=?_#p}P8Y;RY6L@1n%WP@xl1XrbolHiX8gDO{%p1C&BECxD$X6A z8+-Bf9XRfg8Ych9?4N;cbCxc3A^JsXKUl2O_ivn=>j&%q`p!(#-644u#Ho?KqZS;+ zNl5xELJg?*DXKu!;{Aln#nl?guc_|_h`oY)??(UStzQs7(q+Vmsu)^FZeYZ-w+{^> ze+5K6N9K{V{TctvhGA~cgHIWVYxK3ccT7$BbbzwKcCHC-;_B?;HSfY$IqDL-p>>ut zf5J_l=|5t?x!C%uj(C*fn#1Bk5jI*#>FXf@sb8IhelU!HT|v{huYDOsnx!)RwZzDl zQn`BN`y%DoYn1VZw9kq$q_b0ds^!!__BlI$n$JblxdBxcXTHAS|5%X7Vcw>al$SUk zEwLy-WqwMxCp(76BdJ-%JSAj({+7F?Q1WKR+vqce( zo5hXe{6SAAXU`9g^>cPi?C**Q>FL}LzG`bWSsm=ri4JmnA=`Af6?`Kj+#H6_~e*fM?2ZO_AAkMth;=*R$5 zbufKq!}1I~X=FM1zacu21yfN(r|TlO4YCsB)10g@T&ICJCvBOT=x(Gcnf{pl*cN({ zf(X-wlCIR$ zW|ISNwqYbU$?r&n%eL;}q&M7rfo~oFb?}xPsl55GeG$td_$m0)n|=u((SfUXZ~x77 zKL0fm3{!?%=?js+>1oOIQc|;cm1Kw z(#=Q%xOCGMN@~UL{78NE(v)_FBK)oF9Fl@}d%@A(x7M#|YVYf>+wgIprDlG4VaB^T zH1g|IJ)T*6?2B^;G9l8T9%ExGmr?IfIsK8m6pK{NzGK#NAwr`Ul+G;F@la9DX9eL5&2uEzi5yT&PWn zS)Nm>vxsG`K1*yqxVMeTF-y$+?sVjCc)kt}oeIAdvo3Q-h-8JDo8-eiiuG=jn~~)) z+OkdgmM=0x{g4?FLGMM|^6%(~BXxG8zx5$gVo~1$XICv-3IG|mH}gwo0{*r7>;euW zydU=%eLFU0vRT<8Q}0V>EFfhP-JoBKhW2|hl`J5RwW}0^Y^X8kG(V&{IVa~MWh4dr z_n6V^>{>lu{2^eA5{_P#;I0y3Qjh8V^%;;wURl8ctL>nPeoj@8od3R&oi@nj6$yN> z{XS!o@^*XeP!C&M^~=PB1!if)V99lBVxuPE;cQ%$)q%9X;m~dGcI<{NcB~Yi8-v6$l zTw0#E!soWL(RmO-M#TL;gM^?n!I=#mhG`q9s+W6BzE)~nNmPu6pI&qCnUJ%2U!~^$ z3Lhtdy|;6&^DfUnXnqGQ=PZWCSwt!&tCa&5sORgPatCH3l@Y%Cfsc((Z}d}(jw1OeK&;8)8P-@2m@$);>v{UUP~TdSK!Po7-2!6$Lh zjxaHQ5SfEK)9V@&IE%}pIr*Fr+p2pX5lB5ST%-iE8i`+RMMzZ8u`=go!LL*f>i-ph z@~|HXP@Zu>&HD)Zn2fDd>tT24QdeBT8A~7owssX<(?8a&8FGUu-Atx+vW0NBT}I8y zk2Wx9)(1yXuxl>QR=q1aR9>scDbO`!(R+^yYQp^FhyQwvNw(LS5+%XA(I2N1hr;PeFOVZ;W()Ei8KyL%xg2}N zOEu}XHb!)pG?G=dAs~0#IpymrP8#z>D#pGXcmRe6gdRC1GFu~+wmFfBJb@iL3Nz4! z(IK8ilG$iLgSqPM`|;3-Ol&p`G5gy4Rqzx6ft?}8whIgn;4wwpNH2MEKB-=@h;?H0 zA9Ug@l1}6mnHE`PI~LhbhPcF*lNsH`3B}l*j*0oIEwA_x%^q)feGuv}Fls9DBNDR9 za}ZHJUIuMk3D@CNK|+>&pP*3>v40IaHEp|7!;Q3ux5t)YN_YKYd z;d1o@RBG1g=)YmXdXqqn+%A&(3lj2MlZsi;m936_cjqItqmcWiuY3hb!VwJCdS91b zt~*-SLT-a^8VX*olA`jqz7p4b8!7<4}N_BEQOI= zxZmDihqfkNN`j-W{QahrFFMZ-?GQ>?B6nAXfotNj(4^knVE*<}fV+axCP4l$Dw|v) z23q9Fq~Zvh_rIy%h zHf`ph%EhOH?>}xT+&NsA+umy%egU=j9@?%NcnTkc23Es+9{IfgZ5g8e^Pg{Cur2oG zM$RmHaNVNa)t!#_WWsNTL4k#m3^q$%9>XSuJXLB#e?`;VzNzQ;g_}ZnC+UQJ^e)2W z)bD?0$PtgEwt<|sZg{1SBmxrOu9@caiHCnj=yta%DiJRkxQ{7{yiPmULIk&yir#@( zJsS4?Z)hC!M!mq(?C|Im9ho&?^TnM_vyHQ=iO(KV1#ay;4x+ls{jYpDv}am-vWW5kU7Tqa38d4na@!Cqc27Brd{`Kvy;GXw_in3X?Z>17voyJkQ5V-pD=mZ&nSy1 z`mC_)WBhLnwMGjE$?}bmK1p^tN}v*TS7a4h#7Q;Ulycq!h6zD50QKFU1wY#w}nb`Nqb?`s|$pS!T_M{gcy zRP9-l+|LKF63Xn=PW063KGfMmmj397C6o}QwY;8qa*fYlTz5}pC~@80Tp1S@=I)_~ zwy-MxfTQ3&GHPaZ3=X%@;CLfXql+u7?YWO!F2B;;sIxI@jg@_=2-1FMXCvX?5 zBLc4!)wbaStJ+Fo6I`bEOB=ru&|CTHIOhdJUA+1w8YI1I!5&~_X|n!U`gnk#F8+>I zGZ1V|H{K^P_&MuyNA{~->5M&PRp`VoV3@1kcGKmLuZ~%O{kTG$5nQ8E9Q2Ns_rGvh zuh82V9Wwqe%J)Cf1H{$UG{f=DEzE+JrlD2m9v$TDPUr2WgJmgu!#FoA@4n~_BB9+f zkd0}J&(|!Otm~m*F+{j^vUN?~@othX^~vl5B;iwx>z2EtctO3n6Be{ymwn5?Xf>ZW z@Wr;^I{oz%VuFx5vCwl%45Uy8L^BJkRKWXqI(IxZ)+hlsrs;n!Y9(?kTBzAH`hCmr zlTsSL$#h-cTZ!%kqdF{#(=yWEv2W16KABk@!KUcbxo!ze28t&R{Nl7t4h)X=n#rHf zOrOREKNzHx%}ys2FW0F{$ygBd$IXF4&x^$M;Dx{E-$1HcGGRa!A zc;~d_pNFKA=pJ0G0}qZ39pq?iKxVWtclY6x|Hgy*URk0UN}`8IO9(t(2t|W%E92qz zV zh8JmjU)CwVEclU-Oy1*nqYizPd}{=QX2SPnrl`($GW&{>ukN@gjxm2Q#`aWq)<&iFwzQ)l9E4#)-@0Z88;h zzq}2P_uoy2A@=cm7%W0~GX(+Rshr{Ef~r&dWF+`O3Yo+vUM%zy(R8$HiF>0cD3*{$Mnj%nu)Bj+AQZ0?k=~|~GIO7;;t`|kH{zsysIt9Cc zE?`BrVED(U9VN9UslCU_gWV1lnbFDi_7SwxX|?oBB*HE%`3%jNbb%|=W(Mn-$YNZ zF1h{+%%RC1FFfPiG)i3)Hr#R0<09aFHAy@1$dBNlKvvJ9SuDlN9aJd3Uy$NOX`Fsk zor<4|O&Im9X~$^~sEQ#cO52>jd*fO#!|4Rcwo}rv&~LTA5G_P>tvm$)N~ZQI=TDJ> zw;QrGFP(~~A?}=x?&FKPUR%=N`;w3IG>z;%6Q>7!akwh>{w_8K< zB_1;8hod*B+l);%)u>d^K*KE3(`yVqk-;C)q_7_Ln?ANtzr2WQ@M>;H`68^7YraGJKn;|>~ z?;KS|2mPBFL_$hsI7CGmMOaxsSe9751`iL8Bw~vs5&u_S$}wHYMuLyo7iPM(`=Vu; zQ7L~o{$(;&YL1E&uVrbFbNuhhEG~(HJcf_gWxfSRz3A=;zefDWZ#e;Fje<>oXni{) z+r7M;-bg-W$O7H1KmA=;D4fX?%v@We!C}&g&Hc70z$Fs|_I@cfn!(AeD04O^pHQs3 zRX6jvmaA4Dv_rLZx@G9)#RYVO(WD@WEY`s(D%H*5aD1Q~p#<%4DlHCi{}>rV1ePYv zNEnQS%EkNL0^h*AWzw*mQZ{ifz633+kIn~P{ug7u4=(ryZh`B`5b^znlm&9*05t)V zU5^hk3sC~H6FHI}**;~G$pJ;A7U6e9B7Z=+76RjaTf^aR`2i%_N(5(qgct7P=a-ld z(TJ2An0q_=k4;&yqDV%!?eYGJW(7+>MbEps9+0zpx#QE5+U}|7f|2pM>*-l4GoMpZ zH%m4*XHdyr21MR*O-D@O=@jJvXtLY3qOv89&%`=!v)A>5#J8v^Lf5E8nF5Dg(~7FF zdV_L@7dx0abQroL6jvqdCDHDw&%Kp*e3W0}6Mhl${<%H;JXxW3O2jpvVt6DqyA;v zqSV``LppZ6BnleN2|ES#aY@*Zg*!b)>-{&%M1CABT#y#}UFu3sa&vykIfo)_L%wr{|&jng5;%VyO)`vmiSw?Jq#R*GZj!O6@jBE?a>fw=MKJN4{hV>jMZ zQZ1MrA!BQu-4@72&;bQfFn9FBx>jK?vGEp8RYZ1N!z2kw?csE?f#1YaN%@OkDs#|Q zrP|FeP~?)@#n7#7=DGH+z+&QN1fcCg!V(SN7^Y65EBpY!0u54O@Jkm2o1KgMxZAYz zq4Y~6abVrZWvjraLo!HYpTHRep*}y)bTibsD|v(pc=e2Fsq0XU>H*E!043!mg32dd zS6;og#?t38%wEZ^RY9;z;bn~W8V$v~j~*!(1g^uvE<6SkQ?#RLB#Qi4Sy5jA*n*qi zR2GbiI3{_MhiiB?p5ZV=(AflnJ)iFx+1m8gvq&CG#5va*W^djkVZETT5EApyDxm&o zV#}9|=W)%m%4eZndSItGm^xwp$DoQWjWK0$T|{8ft1S$Gw_yeMvp%do%)2auq!tFv8O=7o5MOZC~xc@dYnjeSV z68S?V3+Qd=4?@QTTnX8{#Iuq(LNWq6%&J|M7l*NNx)h_Hht6KU?`&MtS_O7XX)INY zufGki&y!j3>^0;p9vU~&vmU^xG0}|js`=B3!+yTk_Ktmh7mE@hJm)*5^U@!2@KyB8eB&U(que6VwB_`Lu}-Wp2lrPCj7+w%Fl>c{cd7IZz*YMBnv zH#~-|f4;}_n5mGHgQv-g_b|_YkPlE}RlZ(FGWoa5cJQoL8qCP=HPJKa(4|^IZV_K=a2$JktFhkjc2b3*^uU65p>#@o3Es z=zRW$wEPsGGaiCrn@J<6NM~(pS>yRmYSGz0ss${t?Ea*0+UNFTw3*_kD!7LA1;N>6 z{+|9mERPl@_6_+qPDc0$p-U7eJZNsc4^SwRrl5U29{&<_SD++vT||$1f;Aj{T(9+e zMM>qrqhBd(;0NA(HoriB9$asroTB#{tf2JlFibi9l+X@yH9nrMhFAS8>#(_wS7+|! z6%AwTUluTuf6k7-I)}*O?Fu@59{ZqA%NkZXUa*qWqCP`Z7&hVTr-qRsy<}{kptWGA z`y)aAt-+}MVcArL=uB~`Yi`#M6Bfa#b?VVs>~SJfuz;??@wYqBd7+94(rAs&#JaMw zI-qi5q2hV>P=&J+jgs!WKvn_0oI?v&V~8#OjC_KA>#5dt4q^5|i+6*jzsk4ck0n#{ zmTSg1f;3D;ChJf)$RC>TlJZut4$1D|xb)|*-HfCskgP?)#R6aW=apLjidA*8yBpQB z=%V#H#t*lwJi}U{_tomHIMo-erXXlXP(O{0^BS1$Lt<0|kG9rDUw@CS|Dyl6R|OOa zQ%XuJ#zopZ*T;_cJYzfe8As}XKSc9*T&JCyTwDLD2PcY*J?#6Dc%aAHW4{(@k*rmn z{`v#}>x_BDh91J!0^rMcO^eE11&}4v@tKdEBo?yrX}mFFCnRsSqkb{1kn{8K8_RY4 z+uM`j#2xh~icTi6(IL*Rr*PGBu~)pOxDlMZXQygu$}YWo$xRn^y4jpoW4=ZsL>W}k5mX24bRD+}t84PURHa;hqE zslXFgi;uZTc{^yJAGn^7goQK4nH>Ab%Q`-E9%`bnHOM9sca`osisuAJ#EJ<6{u_`H zD&=)i*!SYBVs8Pj_mejl-N#q(!Gv~)+Y#O!UpwLKCJ1<97b~?ig<;SwpP>@qRVsR4@fzti0L#4GQEo(^9cXs%DDR8 zqs_mA`c_|Gw=@@QZV#w#BtERGuWNw#`kF@@ZhH_vAe#7?zw&Q2V-q`)v@<-UB$>GS zq{G@6Rp&!Uc>zL7i18Oqkb`(Jxn>Pgk8p^aTw3&In&D+l^5zE-U&YJrc(a{#NbH6F zuK(Nd)_U(~dRe_w<9PKCM92^O4u7lc+5ohnq-3;t0aId6);?&W8td%N<4 z#)9agDR3s`VXb!O&r&p^9vLeeMQPPgcj~~q0@|x^PG4&3 ziqEAyVL9s(w(I6IWa)49_>n9Tq8zR9sT-B8O$0_pf;z&gpv{g*`l;dSgFMlD{iq!; za#ZZ<>)7*BWOM?x{g=e;j_p6w)5zp#>A#Igp{b9FAhLh+hv1c?Es=4h)W0xHbp+_; z2AlLh$f1kFJ2GKpP9AdO!1E9uTrv9BeoKJK?QOM<5UK^4{Ei%wcuzx2aODDOhf$*O zoCeo5GOe75b)Ni1^6STVsNG*f!(K-@M}=>rL~@8Ebq=D$Vgtkfpqh@pI}m2y3Eyjg zGNVu!pH#x@Qr^!DZ&7V%IOy)jbH?@Gs~@7E#Bn<-yI1JJMr3~hzz_oW&H;TlC&Fyg zXUK`?a%zRboK3ex(XJ{%7cD|8GKxU%yOFZyv$n)TlntmVfJ0 zI1>(-2B9WX$_7x1%>Dk`&=Cw0-eij(z(mbQlvYDhUoPg~h9-xUz6D7xVk+bWhu{J% zZf=j+{u;~n`r#;`9x{O0Is2-E!$~2a7xWkT{Fwm2;t`j^WCK44iR(e<*f8wsA;CFs%EHl6{hCm?k1@Y`QqR>OO><4_@q(j6eA?KyVXlno%NjWgz{2Jq zqhMK`ct{}$ZT8Goa zIn>tHY)+$KLlMB-_59$wG#;|IxNcvbS#tON2BE(rLJJ{&-T8Os{vR^(QRn+lRCX2n z-=X9G;u8M;@P7r-KwiV&Z5jXnXJ-s}i^k#PAsm5)g!(6hnZ6=Amyi;5s7)%pf$s@q ze)nc{;q{Wqma2mF@`-is8rR4v@HhfF7qjT{ zy%3nzUkC9O2LLo7KMwzc@((lb9A84_Bh)KVBkJg@uNRora9apd3_{@|Ef4#`k)H9N zThX)JP50+#iNCl0m+m#?fB952L8QC66Q=l=yCLYXcdq)!iuI6kc(AvrQ7BfXD{K{x zlwtf=L(|Y2ny7*lCerl3NGLye@#LWqs{5~sFP;qP(_a!Ro|6Hi zaQtc58rGG$b4j7wMnQe7;GPV&DIrN&R>=H=mAceZM(Z zh;N8%9mBP4Gx9w9ZOX1U8<|)fh6Y1RJIZ5G8j>Q8D$Hq?Q<8_v6 z)zl<-*=Y>?DThPM6%8N*Jm&G&>_alikzhgF;_KzH@!hNyCRXLV0$TboFhSb5O8GBm z{OTVCR@I5@DyA&DIXP$fo`?t`1L~Vu3m{E#wat>KzGefAPcD&IJ_T7kyZa~WVz%>V zlih`0aria3-M+n-qEt>}K=ur}`F9$gks*y?ERa1~N$pRNnl{kG6Y=)=?Fgo7e3i|_^mD747_I{P0yb^n>E2nTJ==lI&$Zem zsF)JtL0OlFP2V9uZ0v`iJom{^tXf18c1n>I?qo;ruAX8#%i; z#c#C-dLl4vix+M9t?H-relRF0Ho0Fh>J0K1UDz%)Z637hgoF_cHTW(^`9-I-k{W7% zKl@E8kT3Pt-wsS_75AXx1}S25J-ey-+SH|mCbQ8Cdh*yY_Mt8?PP>9ekWYI~IYFyH zE{e9hOdSwiF2Z$U2Ip@blB})Y71>J`Z8X{mA*-iia0DmUkDgn8iQQBW@r*MR7SYyQ z)P(=FgBH}w%jEa|gp5b^Qu@Hf;ht=-XbmNq@4^BG^V|>lC?Qvy&8(hJB6+9Gk?L=W zojt=*=dHZSig@RGa$?Ya6c0mdSPfNe9ok%~;<1&@PPV<@egYZf zZoXZ9BbmnhaC1lv-sHG#ZoASt5qEWx7tF+H#Rjdnb^jvi>e@4gd|Q*Zl5k44jEW8e5_ofg~k)w}GL{G-d{taNTJU=ZCVB7IBWFBaTY-hmno$7j^N z^VF}e+r(~IGqvIK+#34asRXcTcKr+PW(+~OWpiJiv81(ii@y8*$F0L>JB0igdU^vz z176&xWY*LH$ohMHQr)~BJG4)*27Pu)3e}f>rr`$iiY;SGPl)?$fkMvcvPM#tEh1;>z;RJJ|3HlO|&v zTezSY>JmF1eMI_sL7BCLwLr{bRuL_ai_UiAT$_Q9k}Z10iO2OA{JKckLI6lIrK3Jy zaB)GCvNP-hWa3qpBeLymb5?+d&kSFy)Wdl5o$hwkgCH#}O`11*Wq`vEwkL8M&JfY~ z66R-aZF;F`421wITi~>j!%V}2jVGwiJ>H|{7d>29dqodTzI5z@sF9bHsi}$Iph8AX z<^qUA44z+j4(J!sou*S#8cKu7jinH-+dwL7yI;IP+x$IsVl0vymEu%xG&n`#9=pa1 zaJya9o{^hsxjKo-(>Y5%gTypvvxqF;pn5~Y>HhBt-dMCYiO%Qv6H=`jnzj_1XSo@* z^#m%SUxqOVf76HOr(uGFr+F=#}+qW^k!#Kz!0`+7`fglb2wZT@%ECHboS zjXtx@r)$uH?g&N~PGNWi(j-*CjSmgW`d;IMDteVE)_ww#^u52?Cfd{(OQ_Mf+l%iD zzHn1+zy8WQS@7>zfN0qxCTlcX@+{-fLEo+M+yyn{B@x*opG}uN_w;@%L*R0m>L&p)ul;pWZ#mECWuuzK|YE&7^x;o;Br=4ZW{uO0) z>uQg>Xd{g`^XNy@xRmA6Dl{_LSjY9gY(yIP-^p@PooL>Pl<$^a;AGhEGj&A{r${mm z8GcXPIGrtN4?*t(%g8D-(qRHaGL`*xoqo-&$fXQ_GE5YuRrwUBF|?5ryNK9g4GkS0 z@vM?Jt0$Zt;HJd>qL4B)g>K!NL~f+%z~H4axLW6peXQ41n7mXj!$m8=YCFHq5FqJ) zu7^!kK_`IS0+GCZJ)YtnakBfldC6Tu+)$LB8z57VCH`NX~{nA zM4H?r<$VuLm~wtTd%tP>yU$-DWxTvbE&-up!Y+Z&(}n331q~eXcgF+nZ}QwW-UjpC zb6X70MQquY(0cLZ`E=hO4iTTd4d>_rsu4m{um#ofOQTWU%gHy?Rx$Z2&tT3#X zcv`pmkWe2qx_?uY^ZTRLSwNIRO#jN^-GgVv!^=hZP>2>Q`<2(ZJ>}~uKEds$oQnG71w>@C8SyoC%Jn9hvhlu@GL>%aX724=dRb?=XL>GeI@eNO zvOGlldN1aE@o;k5m)+wANATw(yf?#Ln^evOWwVzA5XXa8u+MnaWxfH0xQ%)z@S)Q4e@3+eOL83ppCCxG?*@bYq!-ld%nV}E`2Kefru9VxIe%q(owKPn)o z7&xD#I8doWUqSGHI)2NvdkL*~=8Ql?dtdh!4I?K&!~PGGB5yL;iu;8}Ue2@Db^E)r z94?E#a}oAL>>ev2{p$N|bc-fzzxyO&nwS=&=1*(lAj1W&6HuN~0>m|*W+AiOZXhwG z*tUTgV@+iaG6qZjO-rF&AlR%mRr%OoWz^t~m?zjFR3HqqRm5gMIzdk7?59CCSLtpf zab-(%p8MM}#ISr3fAYZsL*`9Y4d?ikilMG}txDTq;{1Y@PSTXV|Lg`~bN@9znXM@Z zuw{&_j_}nI`L9Vl%7*MDn3i7$ykOIx>aQtl0zu`Bo&pXK?G?U;md^^tGh=mFQpgVt zpOJPCGdSj9T(;o2}G`%wtE5JzgjLkX9(|ciGH@3wt5I~)=aVcBWTU$#ytOU zh(DXnuv$yQ;*madW^!jRZl~fq)mRkX=uacjiOslgR$M6}mzm@}1@CEc2K4lsWd)DV z0ryoGNxt`&p(XF@@c10xr419{9D2E^w()%{c*)IU`^D#go)juz{Y@=856qFON#dID z@Hg=cLyL@;#cS8>hM@UxH7DbVy|Fl%?$H7<;}g5_Q9b!XuSr!1)4@aB^$Esb{Jm{+ zXD;8*dFi`DH~LTT>#H+Tl8q@H5)lHW|Fe*a0<1_oloj z6#mD$CjiQfr*OC|;#fRX;-}H*ZlYqn(R9gJs=z>1-TEA%oK(zY!Ci4p4V%sC_dJ)0 zlO#zt-Lt2lQ89hh;T+jQwy06ReWN#>?uLF+=M5R6V{6KZ#FR8As}hq*+?5C(+QeGT ziUHodE!ZNWqaUN^e87HDbmG9~osXrmr{|TkAzWaWq&Z`7{pG}xna~zXH4#a9bSv%# zul0UYNo-3I_a|f-31byKFO3Sc933xnHw#FH@R(I^jZ@T&p2))lOYFgHkI#bVoxhg5 zlJh28Dn;r{5-yG^11qP(GyLWnEN1lQ{HqEwNd=JWsn-#Sb*ER&q83kizIy&t7@9h1cw$2ev-aB2A zGXFBSVasb|;e_YY)ToF=*vkhTU$2&Hv#&0rkq=Acp5>S?Pybc`d_(uIV39F0dW&p8 z``@-h1~pPNyV!M)xHzJetd|y_?-N!{6*4;Xi$o?Sc-FOv8xAHUqd zLEmRV+glu`HoAP20;A$>I+3)}B0yjF;5?y~%pz;&k<~kXZWz`3=EvW1bRA^!QTVhw zX%uEngFA#;m@VQtQ2w$z{*%4y$xC~dak9N*oEMRnzePGwBiW1>Owr0>odSj`UU02| zK47IB(n~T5pdz5p(3+CxOW#0skO)NK{+nZC1xhS?C+2fX&{crSQx1y>=x+I zkfwpgVIepEXwMuyCwM-+XNLrrl}EPu)dPw8JX8H_kmm3ceYyFsqs*J}iTXE71|AIy z>$f$FD_Na0CG$7qTW#%~5Qnx2AxA{T)-;o$!S-ng)N%K5qhf;RQlo#9tE2Nl{^A(P zPKqsJ1-~?7Yt;RD1Uj4EkaW%3GhGASs#_4~5Ts$~e`aS{{}SpY9WtSZITk-AB4uRxNnNRX@ZT{X>j56=^|JGw?N7NWdA%=UT)~&JwYXZfrpUJyoj^+m}o9{ z$80y1d&cS~QCl_>G2dEI_6NAg|DcpISKfE{Rto2=yNQ8Hu`(Pa=F6iLnVm(-&FR z{SJnR7A^D&eNEp>D=E1zgM5C|q|pMvDv;xnG+13y!LWd51PD}q9vKN8WTpA>X_`2G za|ag=|8bU)E;+PxTTrgXb7u5zWv>XlbOXJ=9l!VSb4_akd4keM7=z9BUP~((Ug<{{ z0zh@1o04%MXV`XSQX7ou?wL``q_HoPLcZNHzZNwJe9ZDj<-C>dfB+ELstVC>F5rM) zCY^T}i`e?@zzUtxt@Y4*%zf8F?J1gA2$B+YrwPnuVSEtcJ!JrNY8f{FZQMS&yuI(I z3%{?jXVLhkveY@a$ZKs`z-+EztC1npAK_@?pq`7YI$^;tc+rj&$*G`sDADD$+H}p& zCr#PfOJswj4vOiLdfnn<83{S|sMQEdVoqEbumOaR(wa@STi+IprA{X$mFs3@7r+b* zU5C9&s6R`zIws_sijR$dTCuhh_AOhzr0uC&3+~g52J56IZuXWEo&MTG6zhL7l&+6s zPE@CgDU*$?+K_ZRh6|loFA6!xi8R3$>D%?QPOgOPvz03q>gk4HP85i(&!uS4oLU})S@d4~)K3nYMe!iER&)1Lz#-*kMN3=C)^iuPQ8`lpg z^A#0(y@p=MkHx=|eb$`Lba$353Mxs4dz<_p;3!v>%OmZ zUFV$pocrA8+~3dV^ZkCir{SPwq0YxE!VLiAOY*Y8x7nFzi0w_T*OdKdxd_@-=I%3k z2b|-u`}%A9uNWN+_T*o4t3_=)=U28`TOwe8k$jE{3k%J$n>u|JVO7)Sw5=$-EBJfu z>}Qp>qm@24GpQCJ8Fh!^v??X(`cH9{aO6~>GWCGnYokBl4fKQ9UF;*kC$}EA%e%J% z7o7Qs@<3U&i*+L$KSByOauu$X?0%eT444qNO7=`&xxoi-&iAbi@aw!Zkey}M&KNU;njpEZTlXOt6cB;qpQu& zjxr{v+lczKD_gF#1P6fi+YBwoSMc1JO@lPod)6C1A59oHZa+wK-+4g%j{KpwRDe4~ zTFCiC1RNxpkVq;G)H|2|(n-wD!+k>RMuS!1_ejWw^ErH%gbmLq%OAwYJg7^*zS8*Cq@WMiJeW$5|2ZBicYDWcNin`j)KC7q%)Gjf z-0P~O9M_B5s$o@Msvh`+XjH|n&ec$H_(sXt9<;^OeyvBwS6=0(W{td ziP?cu+CtE2*?On{U;+2Njgnq1b)M@2BLji%iZHnp!G|*-B>G##6*vt!dKC zLv7r`=Heq>*@7gcqIAD?Pj6GvQiI9T#SG~jx1qBO&(mN?qkd^mxEEk-rl-1-HTa^- zFLS8gpBtSgQ;kZ4u9g4OIoGX}JrwcdL-?Y$G0?6Od?1i3`sGZAK%scXm!I$@O z+3g;QV2RdIF&ykIlifr;tcn z?kemDl#ELKL6?|dyZ*jRi=B|}1UrwbtnK$U0UO5(BJ6R_gUSWsmX0P@NFVOdO49|M zLZok?f^Nv|KC- z$V?;jc>^|N7YWrPdMSl3Xh?NkY_;O+lF-^dyC}QeDVBHFbsEZn9J?mm-^}=G-B#+z zb*iRs2JalPuk3QQiF;;WdQ>Kn_o)2Op|V#nMqp6bYjo(JX*r+`g7=&qZzDOe+*zF$(~y9MH;rRBsVb zPnlNY8HjbgJ?I0};MTgQBCFlGc;jiHa>>XQYrcB{7Kk0cD37K&G011-(=3qUzGHih z5hl|skyEp7b}5@K7t#O*`dX{$TIKDuy&m%gqOwGKdAlv#jC%A<-?u>4;O?9mrsb2B z-Z$O&o~k53crPIwYt`g-E#hF!DN&>!6>mEc-6W~*9&#z?F3~+dNz5_>ohY9-Da%rB;dEqF1r5z+H>r?_g?_HKi{`wq2Le7dcLM{en!SQT2QIy(Hf zP3>VSn=04oZ12HpPsCYgqxQ|(0AsxO*`LES>y&CIs-Pty%y4-k4 zfK!(pjTCs=f8D4#{q1noTayO+O8p1ALf8lb|1PqY#DDzvm3s`V4!pX(lc)rP1TuGG z4luG@w|-1kvC}8tKh*QSg%V=@n<3S-cuUr%vbxM+s04Q%pZ5CiGo=#Kxr9-Frt_E< z$8Aft?1A-`AG^)?dm`MRY`*CXA>))F>-mr{TU~+Gr53K63^fc=jI5$(pYOK0+JP}k zQl@8)#BGY|0=oKhJlE%%>s6+|v0r%q&Mz{8)LR!Pa=~JnW)h)6En`vs*CxJ+H6+&Y zs|M)&vi<3HIvPbb_v%dm6$HWRh0}YGl;>M(VEanTjR@P}iTu{l zP2vwMa+@icJ~$lQ?hKzh=x~!H5qigs_x|8Ja^lA%%VOI2Zih*4 zC8zbfRL3=qE=;dYkDF?syOmo*&!120*jKw3=kAMdb%ohFgAb-!n_!_g_AgD)0DNHJe zF?f~W_=+H0vUoMi5XMY62bY+c;E8Z6!i2QUebW4lQ)4e^QoWQ?KR@OI?+gbtKDns~ zroX4$jXOiJ@v0J$$iw*&6zOq{(Z^;*+Y!d(_B}Cb13UUHmFhf^xXeCVm-Xq5ApYdl zbyVrbCr?uv5IKu$3n^DA9XMV;G7u=WtoA=ai2?p$Y0iH^35GAjSKp~_eF)fyR{soD zF0U(f2zBqdLz;JBaoCk6pgA18r3V8Ung{a+bc5P`B)@#^N=U;|yOlA#qqrlag3WQj zQb`sXIUJb;p&YHa487USJ;s7U+&9wEcE=GVAxM(0(K~W`&7q+O7&Y!B-m^zI;FIwU zY*e9SuA5}=LXDoS43M?HAx7xyF2h`P!e1 zDZMb`_AEJa4VnQc_@k@IC z<+WNOL><>?+QCPNuka~XI`_)(g1Yc8Zjvy$IazhQkK*!Xc>(Y1BO=FR(om5hkEp+mEl%4kXtU)aOm~f_6m?WOZrwf1e?8sJ8wDx?FQ{O zC(D44SQ$%eM=WPp#FBAS6+NqPBRK}@_47us)tW>VT6A#SQ#ntNjiBm>C$)Y;P_0)Y z=;0p5HzO(up!TB@vVP;TdjpLo7@W&J=^&_#fXykSiDT9yC_(F$x$(^{GE;Re#haXK z6LbM^h=!PD*q6~r_y+X(N+d0T^5(T4EH}?GA;hiWf!QhMfTw8+)Aj^RvRLPfIL+To z8L{4|dOKeQG5m83&(8-B`;O(gZ`dM5&QE}->_N|u@*6?+qsb#=?QV}^5a6bk+VYuM zeVcS*Y8$_7LvDicWP|82DEB+r0;;U+MVbomu{jvxIixDQ8c~`}LD`K@rCVrV^{MIy zmD9W6pEyyvY#vsqnVDBvZALx6Qy1uCo3-i_^39+2Eu@^wWBoc&(1DzLZJaP|QX`8b z6-n=!sx{T!rL08Yz(Xvf*GBY0?MQNaV3^#-p$Nty7y$ffBmE<}p8a-z zYZaHjAsg}4yj04Rj@X|{2kSONUF+Z~bfg_0mYRuDK{8Sj6(HnZdO{ONst4050?05>}A8I#UbX?L;+t5B{k&YXrYN62_C)h z$3GCrasOrdKp(Pp|43^%_e-%e(7yK!d|JEEZQJyN=4Ku?#%!Ln&AebEHM9OWMhl&~ z&UVhT}&yRu-2u|3)tf`S^^VV!oqbFh-qSKMOzQJg`J zJA;UA*5?(_cHzS37altVg2gd@gA^B+xKeB5(c!PwKjS}}MzVc`U(lG?+RAh+^U}H1 zU#D|*{kOtNLr7bDNV}~ZJ}yCvg{{~+_QOKc!gzOSZJm_GrMBS6=cBPnG;~3SY4c(H zEKgiSG_ZK2-+OjB35iF33$iRSGVH1R41D@3BKM}OgJ69v!i1vj6 zEUwHyNXxUy&cyHG*QVn7CozPIUGb?FIh#FYRX-kjd=8M3NrIrKn4DO6!#qC4%iqRa zY%;70WI-lphq`5nc3=7hRmPb_=UF7#6Wb)bydI%DBXGjmG>Zl_GsvXA=wQ%@T5|B# zW=w_=89&wdAUEn+Q+Y|HKxiL&u(VK`6P!!2KhL+2y3h~zVG50ZTg^!w3ZLA^cg5t3 z+icHP!!Y1vlxN2})@E`B?*E3H(T_l~*qO2*5l2=9Mcj_H199l3DeMIZM)5lGDm7hW zew`4$Q`n<&%QaK9v8%*w>5m%~C2p?Z#)dfRKkuCo%lMPDEmCuRIWd%J*InoNZXt`d zJuB3F`mk{nwpE6Z&)55)-9h3RXNKnStF-?=ERT)$^>T@Uhvc@hK^iHq*3EzaL^YTS%NST zAva37dCJt0`C7+WD>t1VZ|M(2EI!|cY|lP;t;+b+zvaB>wJe#P){&7!)DB1wLNHj$ zuVQOET1RC7{~O;UjhE$n`8-^EfEvd+{oR_4EK@S`*tv@*w!W-}C|i1?Cq(RayR(e% z8Bc{jNUm~dJOSHE&OY78qFfSL>=lF1TqRJpmGc!h#N+|RF#75Q{5fVoaroyM$usTl_Csj7+VAJ};da%Iw=-7dd zCr?{8iem%2=P{f!O@NlAF)A8cxl+l~7JFx{x}63A8-s$N{o;#Tbp37|sM17+?8^tZ z-mqK~+33MnTe~^q_#eIs9?I*__M?Tb z%==VU14z$y0Y>5WqXPHemUG_>+vQ+k&uJc8+G#(EAFe9X-w5 z6woVIuH3D*+_OB*Cdz8v_7LI`=1xhl(Tafl^mq<8O8wf4UpVLWk9H)PZV8{}59q9| zCESi(`#gkrmo6-e)(m`*OyZ<-AKeNpui4J|6Ois_(O7C*W0UEY_O-Bo?X*+b zeuw<^mk2PCdL^?}SkMa2n-9cUx70$In$DyvjN={}xqQEIi9uVa!3}eCx)g^vbGw7`0?ZFYrHvoyw{E^bf$x znc4CNcZtwfvPKuHU?gTb%6;H%$dE551QwnfpX)J9N^IQd-z3emA35S1zfK zqIEDZe64^*%?JI!-TehYI?gBP5A|R9%S?Z0favXYY3HU$PtYJnkiG~VJ8KvBF6-vt zm#l^#xu|<0^e-8P1IMd`J=S(W;b_(q9_dAk|0ln@hVdvpX94*TXQA#A9e?088d~D_ zJ`P;AOg{D-Z4tT`@~+rxOy$Zqx^|Rats{r)`qkHp?~iLO`(62hqD(_Kx4K610q@I# z4tGGm|4Noq{d5k?)rCiTs*P{YSeD5ZcULM0m8o;Z!FXDO*?;w}P>N>cZ^JvJUw3dE zE;~ghh-yr^0xw($4OSYT)l1@h6(b*gnNBis@(WFccM63Txh?Im{chejAt7A-LUpeW z>sPbo#UNRv-bju3zBq=&9;RLpVf^g}FP=MYs`}pV6JSQ1rv8Pbf?c#wH&s)MOd2SEs z8`6!^a>!Ti#IY4R*HxIc?x}53YecWXASJ2`HI;bVg`i6beBn2b|BmE8f8sfC5&q{= zu}V{@ySvVS2)#9lHuxw zWg(j8DKmnQh~T4pPRuBHvMR|-ei(&r8;H`YYABNnEg-3Y)gA2ZZ`E_k9UZ*mq&0Gg z@+(cN2u-fd;1kb+i-~_W)M}-|0`0l@vYMKXj7~c7=!}Rob_=alc}!FB4zgrrqrN`8 zr%5}m*+21~sTuy-)x|_lPnmN1m>m|lK>|{C1Kz+{Pf1Fuj&Z2X^;zO|1s-PqlW|w~ zoQcVO{UZ7xYc7_j0s7}Y6teE`A273o)rt~BK%~q9X{RaHS{Ze zvgkorPp%g^ey^$jZw2!wlE&lXHf{(z{f7DE_+n&;U84;XI1{{2CPr7&NCT$! DaHD2V literal 0 HcmV?d00001 diff --git a/tests/e2e/abgleich.spec.ts b/tests/e2e/abgleich.spec.ts new file mode 100644 index 0000000..1a3d389 --- /dev/null +++ b/tests/e2e/abgleich.spec.ts @@ -0,0 +1,74 @@ +import { execFileSync } from "node:child_process"; +import { expect, test } from "@playwright/test"; +import "dotenv/config"; +import { schluesselpaarErzeugen } from "../../src/lib/ssh/openssh"; + +/** + * Abgleich und Uebernahme im Browser (#021, #022), gebauter Stand + Worker, Testziel B: + * fremder Key → „Jetzt abgleichen“ zeigt ihn → übernehmen → Dry-Run → anwenden → synchron. + */ +const ROOT_PASSWORT = process.env["SSHKV_TEST_ROOT_PASSWORT"] || "sshkv-test"; +const PORT_B = (process.env["SSHKV_TEST_ZIEL_B"] ?? "127.0.0.1:2222").split(":")[1] ?? "2222"; + +test.setTimeout(180_000); + +function aufZielB(befehl: string): string { + return execFileSync( + "docker", + ["compose", "-f", "docker-compose.test.yml", "exec", "-T", "ziel-b", "sh", "-c", befehl], + { + encoding: "utf8", + }, + ); +} + +test.beforeAll(() => { + aufZielB( + "userdel -r sshkv 2>/dev/null; userdel -r deploy 2>/dev/null; rm -f /etc/sudoers.d/sshkv*; rm -rf /root/.ssh; true", + ); +}); + +test("fremden Schlüssel finden und übernehmen", async ({ page }) => { + const name = `zz-e2e-${Date.now().toString(36)}`; + await page.goto("/anmelden"); + await page.getByRole("link", { name: /Mit Mock-OIDC anmelden/ }).click(); + await page.locator('button[data-rolle="admin"]').click(); + await page.getByRole("button", { name: "Anmelden", exact: true }).click(); + + await page.goto("/hosts/neu"); + await page.getByLabel("Name").fill(name); + await page.getByLabel("Adresse").fill("127.0.0.1"); + await page.getByLabel("Port").fill(PORT_B); + await page.getByRole("button", { name: "Host anlegen" }).click(); + await page.getByRole("button", { name: "Host-Key abrufen" }).click(); + await page.getByRole("button", { name: "Fingerprint stimmt – vertrauen" }).click({ timeout: 30_000 }); + await page.getByLabel("Passwort", { exact: true }).fill(ROOT_PASSWORT); + await page.getByRole("button", { name: "Zugang einrichten" }).click(); + await expect(page.getByRole("button", { name: "Verbindung prüfen" })).toBeVisible({ timeout: 60_000 }); + + const fremd = await schluesselpaarErzeugen("ED25519", { kommentar: `${name}@laptop` }); + aufZielB(`mkdir -p /root/.ssh && echo '${fremd.publicKeyZeile}' >> /root/.ssh/authorized_keys`); + + await page.getByRole("button", { name: "Jetzt abgleichen" }).click(); + await expect(page.getByText(/● Unbekannter Schlüssel/)).toBeVisible({ timeout: 30_000 }); + await expect(page.getByText("unbekannt", { exact: true })).toBeVisible(); + await page.screenshot({ path: "docs/anleitung/bilder/abgleich-desktop.png", fullPage: true }); + + await page.getByRole("button", { name: "Übernehmen", exact: true }).click(); + const dialog = page.getByRole("dialog", { name: "Schlüssel übernehmen" }); + await dialog.getByLabel("Zweck / Name").fill(`${name} Laptop`); + await dialog.getByRole("button", { name: "Übernehmen" }).click(); + await expect(dialog).toBeHidden(); + + await page.getByRole("button", { name: "Dry-Run starten" }).click(); + await expect(page.getByText(`root@${name}:/root/.ssh/authorized_keys`)).toBeVisible({ timeout: 30_000 }); + await page.getByRole("button", { name: /Änderung anwenden/ }).click(); + await expect(page.getByText("Ausgerollt.")).toBeVisible({ timeout: 60_000 }); + expect(aufZielB("grep -c laptop /root/.ssh/authorized_keys").trim()).toBe("1"); + + await page.getByRole("button", { name: "Jetzt abgleichen" }).click(); + await expect(page.getByText("Keine offenen Abweichungen.")).toBeVisible({ timeout: 30_000 }); + + await page.getByRole("button", { name: "Host archivieren" }).click(); + await page.getByRole("dialog").getByRole("button", { name: "Archivieren", exact: true }).click(); +});