diff --git a/setup-backup.sh b/setup-backup.sh new file mode 100644 index 0000000..28c6a74 --- /dev/null +++ b/setup-backup.sh @@ -0,0 +1,95 @@ +#!/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 ""