#!/bin/bash # ============================================================================= # Einmaliges Setup-Skript – läuft auf dem Docker-Host als root # Richtet einen eingeschränkten Backup-User ein # ============================================================================= set -euo pipefail BACKUP_USER="borgbackup" PI_PUBKEY="${1:-}" # Optionaler öffentlicher Key als Argument echo "=== Docker-Host: Backup-User Setup ===" # --- Backup-User anlegen --- echo "[1/3] Lege Backup-User '${BACKUP_USER}' an..." if id "$BACKUP_USER" &>/dev/null; then echo " User existiert bereits." else useradd \ --system \ --create-home \ --home-dir "/home/${BACKUP_USER}" \ --shell /bin/bash \ --comment "BorgBackup Pull User" \ "$BACKUP_USER" echo " User angelegt." fi # --- SSH-Verzeichnis einrichten --- mkdir -p "/home/${BACKUP_USER}/.ssh" chmod 700 "/home/${BACKUP_USER}/.ssh" touch "/home/${BACKUP_USER}/.ssh/authorized_keys" chmod 600 "/home/${BACKUP_USER}/.ssh/authorized_keys" chown -R "${BACKUP_USER}:${BACKUP_USER}" "/home/${BACKUP_USER}/.ssh" # --- Öffentlichen Key eintragen --- echo "[2/3] SSH-Key konfigurieren..." if [ -n "$PI_PUBKEY" ]; then # Key direkt als Argument übergeben AUTHORIZED_KEY="$PI_PUBKEY" else echo "" echo " Füge den öffentlichen Key des Pi ein (Inhalt von /home/pi/.ssh/borg_pull.pub):" read -r AUTHORIZED_KEY fi # Key mit Einschränkungen eintragen: # - no-port-forwarding: kein Tunnel # - no-X11-forwarding: kein X11 # - no-agent-forwarding: kein Agent-Forwarding # - no-pty: kein interaktives Terminal RESTRICTED_KEY="no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${AUTHORIZED_KEY}" # Prüfen ob Key schon eingetragen if grep -qF "$AUTHORIZED_KEY" "/home/${BACKUP_USER}/.ssh/authorized_keys" 2>/dev/null; then echo " Key bereits eingetragen." else echo "$RESTRICTED_KEY" >> "/home/${BACKUP_USER}/.ssh/authorized_keys" echo " Key mit Einschränkungen eingetragen." fi # --- sudo-Rechte für lesenden Zugriff --- echo "[3/3] Konfiguriere sudo-Rechte..." SUDOERS_FILE="/etc/sudoers.d/borgbackup" cat > "$SUDOERS_FILE" << 'EOF' # Erlaubt borgbackup-User lesenden Zugriff auf /var/lib/docker/volumes und /etc # NOPASSWD damit sshfs ohne Passwort funktioniert borgbackup ALL=(root) NOPASSWD: /bin/tar, /usr/bin/find EOF chmod 440 "$SUDOERS_FILE" visudo -cf "$SUDOERS_FILE" && echo " sudoers-Datei OK." || { rm "$SUDOERS_FILE" echo " FEHLER: sudoers-Datei ungültig, wurde entfernt." exit 1 } # --- Firewall-Hinweis --- echo "" echo "=== Setup abgeschlossen! ===" echo "" echo "Der User '${BACKUP_USER}' kann sich jetzt per SSH einloggen." echo "Der Pi kann / read-only mounten und Backups ziehen." echo "" echo "Optionale Härtung – SSH-Zugriff auf Pi-IP einschränken." echo "In /etc/ssh/sshd_config hinzufügen:" echo "" echo " Match User ${BACKUP_USER}" echo " AllowUsers ${BACKUP_USER}@" echo " ForceCommand internal-sftp" echo "" echo "HINWEIS: ForceCommand internal-sftp würde sshfs erlauben aber" echo " Shell-Zugriff verhindern. Für sshfs ist dies ausreichend." echo ""