Files
Boilerplates/Linux/SSH/README.md
2025-01-05 09:07:12 +00:00

5.2 KiB

Erstellen einer sicheren SSH Anmeldung

#!/bin/bash

cls  # Bildschirm löschen zu Beginn

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'

# Punkt-Spinner (Docker-Stil)
spinner() {
    local pid=$1
    local delay=0.15
    local frames=('.  ' '.. ' '...')
    while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
        for frame in "${frames[@]}"; do
            printf " [%s]  " "$frame"
            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..."
    $cmd &> /dev/null &
    spinner $!
    log "$package wurde erfolgreich installiert."
}

# Ü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..."
    sudo ssh-keygen -t ed25519 -f $ED25519_KEY -N "" &> /dev/null &
    spinner $!
    sudo chown root:root $ED25519_KEY
    sudo chmod 600 $ED25519_KEY
    log "Host-Schlüssel ssh_host_ed25519_key wurde erstellt."
else
    log "Host-Schlüssel ssh_host_ed25519_key ist bereits vorhanden."
fi

# SSHD-Konfigurationsverzeichnis sicherstellen und alte Konfigs löschen
warn "Lösche bestehende Konfigurationen in $SSH_CONFIG_DIR ..."
sudo mkdir -p $SSH_CONFIG_DIR
sudo rm -f $SSH_CONFIG_DIR/*

# Haupt-sshd_config aufräumen und Include setzen
warn "Passe die Haupt-sshd_config an..."

sudo tee $SSH_MAIN_CONFIG > /dev/null <<EOL
# Minimale SSHD-Konfiguration
Include $SSH_CONFIG_DIR/*.conf
EOL

# Benutzer abfragen, die sich per SSH anmelden dürfen
echo -en "${BLUE}Welche Benutzer dürfen sich per SSH anmelden? (Benutzer durch Leerzeichen trennen): ${RESET}"
read SSH_USERS

# Benutzer verifizieren und ggf. erstellen
VALID_USERS=""
for user in $SSH_USERS; do
    if id "$user" &>/dev/null; then
        log "Benutzer $user existiert."
        VALID_USERS+="$user "
    else
        echo -en "${BLUE}Benutzer $user existiert nicht. Soll dieser erstellt werden? ${YELLOW}[${WHITE}y/n${YELLOW}]${RESET}: "
        read CREATE_USER
        if [ "$CREATE_USER" == "y" ]; then
            sudo adduser $user
            sudo passwd $user
            sudo usermod -aG wheel $user
            log "Benutzer $user wurde erstellt und zur sudo-Gruppe hinzugefügt."

            # SSH-Verzeichnis und authorized_keys erstellen
            sudo mkdir -p /home/$user/.ssh
            sudo touch /home/$user/.ssh/authorized_keys
            sudo chown -R $user:$user /home/$user/.ssh
            sudo chmod 700 /home/$user/.ssh
            sudo chmod 600 /home/$user/.ssh/authorized_keys

            echo -en "${BLUE}Möchtest du einen SSH Public Key für $user hinzufügen? ${YELLOW}[${WHITE}y/n${YELLOW}]${RESET}: "
            read ADD_KEY
            if [ "$ADD_KEY" == "y" ]; then
                echo -en "${BLUE}Füge den SSH Public Key hier ein: ${RESET}"
                read SSH_KEY
                echo "$SSH_KEY" | sudo tee -a /home/$user/.ssh/authorized_keys
            fi
            VALID_USERS+="$user "
        fi
    fi
done

warn "Erstelle SSH-Konfigurationsdatei..."

sudo tee $SSH_CONFIG_FILE > /dev/null <<EOL
# SSH Config Datei mit max Security

AddressFamily inet
Port 22
Protocol 2

HostKey /etc/ssh/ssh_host_ed25519_key

AllowUsers $VALID_USERS
EOL

warn "Prüfe SSH-Konfiguration..."
sudo sshd -t && sudo systemctl restart sshd && log "SSH-Dienst erfolgreich neu gestartet."

log "Setup abgeschlossen! Nur folgende Benutzer dürfen sich per SSH anmelden: $VALID_USERS"