Files
Boilerplates/Linux/SSH/README.md
2025-05-04 16:58:23 +00:00

273 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Color Scheme ausführen
```bash
curl -s https://gitea.glaeser-it.de/WirFixenAlles/Boilerplates/raw/branch/main/Linux/SSH/colorscheme.sh | bash
```
# 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
```bash
#!/bin/bash
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"
ECDSA_KEY="/etc/ssh/ssh_host_ecdsa_key"
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
WHITE='\033[1;37m'
RESET='\033[0m'
log() {
echo -e "${GREEN}$1${RESET}"
}
warn() {
echo -e "${YELLOW}$1${RESET}"
}
error() {
echo -e "${RED}$1${RESET}"
}
install_package() {
local package=$1
local cmd=$2
warn "Installiere $package..."
if eval "$cmd" &> /dev/null; then
log "$package wurde erfolgreich installiert."
else
error "Fehler bei der Installation von $package."
exit 1
fi
}
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
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
if [ ! -f "$ED25519_KEY" ]; then
warn "Host-Schlüssel fehlt. Generiere ssh_host_ed25519_key..."
if sudo ssh-keygen -t ed25519 -f "$ED25519_KEY" -N "" &> /dev/null; then
sudo chown root:root "$ED25519_KEY"
sudo chmod 600 "$ED25519_KEY"
log "Host-Schlüssel ssh_host_ed25519_key wurde erstellt."
else
error "Fehler beim Erstellen des Host-Schlüssels."
exit 1
fi
else
log "Host-Schlüssel ssh_host_ed25519_key ist bereits vorhanden."
fi
if [ ! -f "$ECDSA_KEY" ]; then
warn "Host-Schlüssel fehlt. Generiere ssh_host_ecdsa_key..."
if sudo ssh-keygen -t ecdsa -b 384 -f "$ECDSA_KEY" -N "" &> /dev/null; then
sudo chown root:root "$ECDSA_KEY"
sudo chmod 600 "$ECDSA_KEY"
log "Host-Schlüssel ssh_host_ecdsa_key wurde erstellt."
else
error "Fehler beim Erstellen des Host-Schlüssels."
exit 1
fi
else
log "Host-Schlüssel ssh_host_ecdsa_key ist bereits vorhanden."
fi
sudo rm -f $SSH_CONFIG_DIR/*
echo "Include $SSH_CONFIG_DIR/*" | sudo tee $SSH_MAIN_CONFIG > /dev/null
echo -en "${BLUE}Welche Benutzer dürfen sich per SSH anmelden? (Benutzer durch ${WHITE}Leerzeichen${BLUE} trennen): ${RESET}"
read SSH_USERS
VALID_USERS=""
# Bestimme die sudo-Gruppe abhängig von der Distribution
if [ -f /etc/os-release ]; then
. /etc/os-release
case "$ID" in
ubuntu|debian)
SUDO_GROUP="sudo"
;;
centos|fedora|rhel|almalinux|rocky)
SUDO_GROUP="wheel"
;;
arch|manjaro)
SUDO_GROUP="wheel"
;;
*)
SUDO_GROUP="sudo" # Fallback auf "sudo"
;;
esac
else
SUDO_GROUP="sudo" # Fallback falls os-release nicht existiert
fi
for user in $SSH_USERS; do
if id "$user" &>/dev/null; then
log "Benutzer $user existiert."
VALID_USERS+="$user "
else
echo -en "${BLUE}Benutzer ${WHITE}$user${BLUE} existiert nicht. Soll dieser erstellt werden? ${YELLOW}[${WHITE}y/n${YELLOW}]${RESET}: "
read CREATE_USER
echo -en "${BLUE}Gib ein Passwort für ${WHITE}$user${BLUE} ein: ${RESET}"
read -s USER_PASSWORD
echo
if [ "$CREATE_USER" == "y" ]; then
if sudo adduser --disabled-password --gecos "" "$user" &>/dev/null && echo "$user:$USER_PASSWORD" | sudo chpasswd &>/dev/null && sudo usermod -aG $SUDO_GROUP "$user" &>/dev/null; then
log "Benutzer $user wurde erstellt und zur $SUDO_GROUP-Gruppe hinzugefügt."
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 ${WHITE}$user${BLUE} 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 &> /dev/null
fi
VALID_USERS+="$user "
else
error "Fehler bei der Erstellung von Benutzer $user."
fi
fi
fi
done
warn "Erstelle SSH-Konfigurationsdatei..."
sudo tee $SSH_CONFIG_FILE > /dev/null <<EOL
# SSHD Config Maximale Sicherheit (Nur IPv4)
# Nur IPv4-Verbindungen
AddressFamily inet
# Standardport (22), kann bei Bedarf geändert werden
Port 22
# Nur Protokoll 2 zulassen (Protokoll 1 ist unsicher)
Protocol 2
# Host-Schlüssel (nur moderne Schlüssel)
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_ecdsa_key
# Sichere Key Exchange-Algorithmen (Kex)
KexAlgorithms curve25519-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,diffie-hellman-group14-sha256
# Sichere Ciphers (Chiffren)
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
# Sichere MAC-Algorithmen
MACs hmac-sha2-512,hmac-sha2-256
# Log-Einstellungen
SyslogFacility AUTHPRIV
LogLevel VERBOSE
# Maximale Login-Wartezeit
LoginGraceTime 30s
# Root-Login verbieten
PermitRootLogin no
# Nur Schlüssel-Authentifizierung erlauben
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
# PAM für zusätzliche Sicherheitsmodule verwenden
UsePAM yes
# X11-Weiterleitung deaktivieren (falls nicht benötigt)
X11Forwarding no
# Kein MOTD durch SSH (über PAM regeln)
PrintMotd no
# Pfad zur Authorized Keys-Datei
AuthorizedKeysFile .ssh/authorized_keys
# SFTP-Subsystem (Standard)
Subsystem sftp /usr/lib/openssh/sftp-server
# Inaktive SSH-Sitzungen überwachen und beenden
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers $VALID_USERS
EOL
log "Prüfe SSH-Konfiguration..."
# Überprüfe, ob der Dienst 'ssh' oder 'sshd' existiert und starte ihn
if systemctl list-units --type=service | grep -q "ssh"; then
SERVICE_NAME="ssh"
elif systemctl list-units --type=service | grep -q "sshd"; then
SERVICE_NAME="sshd"
else
error "Kein SSH-Dienst gefunden."
exit 1
fi
if sudo systemctl restart $SERVICE_NAME; then
log "SSH-Dienst erfolgreich neu gestartet."
else
error "Fehler beim Neustart des SSH-Dienstes."
exit 1
fi
log "Setup abgeschlossen! Nur folgende Benutzer dürfen sich per SSH anmelden: ${WHITE}$VALID_USERS"
```