4 setup user sh
michael edited this page 2025-09-10 14:12:26 +02:00

setup-user.sh

System-Benutzer für furt automatisch erstellen

Getestet unter

  • OpenBSD 7.7
  • Debian 12
  • Arch Linux

Zweck des Scripts

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:

if [ "$(uname)" = "OpenBSD" ]; then
    # BSD-Pfad: _furt Benutzer
    groupadd _furt 2>/dev/null || true
    useradd -g _furt -s /bin/false -d /var/empty _furt 2>/dev/null || true
else
    # 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
fi

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.

Betriebssystem-Philosophien verstehen

Die unterschiedlichen Benutzerkonventionen spiegeln verschiedene System-Philosophien wider:

BSD-Ansatz (OpenBSD)

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.

# OpenBSD
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.

# 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

Beide Code-Pfäde implementieren die gleichen Sicherheitsprinzipien für Service-Accounts:

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.

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.

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.

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

# Als Teil der manuellen Installation
sudo ./scripts/setup-user.sh    # Linux
doas ./scripts/setup-user.sh    # OpenBSD

Die Ausgabe bestätigt welcher Benutzer auf welchem System erstellt wurde:

Created BSD system user: _furt
User setup completed successfully

Orchestrierte Installation

# 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

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

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

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:

uname
# Sollte "OpenBSD" oder "Linux" zurückgeben

Script erweitern

Zusätzliche Betriebssysteme

elif [ "$(uname)" = "NetBSD" ]; then
    # 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"

Konsistente UIDs 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.