setup user sh aktualisiert

michael 2025-09-10 09:11:27 +02:00
parent b55d3aea2d
commit 61a239775c

@ -1,103 +1,177 @@
# setup-user.sh
**System-Benutzer für furt erstellen**
**System-Benutzer für furt automatisch erstellen**
## Zweck
## Getestet unter
- OpenBSD 7.7
- FreeBSD 14.1
- Debian 12
- Arch Linux
Erstellt den System-Benutzer für furt mit betriebssystem-spezifischen Konventionen. BSD-Systeme verwenden `_furt`, Linux-Systeme `furt` mit `--system` Flag.
## Zweck des Scripts
## Script-Code
Das `setup-user.sh` Script erstellt den System-Benutzer für furt mit korrekten betriebssystem-spezifischen Konventionen. OpenBSD verwendet `_furt`, Linux nutzt `furt` mit `--system` Flag.
Das Script eliminiert die Notwendigkeit sich verschiedene `useradd`-Syntaxen für verschiedene Systeme zu merken und macht furt-Installationen zwischen Betriebssystemen konsistent.
## Wie das Script funktioniert
Das Script ist bewusst minimalistisch gehalten - nur 20 Zeilen Code für eine klar umrissene Aufgabe. Es nutzt `uname` um das Betriebssystem zu erkennen und wählt dann den passenden Code-Pfad:
```bash
#!/bin/sh
# scripts/setup-user.sh - Create _furt system user and group
set -e
# Detect operating system
if [ "$(uname)" = "OpenBSD" ] || [ "$(uname)" = "FreeBSD" ]; then
# BSD systems use _furt user convention
# BSD-Pfad: _furt Benutzer
groupadd _furt 2>/dev/null || true
useradd -g _furt -s /bin/false -d /var/empty _furt 2>/dev/null || true
echo "Created BSD system user: _furt"
else
# Linux systems use furt user with --system flag
# Linux-Pfad: furt mit --system Flag
groupadd --system furt 2>/dev/null || true
useradd --system -g furt -s /bin/false -d /var/empty furt 2>/dev/null || true
echo "Created Linux system user: furt"
fi
echo "User setup completed successfully"
```
## Betriebssystem-Unterschiede
Das `2>/dev/null || true` Pattern macht das Script idempotent - es bricht nicht ab wenn Benutzer oder Gruppe bereits existieren. Diese Eigenschaft ist wichtig weil das Script sowohl bei Fresh Installations als auch bei Upgrades sicher ausgeführt werden kann.
### OpenBSD/FreeBSD
- **Benutzer:** `_furt` (Underscore-Präfix für System-Services)
- **Gruppe:** `_furt`
- **UID-Bereich:** System wählt automatisch freie UID
## Betriebssystem-Philosophien verstehen
### Linux (Debian, Arch)
- **Benutzer:** `furt` (Service-Name direkt)
- **Gruppe:** `furt`
- **UID-Bereich:** `--system` Flag verwendet niedrige UIDs (< 1000)
Die unterschiedlichen Benutzerkonventionen spiegeln verschiedene System-Philosophien wider:
### BSD-Ansatz (OpenBSD, FreeBSD)
BSD-Systeme verwenden den Underscore-Präfix `_servicename` für System-Services um eine klare Trennung zwischen normalen Benutzern und Service-Accounts zu schaffen. Diese Konvention macht Service-Accounts in Prozesslisten und Log-Dateien sofort erkennbar.
```bash
# OpenBSD/FreeBSD
groupadd _furt
useradd -g _furt -s /bin/false -d /var/empty _furt
```
Die UID wird automatisch aus dem System-Bereich gewählt. BSD-Systeme haben eine lange Tradition stabiler Benutzerkonventionen die über Jahrzehnte unverändert bleiben.
### Linux-Ansatz (Debian, Arch, etc.)
Linux-Distributionen nutzen meist den Service-Namen direkt als Benutzer, unterscheiden aber über das `--system` Flag zwischen normalen und System-Benutzern. Das Flag sorgt für niedrige UIDs (typisch unter 1000) und verhindert die Anzeige in Login-Managern.
```bash
# Linux-Distributionen
groupadd --system furt
useradd --system -g furt -s /bin/false -d /var/empty furt
```
Diese Flexibilität ermöglicht es verschiedenen Software-Paketen ihre eigenen Konventionen zu etablieren während das System trotzdem zwischen verschiedenen Account-Typen unterscheiden kann.
## Sicherheits-Konfiguration
**Shell:** `/bin/false` verhindert Login-Versuche auf den Service-Account
Beide Code-Pfäde implementieren die gleichen Sicherheitsprinzipien für Service-Accounts:
**Home:** `/var/empty` ist ein Standard-Dummy-Verzeichnis ohne Schreibrechte
**Shell-Restriction:** `/bin/false` verhindert Login-Versuche auf den Service-Account. Selbst bei kompromittierten SSH-Keys oder Password-Leaks kann sich niemand als furt-Benutzer einloggen.
**Zweck:** Service-Accounts sollten nur für den Service selbst nutzbar sein
**Home-Directory:** `/var/empty` ist ein Standard-Dummy-Verzeichnis ohne Schreibrechte. Service-Accounts brauchen kein funktionales Home-Directory und sollten auch keins haben um die Angriffsfläche zu minimieren.
## Idempotenz
**Gruppen-Isolation:** Jeder Service erhält seine eigene primäre Gruppe. Das ermöglicht fein-granulare Dateiberechtigungen ohne dass Services versehentlich auf fremde Dateien zugreifen können.
Das `|| true` verhindert Script-Abbruch wenn Benutzer bereits existieren:
Diese Konfiguration folgt dem Principle of Least Privilege - der furt-Service erhält nur die minimal notwendigen Systemrechte um seine Aufgabe zu erfüllen.
## Script praktisch nutzen
Das Script ist für verschiedene Installationsszenarien konzipiert:
### Einzelne Ausführung
```bash
groupadd _furt 2>/dev/null || true
# Läuft durch auch wenn Gruppe bereits existiert
```
Das Script kann mehrfach ausgeführt werden ohne Schaden anzurichten.
## Troubleshooting
### "User already exists"
Normal bei mehrfacher Ausführung - wird durch `|| true` abgefangen.
### "Permission denied"
Script benötigt Root-Rechte:
```bash
# Als Teil der manuellen Installation
sudo ./scripts/setup-user.sh # Linux
doas ./scripts/setup-user.sh # OpenBSD
```
### Benutzer prüfen
```bash
# BSD
id _furt
# Linux
id furt
# Cross-platform
getent passwd | grep furt
Die Ausgabe bestätigt welcher Benutzer auf welchem System erstellt wurde:
```
Created BSD system user: _furt
User setup completed successfully
```
## Erweiterungen
### Orchestrierte Installation
```bash
# Als Teil von install.sh - automatische Ausführung in Phase 1
./install.sh
# [INFO] Phase 1: Setting up system user... OK
```
Das Orchestrator-Script ruft `setup-user.sh` als ersten Schritt auf weil nachfolgende Scripts den erstellten Benutzer für `chown`-Operationen benötigen.
### Entwicklung und Testing
```bash
# Benutzer für Test-Installation vorbereiten
sudo ./scripts/setup-user.sh
# ... Test-Installation durchführen ...
# Cleanup nach Tests
sudo userdel _furt && sudo groupdel _furt # BSD
sudo userdel furt && sudo groupdel furt # Linux
```
## Installation validieren
Nach der Script-Ausführung kannst du prüfen ob der Benutzer korrekt erstellt wurde:
```bash
# Cross-platform Verification
getent passwd | grep -E '(furt|_furt)'
# BSD-spezifisch
id _furt
# Linux-spezifisch
id furt
```
Eine erfolgreiche Benutzer-Erstellung zeigt die UID, GID und die konfigurierten Einstellungen:
```
_furt:*:110:110::/var/empty:/bin/false
```
Die UID 110 liegt im System-Bereich, das Home-Directory ist `/var/empty` und die Shell ist `/bin/false` - alles korrekt für einen Service-Account.
## Troubleshooting
### "User already exists"
```
useradd: user '_furt' already exists
```
Das ist normal bei mehrfacher Script-Ausführung. Das `|| true` verhindert dass das Script abbricht - die Meldung wird angezeigt aber ignoriert.
### "Permission denied"
```
groupadd: Permission denied
```
Das Script benötigt Root-Rechte um System-Benutzer zu erstellen:
```bash
sudo ./scripts/setup-user.sh # Linux mit sudo
doas ./scripts/setup-user.sh # OpenBSD mit doas
```
### Script bricht ab bei bestehenden Benutzern
Ältere Versionen des Scripts verwendeten nicht das `|| true` Pattern. Die aktuelle Version ist idempotent und kann gefahrlos mehrfach ausgeführt werden.
### Falsche Benutzerkonvention
Wenn das Script Linux-Konventionen auf BSD anwendet oder umgekehrt, prüfe die `uname`-Ausgabe:
```bash
uname
# Sollte "OpenBSD" oder "Linux" zurückgeben
```
## Script erweitern
### Zusätzliche Betriebssysteme
```bash
elif [ "$(uname)" = "NetBSD" ]; then
# NetBSD-spezifische User-Erstellung
# NetBSD nutzt ebenfalls _furt Konvention
groupadd _furt 2>/dev/null || true
useradd -g _furt -s /bin/false -d /var/empty _furt 2>/dev/null || true
echo "Created NetBSD system user: _furt"
```
### Custom UID/GID
### Konsistente UIDs zwischen Servern
```bash
# Feste UIDs für Konsistenz zwischen Servern
# Feste UID/GID für identische Berechtigungen auf mehreren Maschinen
groupadd -g 1100 _furt 2>/dev/null || true
useradd -u 1100 -g _furt -s /bin/false -d /var/empty _furt 2>/dev/null || true
```
Das `setup-user.sh` Script reduziert die komplexen Unterschiede zwischen Betriebssystemen auf ein einfaches, einheitliches Interface. Es ist der erste Baustein des modularen Installationssystems und demonstriert wie kleine, spezialisierte Scripts robuste Automatisierung ermöglichen können.