#!/bin/bash set -e # Farben GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Pfad zum Script-Verzeichnis SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Logging-Script einbinden source "$SCRIPT_DIR/log/logging.sh" # Logdatei im log/-Verzeichnis LOG_FILE="$SCRIPT_DIR/log/ssh-cert-login.log" log_init "$LOG_FILE" log_start "SSH Zertifikat Login" # Config CA und Ziel (Standardwerte) CA_HOST="100.87.87.5" CA_USER="alf" CA_PORT=22 REMOTE_SIGN_SCRIPT="/home/alf/remote_sign.sh" KEY_DIR="$SCRIPT_DIR/temp_keys" KEY_NAME="temp_user_key" CA_SSH_KEY="$HOME/.ssh/id_ca" # Gum Check if ! command -v gum &> /dev/null; then log_error "gum ist nicht installiert. Bitte zuerst installieren." exit 1 fi # VM Alias → IP Map declare -A VM_MAP=( [Server1]="100.87.87.101" [ABS]="100.87.87.102" [OMVPi]="100.87.87.80" [OMV2000]="100.87.87.81" [CA]="100.87.87.5" ) # Auswahl der VM per Alias mit gum choose VM_ALIAS=$(gum choose --header "Wähle die Ziel-VM" "${!VM_MAP[@]}") TARGET_HOST="${VM_MAP[$VM_ALIAS]}" # Benutzer-Auswahl mit festen Optionen + freie Eingabe USER_OPTIONS=("alf" "root" "oberkoetter" "Anderer Benutzer") SELECTED_USER=$(gum choose --header "Wähle den SSH-Benutzer" "${USER_OPTIONS[@]}") if [ "$SELECTED_USER" == "Anderer Benutzer" ]; then SSH_USER=$(gum input --placeholder "Benutzername eingeben") else SSH_USER="$SELECTED_USER" fi TARGET_PORT=$(gum input --placeholder "Ziel SSH Port" --value "2222") VALIDITY_OPTIONS=("300" "600" "1800" "3600") # Sek. 5min, 10min, 30min, 1h VALIDITY=$(gum choose --header "Gültigkeitsdauer des Zertifikats wählen" "${VALIDITY_OPTIONS[@]}") # Logge die Ziel-VM und den SSH-Benutzer log_info "Ziel-VM: $VM_ALIAS ($TARGET_HOST)" log_info "SSH-Benutzer: $SSH_USER" # Keys vorbereiten mkdir -p "$KEY_DIR" cd "$KEY_DIR" log_info "Prüfe auf vorhandene temporäre Schlüssel..." if [[ -f "$KEY_NAME" || -f "${KEY_NAME}.pub" || -f "${KEY_NAME}-cert.pub" ]]; then log_warn "Vorherige temporäre Schlüssel werden gelöscht..." rm -f "$KEY_NAME" "$KEY_NAME.pub" "$KEY_NAME-cert.pub" fi log_info "Generiere temporären SSH-Key..." ssh-keygen -f "$KEY_NAME" -N "" -C "$SSH_USER@temp" > /dev/null log_info "Sende Public Key zur CA (${CA_HOST})..." scp -i "$CA_SSH_KEY" -P "$CA_PORT" "${KEY_NAME}.pub" "${CA_USER}@${CA_HOST}:/tmp/" || { log_error "Fehler beim Senden des Public Keys zur CA" exit 1 } log_info "Fordere Signatur von CA an..." ssh -i "$CA_SSH_KEY" -p "$CA_PORT" "${CA_USER}@${CA_HOST}" \ "$REMOTE_SIGN_SCRIPT /tmp/${KEY_NAME}.pub $SSH_USER $VALIDITY" || { log_error "Fehler bei der Signierung durch die CA" exit 1 } log_info "Lade signiertes Zertifikat von CA..." scp -i "$CA_SSH_KEY" -P "$CA_PORT" "${CA_USER}@${CA_HOST}:/tmp/${KEY_NAME}-cert.pub" . || { log_error "Fehler beim Abrufen des Zertifikats von der CA" exit 1 } log_info "Zertifikat erfolgreich erhalten" log_info "Starte SSH-Verbindung zum Zielsystem (${VM_ALIAS} / ${TARGET_HOST}) über Port ${TARGET_PORT}..." ssh -p "$TARGET_PORT" -i "$KEY_NAME" "$SSH_USER@$TARGET_HOST" log_end "SSH Zertifikat Login"