#!/bin/bash # --- Konfiguration --- # Nextcloud rclone Remote Name (wie in deiner rclone.conf definiert) RCLONE_REMOTE="nextcloud3" # Basisverzeichnis für SSH-Schlüssel auf dem Client (normalerweise ~/.ssh/) SSH_DIR="$HOME/Schluessel" # Verzeichnis auf Nextcloud, wo ungesignierte Schlüssel hochgeladen werden # MUSS ÜBEREINSTIMMEN MIT DEM SIGNIERUNGSSTELLEN-SKRIPT! NEXTCLOUD_UPLOAD_DIR="CA/Eingang" # Verzeichnis auf Nextcloud, wo signierte Schlüssel heruntergeladen werden # MUSS ÜBEREINSTIMMEN MIT DEM SIGNIERUNGSSTELLEN-SKRIPT! NEXTCLOUD_SIGNED_DIR="CA/Ausgang" # Verzeichnis auf Nextcloud, wohin der signierte Schlüssel nach dem Download verschoben wird # MUSS ÜBEREINSTIMMEN MIT DEM SIGNIERUNGSSTELLEN-SKRIPT! NEXTCLOUD_ARCHIVE_DIR="CA/Archiv" # NEU: Archiv-Verzeichnis # Name des neuen SSH-Schlüsselpaars (z.B. id_rsa_clientname) # ACHTUNG: Wenn diese Datei existiert, wird sie überschrieben! read -p "Schlüsselname " KEY_NAME # KEY_NAME="id_rsa_$(hostname)" # Verwendet den Hostnamen als Teil des Schlüsselnamens # Kommentierungsoption für den Schlüssel (identifiziert den Schlüssel in ~/.ssh/authorized_keys) KEY_COMMENT="$(whoami)@$(hostname) $(date +%F) Signierdienst" # --- Skript Start --- echo "Starte die Automatisierung der SSH-Schlüsselerstellung und Signierung..." echo "--------------------------------------------------------" # 1. Sicherstellen, dass das SSH-Verzeichnis existiert if [ ! -d "$SSH_DIR" ]; then echo "Erstelle SSH-Verzeichnis: $SSH_DIR" mkdir -p "$SSH_DIR" chmod 700 "$SSH_DIR" fi # 2. Erstellen des neuen SSH-Schlüsselpaars PRIVATE_KEY_PATH="$SSH_DIR/$KEY_NAME" PUBLIC_KEY_PATH="$SSH_DIR/$KEY_NAME.pub" if [ -f "$PRIVATE_KEY_PATH" ]; then read -p "Warnung: SSH-Schlüssel '$KEY_NAME' existiert bereits. Überschreiben? (j/N): " OVERWRITE if [[ ! "$OVERWRITE" =~ ^[Jj]$ ]]; then echo "Vorgang abgebrochen. Vorhandener Schlüssel wird nicht überschrieben." exit 1 fi echo "Überschreibe vorhandenen Schlüssel..." fi echo "Erstelle neues SSH-Schlüsselpaar ($KEY_NAME)..." ssh-keygen -t rsa -b 4096 -C "$KEY_COMMENT" -f "$PRIVATE_KEY_PATH" # Es wird empfohlen, eine Passphrase zu verwenden! Der Benutzer wird hiernach gefragt. if [ $? -ne 0 ]; then echo "Fehler beim Erstellen des SSH-Schlüsselpaars. Abbruch." exit 1 fi echo "Schlüsselpaar erfolgreich erstellt: $PRIVATE_KEY_PATH und $PUBLIC_KEY_PATH" echo "" # 3. Hochladen des öffentlichen Schlüssels zur Signierung auf Nextcloud echo "Lade öffentlichen Schlüssel '$PUBLIC_KEY_PATH' zur Signierung auf Nextcloud hoch..." UPLOAD_TARGET="$RCLONE_REMOTE:$NEXTCLOUD_UPLOAD_DIR/" rclone copy "$PUBLIC_KEY_PATH" "$UPLOAD_TARGET" --progress if [ $? -ne 0 ]; then echo "Fehler beim Hochladen des öffentlichen Schlüssels auf Nextcloud. Abbruch." exit 1 fi echo "Öffentlicher Schlüssel erfolgreich hochgeladen nach: $UPLOAD_TARGET$(basename "$PUBLIC_KEY_PATH")" echo "" # 4. Warten auf den signierten Schlüssel (Polling) SIGNED_KEY_NAME="${KEY_NAME}-cert.pub" SIGNED_KEY_PATH="$SSH_DIR/$SIGNED_KEY_NAME" NEXTCLOUD_SIGNED_SOURCE="$RCLONE_REMOTE:$NEXTCLOUD_SIGNED_DIR/$SIGNED_KEY_NAME" NEXTCLOUD_ARCHIVE_TARGET="$RCLONE_REMOTE:$NEXTCLOUD_ARCHIVE_DIR/" # Ziel für das Archivieren echo "Warte auf den signierten Schlüssel auf Nextcloud..." echo "Dies kann einen Moment dauern, bis die Signierungsstelle den Schlüssel verarbeitet hat." MAX_ATTEMPTS=120 # Maximal 60 Versuche (ca. 10 Minuten bei 10s Pause) ATTEMPT=0 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do ATTEMPT=$((ATTEMPT + 1)) echo "Versuch $ATTEMPT von $MAX_ATTEMPTS: Prüfe, ob signierter Schlüssel verfügbar ist..." # Liste die Dateien im Zielverzeichnis auf und filtere nach dem erwarteten Namen rclone lsf "$RCLONE_REMOTE:$NEXTCLOUD_SIGNED_DIR" | grep -q "$(basename "$SIGNED_KEY_NAME")" if [ $? -eq 0 ]; then echo "Signierter Schlüssel gefunden! Lade '$SIGNED_KEY_NAME' herunter..." rclone copy "$NEXTCLOUD_SIGNED_SOURCE" "$SSH_DIR" --progress if [ $? -ne 0 ]; then echo "Fehler beim Herunterladen des signierten Schlüssels. Bitte manuell prüfen." exit 1 fi echo "Signierter Schlüssel erfolgreich heruntergeladen nach: $SIGNED_KEY_PATH" # NEU: Verschieben des signierten Schlüssels ins Archiv echo "Verschiebe den signierten Schlüssel von '$NEXTCLOUD_SIGNED_DIR' nach '$NEXTCLOUD_ARCHIVE_DIR'..." rclone moveto "$NEXTCLOUD_SIGNED_SOURCE" "$NEXTCLOUD_ARCHIVE_TARGET$(basename "$SIGNED_KEY_NAME")" if [ $? -ne 0 ]; then echo "Warnung: Fehler beim Verschieben des signierten Schlüssels ins Archiv auf Nextcloud." echo "Bitte manuell prüfen: $NEXTCLOUD_SIGNED_SOURCE" else echo "Signierter Schlüssel erfolgreich archiviert." fi break else echo "Signierter Schlüssel noch nicht verfügbar. Warte 10 Sekunden..." sleep 10 fi if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then echo "Maximale Wartezeit erreicht. Der signierte Schlüssel wurde nicht gefunden." echo "Bitte überprüfe die Signierungsstelle und die Nextcloud-Verzeichnisse manuell." exit 1 fi done # 5. Berechtigungen setzen (optional, aber empfohlen für signierte Schlüssel) echo "Setze Berechtigungen für den signierten Schlüssel..." chmod 644 "$SIGNED_KEY_PATH" echo "Berechtigungen gesetzt: $SIGNED_KEY_PATH (644)" echo "" echo "Automatisierung abgeschlossen." echo "Du kannst nun versuchen, dich mit dem signierten Schlüssel anzumelden." echo "Der private Schlüssel ist: $PRIVATE_KEY_PATH" echo "Der signierte öffentliche Schlüssel ist: $SIGNED_KEY_PATH" echo "" echo "Um den Schlüssel in den ssh-agent zu laden, verwende:" echo "ssh-add $PRIVATE_KEY_PATH" echo "" echo "Vergiss nicht, den öffentlichen Teil des signierten Schlüssels (id_rsa-cert.pub) in deine SSH-Konfiguration einzutragen," echo "falls du explizit Keys für bestimmte Hosts definieren möchtest (obwohl das Zertifikat für SSH-Server mit der CA-Konfiguration funktioniert)." echo "" echo "Bitte vergewissere dich, dass deine SSH-Konfiguration auf den Servern die Zertifikatsautorität korrekt nutzt." exit 0