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:
sysops
2026-07-05 19:49:56 +02:00
parent 4af0e4a280
commit 7300a696ca
4 changed files with 200 additions and 2 deletions
+34
View File
@@ -18,6 +18,40 @@ die() { echo -e "${RED}[ERR]${NC} $*" >&2; exit 1; }
[[ $EUID -eq 0 ]] || die "Bitte als root ausführen: sudo bash update.sh"
# PROJ-68: Backfill für Bestandsinstallationen, bei denen sudo-Rechte für die
# Admin-Dienststeuerung nie provisioniert wurden (siehe install.sh für den
# ausführlichen Kommentar zum "Warum"). Whitelist MUSS mit `allowedServices`
# in internal/api/admin_services_handlers.go synchron gehalten werden.
provision_archivmail_sudoers() {
local am_user="archivmail"
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 aktuell (/etc/sudoers.d/archivmail)"
else
warn "Generierte sudoers-Regel ist ungültig — /etc/sudoers.d/archivmail NICHT verändert"
fi
rm -f "$tmpfile"
}
provision_archivmail_sudoers
REPO_URL="${REPO_URL:-https://gitea.perlbach24.de/scripte/archivmail.git}"
INSTALL_DIR="/opt/archivmail"
BUILD_DIR="/opt/archivmail/_build"