Files
lxc-enroll/README.md
T

10 KiB

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:

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:

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 /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:

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:

/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

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.