Sun Jun 15 07:13:08 PM CEST 2025

This commit is contained in:
alf
2025-06-15 19:13:08 +02:00
parent b7d11cfb67
commit 0b2bb6f44e
2 changed files with 307 additions and 0 deletions

148
signierdienst.sh Normal file
View File

@ -0,0 +1,148 @@
#!/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