fix(PROJ-68): sudo-Provisionierung für Admin-Dienststeuerung ergänzen
Root Cause für den HTTP-500-Bug beim Manticore-Neustart über den Dienste-Tab: sudo war auf 132 gar nicht installiert, admin_services_handlers.go ruft aber für JEDE Dienst-Aktion sudo systemctl auf. Betraf nicht nur Manticore, sondern alle Dienste in der Whitelist - PROJ-67 hat es nur erstmals sichtbar gemacht. install.sh/update.sh installieren jetzt sudo (falls fehlend) und legen /etc/sudoers.d/archivmail mit NOPASSWD-Regeln für genau die Service- Whitelist an (archivmail, archivmail-web, manticore, postgresql@17-main, postfix, nginx) - validiert per visudo -c vor dem Einspielen, damit ein Bug im Generator nie eine kaputte sudoers-Datei live schaltet. update.sh zieht das als Backfill für Bestandsinstallationen nach, analog zum PROJ-67-Upgrade-Pfad-Muster. archivmail-nft-Helper (externe Zugriffskontrolle) fehlt auf 132 ebenfalls, aber bewusst nicht Teil dieses Tickets (vermutlich firewall-security-Skill- Verantwortung).
This commit is contained in:
+48
@@ -16,6 +16,45 @@ info() { echo -e "${BLUE}[..]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[!!]${NC} $*"; }
|
||||
die() { echo -e "${RED}[ERR]${NC} $*" >&2; exit 1; }
|
||||
|
||||
# PROJ-68: Provisioniert sudo-NOPASSWD-Rechte für die Admin-Dienststeuerung
|
||||
# (Start/Stop/Restart/Enable/Disable über den "Dienste"-Tab). Muss mit
|
||||
# `allowedServices` in internal/api/admin_services_handlers.go synchron
|
||||
# gehalten werden. Installiert `sudo` falls fehlend, validiert die generierte
|
||||
# Datei per `visudo -c` VOR dem Einspielen — eine kaputte sudoers-Datei würde
|
||||
# sonst den gesamten sudo-Mechanismus auf dem Server lahmlegen. Idempotent:
|
||||
# überschreibt die Datei bei jedem Lauf mit demselben, deterministischen
|
||||
# Inhalt (kein Diff-Merge nötig, da wir hier die einzige Quelle dieser Regeln
|
||||
# sind — ein manuell abweichend konfiguriertes System würde überschrieben,
|
||||
# das ist so beabsichtigt, damit Code und Server nie auseinanderlaufen).
|
||||
provision_archivmail_sudoers() {
|
||||
local am_user="${1:-$AM_USER}"
|
||||
command -v sudo >/dev/null 2>&1 || apt-get install -y -qq sudo
|
||||
|
||||
local services=("archivmail" "archivmail-web" "manticore" "postgresql@17-main" "postfix" "nginx")
|
||||
local tmpfile
|
||||
tmpfile="$(mktemp)"
|
||||
{
|
||||
echo "# Verwaltet von install.sh/update.sh (PROJ-68) — nicht manuell editieren,"
|
||||
echo "# Änderungen gehen beim nächsten Deploy verloren. Whitelist muss mit"
|
||||
echo "# allowedServices in internal/api/admin_services_handlers.go übereinstimmen."
|
||||
for svc in "${services[@]}"; do
|
||||
echo "${am_user} ALL=(root) NOPASSWD: /usr/bin/systemctl start ${svc}.service"
|
||||
echo "${am_user} ALL=(root) NOPASSWD: /usr/bin/systemctl stop ${svc}.service"
|
||||
echo "${am_user} ALL=(root) NOPASSWD: /usr/bin/systemctl restart ${svc}.service"
|
||||
echo "${am_user} ALL=(root) NOPASSWD: /usr/bin/systemctl enable ${svc}.service"
|
||||
echo "${am_user} ALL=(root) NOPASSWD: /usr/bin/systemctl disable ${svc}.service"
|
||||
done
|
||||
} > "$tmpfile"
|
||||
|
||||
if visudo -c -f "$tmpfile" >/dev/null 2>&1; then
|
||||
install -m 0440 -o root -g root "$tmpfile" /etc/sudoers.d/archivmail
|
||||
log "sudo-Rechte für Dienststeuerung eingerichtet (/etc/sudoers.d/archivmail)"
|
||||
else
|
||||
warn "Generierte sudoers-Regel ist ungültig — /etc/sudoers.d/archivmail NICHT verändert"
|
||||
fi
|
||||
rm -f "$tmpfile"
|
||||
}
|
||||
|
||||
# PROJ-66: Ein Backup (App-Backup oder PBS/Snapshot) ist ohne dieses Keyfile
|
||||
# wertlos — der Store bleibt Chiffretext. Der Inhalt wird EINMALIG bei der
|
||||
# Generierung ausgegeben, damit er sofort in einen Passwort-Safe (z.B.
|
||||
@@ -493,6 +532,15 @@ install_native() {
|
||||
&& log "Benutzer '$AM_USER' existiert bereits" \
|
||||
|| { useradd --system --shell /bin/false --home "$STORE_DIR" --create-home "$AM_USER"; log "Benutzer angelegt"; }
|
||||
|
||||
# ── 2b. sudo-Rechte für die Admin-Dienststeuerung (PROJ-68) ────────────────
|
||||
# internal/api/admin_services_handlers.go ruft für Start/Stop/Restart/
|
||||
# Enable/Disable IMMER `sudo systemctl ...` auf — ohne diese Provisionierung
|
||||
# schlägt jede Dienst-Aktion aus dem Admin-"Dienste"-Tab mit einem
|
||||
# schwer diagnostizierbaren HTTP 500 fehl (sudo: command not found).
|
||||
# Whitelist MUSS mit `allowedServices` in admin_services_handlers.go
|
||||
# synchron bleiben.
|
||||
provision_archivmail_sudoers
|
||||
|
||||
# ── 3. Verzeichnisstruktur ────────────────────────────────────────────────
|
||||
info "Erstelle Verzeichnisstruktur..."
|
||||
mkdir -p "$STORE_DIR/store" "$STORE_DIR/astore"
|
||||
|
||||
Reference in New Issue
Block a user