Files
lxc-enroll/README.md
T

190 lines
10 KiB
Markdown

# LXC Enrollment
Interaktives Skript fuer einen **Proxmox-Host**. Es installiert fehlende Tailscale-
und Wazuh-Komponenten in ausgewaehlten LXCs, verbindet neue Tailscale-Clients mit
Headscale und kann **Tailscale SSH** samt Linux-Nutzer und Sudo einrichten.
Alle interaktiven Abfragen verwenden eine Dialogoberflaeche mit `whiptail`
oder alternativ `dialog`: LXC-Checkliste, Ja/Nein-Schaltflaechen, Eingabefelder
und verdeckte Felder fuer Schluessel und Passwoerter.
## Starten
Als root auf dem Proxmox-Host, nicht innerhalb eines LXC:
```bash
curl --fail --silent --show-error --location \
https://code.faboi.cloud/fabio/lxc-enroll/raw/branch/main/lxc-enroll.sh \
-o /run/lxc-enroll.sh && bash /run/lxc-enroll.sh
```
Alternativ herunterladen und zuerst die Auswahl pruefen:
```bash
curl --fail --silent --show-error --location \
https://code.faboi.cloud/fabio/lxc-enroll/raw/branch/main/lxc-enroll.sh \
-o /run/lxc-enroll.sh
bash /run/lxc-enroll.sh --list
bash /run/lxc-enroll.sh
```
`--list` liest nur den aktuellen Bestand; `--dry-run` zeigt nach der Auswahl die
geplanten Aenderungen. Beide installieren nichts, starten nichts neu und speichern
keine Einstellungen. Fuer interaktive Eingaben muss ein Terminal vorhanden sein;
die Eingaben werden ueber `/dev/tty` gelesen, auch beim Start per curl.
## Bedienung der Dialoge
- **Pfeiltasten:** zwischen Containern oder Optionen wechseln.
- **Leertaste:** einen LXC markieren oder abwaehlen; mehrere sind moeglich.
- **Tab:** zwischen Liste/Eingabe und Schaltflaechen wechseln.
- **Enter:** die aktuelle Auswahl oder Schaltflaeche bestaetigen.
- **Abbrechen/Escape:** den Ablauf abbrechen. Beim Ja/Nein-Dialog bedeutet
**Nein** nur die Ablehnung dieser Einstellung; Escape bricht ab.
Die Checkliste zeigt CTID, Namen und vorhandene/fehlende Komponenten. Zunaechst
ist kein Container markiert. Vollstaendig installierte Container bleiben
ausgeblendet. Gespeicherte Ja/Nein-Vorgaben werden als Standard ausgewaehlt;
ein vorhandener SSH-Nutzername ist im Eingabefeld vorbelegt. Vor der Installation
erscheint eine Uebersicht der geplanten Aenderungen. `INSTALL` und gegebenenfalls
`NEUSTART` muessen weiterhin ausdruecklich eingetippt werden.
Wenn beide Dialogprogramme fehlen, `TERM=dumb` gesetzt oder das Terminal kleiner
als 60 Spalten / 16 Zeilen ist, verwendet das Skript die bisherige Texteingabe.
Es installiert dafuer keine Pakete auf dem Host. Fuer die Dialogoberflaeche bei
fehlendem Werkzeug auf dem Proxmox-Host einmal `apt-get install whiptail` nutzen.
`--select 'CTID CTID'` ueberspringt nur die Checkliste; die anderen Abfragen bleiben
Dialoge. `--list` bleibt eine reine Textausgabe ohne Abfragen.
### Nach einer unterbrochenen Tailscale-Anmeldung
Wenn Tailscale bereits installiert wurde, die erste Anmeldung aber scheiterte,
die aktuelle Datei erneut herunterladen und fuer den betroffenen Container starten:
```bash
bash /run/lxc-enroll.sh --resume-tailscale --select CTID
```
Dieser ausdrueckliche Wiederaufnahme-Modus meldet vorhandene Clients nur im
Zustand `NeedsLogin` oder `NoState` an. Clients im Zustand `Running` behalten
ihre Registrierung; andere Zustaende werden zur manuellen Pruefung gemeldet.
Tailscale wird nicht erneut installiert. Fehlendes Wazuh und die gewaehlte
SSH-Einrichtung folgen danach. Einstellungen koennen aus `.vars` geladen
werden; benoetigte Schluessel und Passwoerter werden erneut verdeckt abgefragt.
Vollstaendig installierte Container bleiben aus der normalen Auswahl ausgeblendet.
## Ablauf
1. Laufende Debian-/Ubuntu-LXCs mit systemd erkennen. Gestoppte, gesperrte und
nicht unterstuetzte Container werden uebersprungen.
2. Vollstaendig installierte Container aus der Auswahl ausblenden. Bei teilweise
installierten Containern nur die fehlende Komponente installieren.
3. Vorherige Einstellungen auf Wunsch laden. Tailscale SSH ist beim ersten Lauf
standardmaessig aktiviert. Linux-Nutzername, Sudo und optional passwortloses
Sudo werden abgefragt. Es wird kein OpenSSH-Server installiert.
4. LXCs in der Checkliste mit der Leertaste auswaehlen und bestaetigen.
Nur diese Container werden bearbeitet.
5. Wazuh-Manager-Adresse und Headscale-HTTPS-URL abfragen. Falls genau ein laufender
lokaler Wazuh-Manager gefunden wird, dessen Paketversion automatisch verwenden;
andernfalls die exakte Manager-Paketversion abfragen. Bei einer Manager-
Adresse als Hostname wird fuer neue Einstellungen die Uebernahme von
Headscale-DNS/MagicDNS standardmaessig vorgeschlagen; sie wird separat abgefragt.
6. Installation mit `INSTALL` bestaetigen. Fehlender TUN-Zugriff wird separat
aufgelistet; erst nach Eingabe von `NEUSTART` werden diese Container sauber
heruntergefahren und neu gestartet. Bestehende Device-Slots bleiben erhalten.
7. Headscale-Preauth-Key verdeckt abfragen. Fuer mehrere neue Clients einen
**wiederverwendbaren, kurz gueltigen, nicht-ephemeren Key** verwenden. Kein
Headscale-API-Key. Optionales Wazuh-Enrollment-Passwort ebenfalls verdeckt
eingeben, falls der Manager es verlangt.
8. Fehlende Pakete aus signierten offiziellen APT-Quellen installieren und die
Verbindungen neuer Clients pruefen. Fehler werden pro LXC ausgewiesen.
## Tailscale SSH und Sudo
Das Skript legt den gewaehlten Linux-Nutzer bei Bedarf an und aktiviert
`tailscale set --ssh=true`. Vorhandene Nutzer werden nicht geloescht und vorhandene
Passwoerter nicht ersetzt. Bei Wahl von Sudo wird der Nutzer zur Gruppe `sudo`
hinzugefuegt. Fuer **neu angelegte** Nutzer mit passwortpflichtigem Sudo wird ein
Passwort verdeckt abgefragt. Alternativ kann explizit passwortloses Sudo erlaubt
werden. Die Auswahl „kein Sudo“ entzieht keinem bestehenden Nutzer Rechte.
Damit die Anmeldung funktioniert, muss die **aktive Headscale-Policy sowohl die
Netzwerkverbindung auf Port 22 als auch eine passende SSH-Regel** fuer Quelle,
Ziel und Linux-Nutzer erlauben. Das Skript aendert die zentrale Policy nicht und
kann ohne einen echten Loginversuch keine SSH-Anmeldung bestaetigen. Bei
Headscale wird normalerweise eine passende SSH-Regel mit `action: accept`
verwendet; die Regel muss zu den tatsaechlichen Benutzern und Tags passen.
Nach Einrichtung von einem zugelassenen Geraet testen:
```bash
ssh LINUX_NUTZER@TAILSCALE_IP
```
Beim Aktivieren koennen vorhandene SSH-Sitzungen ueber die Tailscale-Adresse
unterbrochen werden. Die Containerkonsole bleibt der Zugang fuer diesen Lauf.
Weder Subnet-Routing noch Exit-Node, Tailscale-Operator oder privilegierte
Container werden eingerichtet. Headscale-DNS/MagicDNS wird ausdruecklich
abgefragt. Bei Zustimmung verwenden neue Clients `--accept-dns=true`; bei
vorhandenen Clients wird nur diese Einstellung aktiviert, ohne Neuanmeldung.
Bei Ablehnung behalten neue Clients lokales DNS bei (`--accept-dns=false`);
vorhandene Clients behalten ihre DNS-Einstellung. MagicDNS-Namen sind dann nur
verwendbar, wenn der bestehende Resolver sie aufloesen kann. Die Headscale-
DNS-Einstellungen muessen auch die benoetigten lokalen Namen aufloesen koennen.
## Gespeicherte Einstellungen
Auf Wunsch speichert das Skript **nur auf dem Proxmox-Host**:
```text
/etc/lxc-enroll/.vars
```
Diese Datei ist JSON, kein ausfuehrbares Shellskript. Verzeichnisrechte 700,
Dateirechte 600, Eigentuemer root. Gespeichert werden Manager-Adresse,
Agent-Paketversion, Headscale-URL, Tailscale-SSH-Auswahl, Nutzername und
Sudo- und MagicDNS-Einstellungen. Die CT-Auswahl wird jedes Mal neu getroffen. Headscale-Keys,
Enrollment- und Nutzerpasswoerter werden **nicht** gespeichert. Sie werden bei
Bedarf erneut abgefragt, in temporaeren Dateien mit Modus 600 uebertragen und
bei regulaerem Ende oder abgefangenem Abbruch entfernt. Ein harter Prozessabbruch
kann temporaere Dateien in `/run/lxc-enroll.*` hinterlassen; dann entfernen.
## Grenzen und Wartung
- Unterstuetzt native APT-/systemd-Installationen in Debian und Ubuntu. Alpine,
VMs, weitere Hosts und gestoppte Container sind nicht enthalten.
- Der Proxmox-Host selbst bekommt durch dieses Skript keinen Wazuh-Agent.
- Vorhandene Tailscale-/Wazuh-Registrierungen werden nicht ersetzt. Fuer noch
nicht angemeldetes Tailscale gibt es `--resume-tailscale`; andere Fehler,
insbesondere bei vorhandenen Wazuh-Agents, brauchen separate Reparatur.
- Ein Wazuh-Manager-LXC bekommt niemals zusaetzlich einen Wazuh-Agent; es kann
bei fehlendem Tailscale fuer die Tailscale-Einrichtung ausgewaehlt werden.
- Die Manager-Adresse muss von den jeweiligen LXCs auf TCP 1514 und 1515
erreichbar sein. Eine Headscale-URL ist nicht automatisch die Manager-Adresse.
- Neue Wazuh-Agents werden auf die Manager-Paketversion installiert und danach
auf `hold` gesetzt, damit sie den Manager nicht durch ein eigenstaendiges
Upgrade ueberholen. Bei Manager-Upgrades die Agents bewusst mit aktualisieren.
- Containerkonfigurationen werden vor TUN-Ergaenzungen unter
`/var/backups/lxc-enroll/` gesichert. Ein fehlgeschlagener sauberer Shutdown
wird nicht durch gewaltsames Stoppen erzwungen. Installationen sind nicht
transaktional; erfolgreiche Teilschritte bleiben bei einem spaeteren Fehler.
- Enrollment allein konfiguriert keine Discord-Sicherheitsregeln und garantiert
keine Erkennung aller Angriffe oder App-/Kernel-Schwachstellen.
- Bei Fehlern werden LXC, betroffener Schritt und Exitstatus ausgegeben. Worker-
Fehler nennen ausserdem die Skriptzeile, ohne Befehle oder Geheimnisse zu zeigen.
Auch ein Fehler beim abschliessenden Entfernen temporaerer Dateien markiert
den LXC als nicht abgeschlossen; vorher erfolgreiche Installationen bleiben
erhalten. Vor einer Reparatur daher zuerst den aktuellen Zustand pruefen.
## Quellen und Pruefung
- [Wazuh Linux-Deployment und Versionskompatibilitaet](https://documentation.wazuh.com/current/installation-guide/wazuh-agent/wazuh-agent-package-linux.html)
- [Tailscale in Proxmox-LXCs](https://tailscale.com/kb/1130/lxc-unprivileged/)
- [Headscale-Registrierung](https://headscale.net/stable/ref/registration/)
- [Tailscale SSH und Zugriffsregeln](https://tailscale.com/docs/features/tailscale-ssh)
Syntax und simulierte Auswahl-/Installationsablaeufe sind lokal geprueft,
einschliesslich Debian-Systemdaten und Wiederaufnahme nach fehlgeschlagener
Anmeldung. Ein echter Enrollment-Lauf samt Tailscale SSH wurde bestaetigt.
Die neue Dialogoberflaeche ist mit simulierten Dialogaufrufen geprueft;
Darstellung und Tastaturbedienung auf dem Proxmox-Terminal stehen noch aus.