Files
Boilerplates/Linux/SSH
2025-01-05 09:20:48 +00:00
..
2025-01-05 09:20:48 +00:00

Erstellen einer sicheren SSH-Anmeldung

Dieses Skript richtet OpenSSH mit sicheren Einstellungen ein und erstellt bei Bedarf Benutzer mit SSH-Zugriff.
Es stellt sicher, dass sudo und der OpenSSH-Server installiert sind und generiert sichere Host-Schlüssel (Ed25519).
Das Skript erlaubt es, SSH-Zugriff nur für bestimmte Benutzer zu konfigurieren.


Anforderungen

  • AlmaLinux, Debian, Ubuntu oder Alpine Linux
  • Root- oder sudo-Rechte

Skript: Secure SSH Setup

#!/bin/bash

# Bildschirm löschen (Kompatibel mit Strg+L)
printf "\033c"

SSH_CONFIG_DIR="/etc/ssh/sshd_config.d"
SSH_MAIN_CONFIG="/etc/ssh/sshd_config"
SSH_CONFIG_FILE="$SSH_CONFIG_DIR/secure.conf"
ED25519_KEY="/etc/ssh/ssh_host_ed25519_key"

# Farben definieren
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
WHITE='\033[1;37m'
RESET='\033[0m'

# Rotierender Kreis-Spinner
spinner() {
    local pid=$1
    local delay=0.1
    local spinstr='|/-\'
    while kill -0 $pid 2> /dev/null; do
        for i in {0..3}; do
            printf " [%c]  " "${spinstr:i:1}"
            sleep $delay
            printf "\b\b\b\b\b\b"
        done
    done
    printf "    \b\b\b\b"
}

log() {
    echo -e "${GREEN}$1${RESET}"
}

warn() {
    echo -e "${YELLOW}$1${RESET}"
}

error() {
    echo -e "${RED}$1${RESET}"
}

# Funktion zur Installation von Paketen mit Spinner
install_package() {
    local package=$1
    local cmd=$2
    warn "Installiere $package..."
    
    mkfifo /tmp/spinner_pipe 2>/dev/null
    $cmd &> /tmp/spinner_pipe &  # Prozess läuft im Hintergrund
    local pid=$!
    disown $pid  # Entfernt Jobsteuerung, kein [1] 3562
    spinner $pid < /tmp/spinner_pipe &  
    wait $pid

    if [ $? -eq 0 ]; then
        log "$package wurde erfolgreich installiert."
    else
        error "Fehler bei der Installation von $package."
        exit 1
    fi

    rm -f /tmp/spinner_pipe
}

# Überprüfe und installiere sudo, falls nicht vorhanden
if ! command -v sudo &> /dev/null; then
    warn "sudo ist nicht installiert. Versuche, sudo zu installieren..."
    
    if command -v apt &> /dev/null; then
        install_package "sudo" "apt update && apt install -y sudo"
    elif command -v dnf &> /dev/null; then
        install_package "sudo" "dnf install -y sudo"
    elif command -v apk &> /dev/null; then
        install_package "sudo" "apk add sudo"
    else
        error "Nicht unterstütztes System. Bitte sudo manuell installieren."
        exit 1
    fi
else
    log "sudo ist bereits installiert."
fi

# Installiere OpenSSH-Server, falls nicht vorhanden
if ! command -v sshd &> /dev/null; then
    warn "OpenSSH-Server wird installiert..."
    
    if command -v apt &> /dev/null; then
        install_package "OpenSSH-Server" "sudo apt update && sudo apt install -y openssh-server"
    elif command -v dnf &> /dev/null; then
        install_package "OpenSSH-Server" "sudo dnf install -y openssh-server"
    elif command -v apk &> /dev/null; then
        install_package "OpenSSH-Server" "sudo apk add openssh"
    else
        error "Nicht unterstütztes System. Bitte OpenSSH manuell installieren."
        exit 1
    fi
else
    log "OpenSSH-Server ist bereits installiert."
fi

# Generiere fehlende Host-Schlüssel (Ed25519)
if [ ! -f "$ED25519_KEY" ]; then
    warn "Host-Schlüssel fehlt. Generiere ssh_host_ed25519_key..."
    
    mkfifo /tmp/keygen_pipe 2>/dev/null
    ( sudo ssh-keygen -t ed25519 -f $ED25519_KEY -N "" &> /tmp/keygen_pipe ) &  
    local pid=$!
    disown $pid
    spinner $pid < /tmp/keygen_pipe &  
    wait $pid

    sudo chown root:root $ED25519_KEY
    sudo chmod 600 $ED25519_KEY
    log "Host-Schlüssel ssh_host_ed25519_key wurde erstellt."
    
    rm -f /tmp/keygen_pipe
else
    log "Host-Schlüssel ssh_host_ed25519_key ist bereits vorhanden."
fi