diff --git a/Linux/SSH/secure_ssh.sh b/Linux/SSH/secure_ssh.sh index 1d72892..bdee185 100644 --- a/Linux/SSH/secure_ssh.sh +++ b/Linux/SSH/secure_ssh.sh @@ -7,6 +7,7 @@ SSH_MAIN_CONFIG="/etc/ssh/sshd_config" SSH_CONFIG_FILE="$SSH_CONFIG_DIR/secure.conf" ED25519_KEY="/etc/ssh/ssh_host_ed25519_key" ECDSA_KEY="/etc/ssh/ssh_host_ecdsa_key" +RSA_KEY="/etc/ssh/ssh_host_rsa_key" # Hinzugefügt für Kompatibilität mit älteren Clients # Farben für bessere Lesbarkeit RED='\033[1;31m' @@ -177,6 +178,16 @@ install_package() { return 1 } +# Funktion zur Erkennung der OpenSSH-Version +detect_openssh_version() { + if command -v ssh -V &> /dev/null; then + local version_output=$(ssh -V 2>&1) + echo "$version_output" | grep -oP 'OpenSSH_\K[0-9]+\.[0-9]+' | head -1 + else + echo "unknown" + fi +} + # Erkennung des Service-Managers SERVICE_MANAGER=$(detect_service_manager) log "Erkannter Service-Manager: $SERVICE_MANAGER" @@ -235,6 +246,12 @@ else log "OpenSSH-Server ist bereits installiert." fi +# Erkennen der OpenSSH-Version +SSH_VERSION=$(detect_openssh_version) +if [ "$SSH_VERSION" != "unknown" ]; then + log "Erkannte OpenSSH-Version: $SSH_VERSION" +fi + # Stelle sicher, dass das Konfigurationsverzeichnis existiert if [ ! -d "$SSH_CONFIG_DIR" ]; then warn "SSH Konfigurationsverzeichnis existiert nicht. Es wird erstellt..." @@ -271,6 +288,21 @@ else log "Host-Schlüssel ssh_host_ecdsa_key ist bereits vorhanden." fi +# Prüfe auf RSA-Schlüssel für die Kompatibilität +if [ ! -f "$RSA_KEY" ]; then + warn "Host-Schlüssel fehlt. Generiere ssh_host_rsa_key für Kompatibilität..." + if sudo ssh-keygen -t rsa -b 4096 -f "$RSA_KEY" -N "" &> /dev/null; then + sudo chown root:root "$RSA_KEY" + sudo chmod 600 "$RSA_KEY" + log "Host-Schlüssel ssh_host_rsa_key wurde erstellt." + else + error "Fehler beim Erstellen des Host-Schlüssels." + # Kein Exit hier, da RSA optional ist + fi +else + log "Host-Schlüssel ssh_host_rsa_key ist bereits vorhanden." +fi + # Konfiguriere SSH für die Include-Direktive warn "Setze /etc/ssh/sshd_config zurück auf Include-Direktive..." sudo tee "$SSH_MAIN_CONFIG" > /dev/null < /dev/null < /dev/null < /dev/null < /dev/null # X11-Weiterleitung deaktivieren (falls nicht benötigt) X11Forwarding no +# TCP-Weiterleitung deaktivieren +AllowTcpForwarding no +GatewayPorts no + +# Verhindern von Tunnel-Nutzung +PermitTunnel no + +# Verhindern von SSH-Agent-Forwarding (wenn nicht benötigt) +AllowAgentForwarding no + +# Banner-Anzeige deaktivieren (keine Systeminfo für potenzielle Angreifer) +Banner none + +# Deaktiviere .rhosts Dateien +IgnoreRhosts yes +HostbasedAuthentication no + # Pfad zur Authorized Keys-Datei AuthorizedKeysFile .ssh/authorized_keys @@ -518,7 +633,17 @@ Subsystem sftp $SFTP_PATH ClientAliveInterval 300 ClientAliveCountMax 2 +# Kompression deaktivieren (Schutz vor CRIME/BREACH-ähnlichen Angriffen) +Compression no + +# Erlaubte Benutzer festlegen AllowUsers $VALID_USERS + +# Trendchecking aktivieren für verdächtige Aktivitäten +DebianBanner no + +# Anzeige der letzten Anmeldung deaktivieren +PrintLastLog no EOL log "Prüfe SSH-Konfiguration..." @@ -532,65 +657,25 @@ if [ ! -d /run/sshd ]; then log "/run/sshd wurde erstellt." fi - -# Überprüfe, ob die Konfiguration gültig ist -if command -v sshd &> /dev/null; then - if ! sudo sshd -t &> /dev/null; then - error "Die SSH-Konfiguration enthält Fehler! Überprüfe die Konfiguration manuell." - exit 1 - else - log "SSH-Konfiguration ist gültig." +# Erstelle oder modifiziere die Datei /etc/hosts.deny für zusätzliche Sicherheit +if [ -f "/etc/hosts.deny" ]; then + # Prüfe, ob SSHD bereits in hosts.deny vorhanden ist + if ! grep -q "sshd" /etc/hosts.deny; then + echo "sshd: ALL" | sudo tee -a /etc/hosts.deny > /dev/null + log "SSHD-Eintrag zu /etc/hosts.deny hinzugefügt." fi +else + echo "sshd: ALL" | sudo tee /etc/hosts.deny > /dev/null + log "Datei /etc/hosts.deny mit SSHD-Eintrag erstellt." fi -# Erkenne den SSH-Dienst und starte ihn neu -SSH_SERVICE=$(detect_ssh_service "$SERVICE_MANAGER") - -if [ "$SSH_SERVICE" == "unknown" ]; then - error "Kein SSH-Dienst gefunden. Bitte überprüfe deine Installation." - exit 1 -fi - -log "Erkannter SSH-Dienst: $SSH_SERVICE" - -if ! restart_ssh_service "$SERVICE_MANAGER" "$SSH_SERVICE"; then - error "Fehler beim Neustart des SSH-Dienstes. Versuche einen alternativen Ansatz..." +# Erstelle oder modifiziere die Datei /etc/hosts.allow für vertrauenswürdige IPs +echo -en "${BLUE}Möchtest du bestimmte IP-Adressen explizit für SSH zulassen? ${YELLOW}[${WHITE}y/n${YELLOW}]${RESET}: " +read ADD_ALLOWED_IPS +if [ "$ADD_ALLOWED_IPS" == "y" ]; then + echo -en "${BLUE}Gib vertrauenswürdige IP-Adressen ein (durch Leerzeichen getrennt, z.B. 192.168.1.10 10.0.0.5): ${RESET}" + read ALLOWED_IPS - # Fallback-Versuche für verschiedene Distributionen - if [ "$SERVICE_MANAGER" == "systemd" ]; then - # Versuche alle möglichen Dienste bei systemd - for service in sshd ssh openssh openssh-server; do - if sudo systemctl restart "$service" 2>/dev/null; then - log "SSH-Dienst ($service) erfolgreich neu gestartet." - exit 0 - fi - done - elif [ "$SERVICE_MANAGER" == "sysvinit" ]; then - # Versuche alle möglichen Dienste bei sysvinit - for service in sshd ssh openssh openssh-server; do - if sudo service "$service" restart 2>/dev/null; then - log "SSH-Dienst ($service) erfolgreich neu gestartet." - exit 0 - fi - done - elif [ "$SERVICE_MANAGER" == "openrc" ]; then - # Versuche alle möglichen Dienste bei OpenRC - for service in sshd ssh openssh openssh-server; do - if sudo rc-service "$service" restart 2>/dev/null; then - log "SSH-Dienst ($service) erfolgreich neu gestartet." - exit 0 - fi - done - fi - - # Als letzte Möglichkeit, versuche einen Kill/HUP-Signal an sshd zu senden - if pgrep sshd &>/dev/null && sudo killall -HUP sshd; then - log "SSH-Dienst durch Signal neu gestartet." - else - error "Konnte den SSH-Dienst nicht neu starten. Bitte starte den SSH-Dienst manuell neu." - exit 1 - fi -fi - -log "Setup abgeschlossen! Nur folgende Benutzer dürfen sich per SSH anmelden: ${WHITE}$VALID_USERS" -log "Die SSH-Konfiguration wurde für maximale Sicherheit optimiert." \ No newline at end of file + if [ -n "$ALLOWED_IPS" ]; then + FORMATTED_IPS=$(echo "$ALLOWED_IPS" | tr ' ' ',') + echo "sshd: $FORMATTED_IPS : allow" | sudo tee -a /etc/hosts.allow > /dev/null \ No newline at end of file