ScreenConnect-Block und apt-Diagnose wieder entfernt

Der haengende ScreenConnect-Client wird ueber die Default-Policies geloest, damit
er gar nicht erst installiert wird - nicht im Skript. ESPO-01 ist damit wieder
auf seine neun Schritte zurueck, ESPO-02 auf die knappe Fehlerzeile.

Aus der offiziellen Docker-Doku bleibt, was dorthin gehoert: das Entfernen
konkurrierender Pakete vor der Installation und ca-certificates/curl vor dem
Schluessel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gordon.zimm 2026-09-24 10:02:54 +02:00
parent d4e0294bfd
commit 995ef4b461
2 changed files with 11 additions and 49 deletions

View File

@ -11,34 +11,7 @@ echo "ESPO-01-Grundeinrichtung, Skriptstand 2026-09-24"
KUNDE_ROH="${1:-}" KUNDE_ROH="${1:-}"
FEHLER=0 FEHLER=0
# 1. ScreenConnect entfernen. Der Agent rollt den Client aus, ADR 0003 sagt: wir wollen ihn nicht. # 1. Hostname aus dem Kundennamen ableiten (klein, nur a-z 0-9 und Bindestrich), damit die
# Auf Ubuntu bleibt er ausserdem halb konfiguriert haengen, weil ihm java5-runtime fehlt - und
# in diesem Zustand blockiert er jede weitere apt-Operation auf der VM (gemessen am 24.09.2026).
SC="$(dpkg-query -W -f='${Package}\n' 'connectwisecontrol-*' 2>/dev/null | grep . || true)"
if [ -n "$SC" ]; then
echo "ScreenConnect gefunden: $(echo "$SC" | tr '\n' ' ')"
DEBIAN_FRONTEND=noninteractive apt-get purge -y -q $SC >/dev/null 2>&1 \
|| dpkg --purge --force-depends $SC >/dev/null 2>&1 || true
DEBIAN_FRONTEND=noninteractive apt-get --fix-broken install -y -q >/dev/null 2>&1 || true
if dpkg-query -W -f='${Package}\n' 'connectwisecontrol-*' 2>/dev/null | grep -q .; then
echo "FEHLER: ScreenConnect liess sich nicht entfernen"; FEHLER=1
else
echo "ScreenConnect: entfernt"
fi
else
echo "ScreenConnect: nicht installiert"
fi
# 2. apt muss danach sauber sein, sonst scheitert jeder folgende Schritt an einem fremden Paket.
if ! DEBIAN_FRONTEND=noninteractive apt-get check >/dev/null 2>&1; then
echo "FEHLER: apt meldet weiterhin gebrochene Abhaengigkeiten:"
dpkg -l | awk '$1 !~ /^ii/ && NR > 5 {print " " $0}'
FEHLER=1
else
echo "apt: keine gebrochenen Abhaengigkeiten"
fi
# 3. Hostname aus dem Kundennamen ableiten (klein, nur a-z 0-9 und Bindestrich), damit die
# Flotte im RMM und in Logs eindeutig benannt ist. # Flotte im RMM und in Logs eindeutig benannt ist.
KUNDE=$(printf '%s' "$KUNDE_ROH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/-\+/-/g; s/^-//; s/-$//') KUNDE=$(printf '%s' "$KUNDE_ROH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/-\+/-/g; s/^-//; s/-$//')
SOLL="crm-${KUNDE}" SOLL="crm-${KUNDE}"
@ -52,7 +25,7 @@ else
echo "Hostname: $SOLL (unveraendert)" echo "Hostname: $SOLL (unveraendert)"
fi fi
# 4. Hinweis auf das Initialpasswort aus dem Konsolen-Login entfernen - er hat nach der # 2. Hinweis auf das Initialpasswort aus dem Konsolen-Login entfernen - er hat nach der
# Erstanmeldung keinen Zweck mehr und steht sonst dauerhaft am Anmeldebildschirm. # Erstanmeldung keinen Zweck mehr und steht sonst dauerhaft am Anmeldebildschirm.
if grep -q "Initialpasswort" /etc/issue; then if grep -q "Initialpasswort" /etc/issue; then
sed -i '/Initialpasswort/d; /beim ersten Anmelden/d' /etc/issue sed -i '/Initialpasswort/d; /beim ersten Anmelden/d' /etc/issue
@ -61,7 +34,7 @@ else
echo "/etc/issue: kein Hinweis vorhanden" echo "/etc/issue: kein Hinweis vorhanden"
fi fi
# 5. Pruefen, dass das Konto ein gueltiges Passwort hat (Status P) - sonst ist die # 3. Pruefen, dass das Konto ein gueltiges Passwort hat (Status P) - sonst ist die
# Erstinbetriebnahme unvollstaendig. # Erstinbetriebnahme unvollstaendig.
if [ "$(passwd -S administrator | awk '{print $2}')" = "P" ]; then if [ "$(passwd -S administrator | awk '{print $2}')" = "P" ]; then
echo "Konto administrator: Passwort gesetzt" echo "Konto administrator: Passwort gesetzt"
@ -69,7 +42,7 @@ else
echo "FEHLER: Konto administrator hat kein gueltiges Passwort"; FEHLER=1 echo "FEHLER: Konto administrator hat kein gueltiges Passwort"; FEHLER=1
fi fi
# 6. SSH haerten: keine Root-Anmeldung, wenige Fehlversuche, kurze Anmeldefrist. # 4. SSH haerten: keine Root-Anmeldung, wenige Fehlversuche, kurze Anmeldefrist.
install -d -m 755 /etc/ssh/sshd_config.d install -d -m 755 /etc/ssh/sshd_config.d
cat > /etc/ssh/sshd_config.d/10-espo.conf <<'CONF' cat > /etc/ssh/sshd_config.d/10-espo.conf <<'CONF'
PermitRootLogin no PermitRootLogin no
@ -78,30 +51,30 @@ LoginGraceTime 20
CONF CONF
if sshd -t; then systemctl reload ssh && echo "SSH: PermitRootLogin no, MaxAuthTries 3"; else echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1; fi if sshd -t; then systemctl reload ssh && echo "SSH: PermitRootLogin no, MaxAuthTries 3"; else echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1; fi
# 7. Journal begrenzen, damit Logs das Wurzeldateisystem nicht fuellen koennen. # 5. Journal begrenzen, damit Logs das Wurzeldateisystem nicht fuellen koennen.
install -d -m 755 /etc/systemd/journald.conf.d install -d -m 755 /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/10-espo.conf printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/10-espo.conf
systemctl restart systemd-journald && echo "journald: SystemMaxUse=500M" systemctl restart systemd-journald && echo "journald: SystemMaxUse=500M"
# 8. needrestart daran hindern, containerd automatisch neu zu starten - das wuerde die # 6. needrestart daran hindern, containerd automatisch neu zu starten - das wuerde die
# laufenden Container mitreissen. docker ist ab Werk schon ausgenommen. # laufenden Container mitreissen. docker ist ab Werk schon ausgenommen.
install -d -m 755 /etc/needrestart/conf.d install -d -m 755 /etc/needrestart/conf.d
printf '# containerd nicht automatisch neu starten (Container haengen daran).\n$nrconf{override_rc}{qr(^containerd)} = 0;\n' > /etc/needrestart/conf.d/10-espo.conf printf '# containerd nicht automatisch neu starten (Container haengen daran).\n$nrconf{override_rc}{qr(^containerd)} = 0;\n' > /etc/needrestart/conf.d/10-espo.conf
echo "needrestart: containerd ausgenommen" echo "needrestart: containerd ausgenommen"
# 9. Zeitzone sicherstellen. # 7. Zeitzone sicherstellen.
if [ "$(timedatectl show -p Timezone --value)" != "Europe/Berlin" ]; then if [ "$(timedatectl show -p Timezone --value)" != "Europe/Berlin" ]; then
timedatectl set-timezone Europe/Berlin && echo "Zeitzone auf Europe/Berlin gesetzt" timedatectl set-timezone Europe/Berlin && echo "Zeitzone auf Europe/Berlin gesetzt"
else else
echo "Zeitzone: Europe/Berlin" echo "Zeitzone: Europe/Berlin"
fi fi
# 10. Automatische Sicherheitsupdates nur pruefen, nicht aendern - sie sind Ubuntu-Standard. # 8. Automatische Sicherheitsupdates nur pruefen, nicht aendern - sie sind Ubuntu-Standard.
if grep -qs '"1"' /etc/apt/apt.conf.d/20auto-upgrades; then if grep -qs '"1"' /etc/apt/apt.conf.d/20auto-upgrades; then
echo "unattended-upgrades: aktiv" echo "unattended-upgrades: aktiv"
else else
echo "WARNUNG: unattended-upgrades nicht aktiv"; FEHLER=1 echo "WARNUNG: unattended-upgrades nicht aktiv"; FEHLER=1
fi fi
# 11. Ergebniszeile fuer Monitor und Custom Field. # 9. Ergebniszeile fuer Monitor und Custom Field.
if [ "$FEHLER" -eq 0 ]; then echo "ESPO01_ERGEBNIS: OK"; exit 0; else echo "ESPO01_ERGEBNIS: FEHLER"; exit 1; fi if [ "$FEHLER" -eq 0 ]; then echo "ESPO01_ERGEBNIS: OK"; exit 0; else echo "ESPO01_ERGEBNIS: FEHLER"; exit 1; fi

View File

@ -43,21 +43,10 @@ CONF
apt-get update -qq || { echo "FEHLER: apt-get update"; exit 1; } apt-get update -qq || { echo "FEHLER: apt-get update"; exit 1; }
# 3. Genau diese Versionen installieren und auf Hold setzen, damit nichts unbemerkt nachzieht. # 3. Genau diese Versionen installieren und auf Hold setzen, damit nichts unbemerkt nachzieht.
# Scheitert die Installation, sagt das Skript woran - eine blosse Fehlermeldung hilft niemandem weiter.
PAKETE="docker-ce=$DOCKER_VERSION docker-ce-cli=$DOCKER_VERSION containerd.io=$CONTAINERD_VERSION" PAKETE="docker-ce=$DOCKER_VERSION docker-ce-cli=$DOCKER_VERSION containerd.io=$CONTAINERD_VERSION"
PAKETE="$PAKETE docker-compose-plugin=$COMPOSE_VERSION docker-buildx-plugin=$BUILDX_VERSION" PAKETE="$PAKETE docker-compose-plugin=$COMPOSE_VERSION docker-buildx-plugin=$BUILDX_VERSION"
if ! DEBIAN_FRONTEND=noninteractive apt-get install -y -q $PAKETE; then DEBIAN_FRONTEND=noninteractive apt-get install -y -q $PAKETE \
echo "--- Diagnose: was apt dazu sagt" || { echo "FEHLER: Installation"; echo "ESPO02_ERGEBNIS: FEHLER"; exit 1; }
DEBIAN_FRONTEND=noninteractive apt-get -s install $PAKETE 2>&1 | tail -n 30
echo "--- Diagnose: was verfuegbar ist"
apt-cache policy docker-ce containerd.io docker-compose-plugin docker-buildx-plugin iptables nftables
echo "--- Diagnose: was schon installiert ist"
dpkg -l | grep -Ei 'docker|containerd|runc' || echo "keine Docker-Pakete installiert"
echo "--- Diagnose: haengende Installationen"
dpkg -l | awk '$1 !~ /^ii/ && NR > 5 {print}' || true
echo "FEHLER: Installation"
echo "ESPO02_ERGEBNIS: FEHLER"; exit 1
fi
apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin >/dev/null apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin >/dev/null
# 4. Daemon-Grundlagen: Logrotation, weil der Standardtreiber nicht rotiert. # 4. Daemon-Grundlagen: Logrotation, weil der Standardtreiber nicht rotiert.