96 lines
3.1 KiB
Bash
96 lines
3.1 KiB
Bash
#!/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}@<PI-IP-ADRESSE>"
|
||
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 ""
|