# Hetzner VPS Setup

> Vom leeren Server zur abgesicherten, produktionsreifen Maschine. Wählen Sie aus, wie Sie Ihren Server konfigurieren möchten.

:::tabs
=== Automatisch (AI)
### Automatische Einrichtung per KI
Gewähren Sie Ihrem KI-Assistenten Zugriff auf dieses Repository. Er führt automatisch alle Prüfungen durch, konfiguriert die Sicherheit und generiert eine Datei mit allen Zugangsdaten (Credentials Guide) auf Ihrem Computer.

[GitHub-Repository öffnen](https://github.com/orlovvugorivzai/vps-hetzner-setup-by-orlov)

=== Manuell
### Variablen vorbereiten
In den folgenden Befehlen müssen Sie Ihre eigenen Werte anstelle der Platzhalter in geschweiften Klammern einsetzen:

- `{username}` — Name Ihres regulären Benutzers (z. B. `dev`)
- `{nickname}` — Kurzbezeichnung des Servers zur besseren Handhabung (z. B. `hetzner-main`)
- `{SERVER_IP}` — Öffentliche IP-Adresse Ihres neuen Servers

:::

## 1. SSH-Schlüssel erstellen (Lokal)
Wird auf **Ihrem lokalen Computer** (Mac oder Linux) ausgeführt, BEVOR Sie sich mit dem Server verbinden.

```bash
ssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""
cat ~/.ssh/{nickname}_key.pub
```

Kopieren Sie die Ausgabe des zweiten Befehls (beginnt mit `ssh-ed25519 ...`). Dies ist Ihr öffentlicher Schlüssel.

## 2. Anmeldung als Root
Verbinden Sie sich mit dem Server unter Verwendung des Passworts, das Hetzner Ihnen per E-Mail zugesandt hat.

> [!WARNING]
> Hetzner kann Sie auffordern, das Passwort zu ändern. Geben Sie das aktuelle Passwort ein, gefolgt von zweimal das neue temporäre Passwort. Falls die Verbindung danach abbricht, melden Sie sich einfach erneut mit dem neuen Passwort an.

```bash
ssh root@{SERVER_IP}
```

## 3. Systemaktualisierung
Aktualisieren aller Pakete im nicht-interaktiven Modus (ohne GRUB-Popup-Fenster).

```bash
apt update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt upgrade -y
```

## 4. Benutzer mit sudo-Rechten erstellen
Die Arbeit als root ist unsicher. Wir erstellen einen regulären Benutzer und verleihen ihm Administratorrechte.

```bash
useradd -m -s /bin/bash {username}
echo "{username}:YOUR_SECURE_PASSWORD" | chpasswd
usermod -aG sudo {username}
```

## 5. Deployment des SSH-Schlüssels
Wir schreiben Ihren öffentlichen Schlüssel, den Sie in Schritt 1 kopiert haben, auf den Server.

```bash
mkdir -p /home/{username}/.ssh
echo "{PUBLIC_KEY_CONTENT}" > /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.ssh
```

## 6. Login-Überprüfung
> [!IMPORTANT]
> **VERPFLICHTENDER CHECKPOINT**
> Schließen Sie die root-Sitzung NICHT! Öffnen Sie ein neues Terminalfenster auf Ihrem PC und versuchen Sie, sich über den Schlüssel anzumelden. Erst nach erfolgreichem Login können Sie fortfahren.

Prüfen Sie, ob `sudo` funktioniert (das System sollte nach dem Passwort fragen, das Sie in Schritt 4 festgelegt haben, und "root" ausgeben):

```bash
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}
sudo whoami
```

## 7. Firewall (UFW)
Führen Sie alle folgenden Befehle als Ihr neuer Benutzer aus (mit sudo). Wir konfigurieren die Richtlinie „Alle eingehenden Verbindungen blockieren, außer SSH, HTTP und HTTPS“.

```bash
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status
```

## 8. Kernel-Härtung (sysctl)
Anwendung von Parametern zum Schutz vor Netzwerkangriffen.

```bash
sudo tee /etc/sysctl.d/99-security.conf << 'EOF'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-security.conf
```

## 9. Basispakete und Zeit
Eine präzise Zeit ist kritisch für Logs, SSL-Zertifikate und fail2ban.

```bash
sudo apt install -y chrony curl wget git unzip net-tools
sudo systemctl enable chrony
```

## 10. Lokale SSH-Konfiguration
Einrichtung eines Shortcuts **auf Ihrem lokalen PC**, damit Sie sich künftig mit dem kurzen Befehl `ssh {nickname}` verbinden können.

```bash
mkdir -p ~/.ssh && touch ~/.ssh/config && chmod 600 ~/.ssh/config
cat >> ~/.ssh/config << 'EOF'

Host {nickname}
    HostName {SERVER_IP}
    User {username}
    IdentityFile ~/.ssh/{nickname}_key
    IdentitiesOnly yes
EOF
```

## 11. Sicherheitsüberprüfung
Stellen Sie sicher, dass der Shortcut vom lokalen PC aus funktioniert und die grundlegenden Schutzmechanismen aktiviert sind.

```bash
ssh {nickname}
sudo ufw status
sysctl net.ipv4.tcp_syncookies
```

## 12. Abschließende Absicherung
Installation von Schutz gegen Brute-Force-Angriffe (fail2ban) sowie endgültige Deaktivierung der Passwort-Login-Methode und des root-Logins.

```bash
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo tee /etc/ssh/sshd_config.d/99-hardening.conf << 'EOF'
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
EOF
sudo sshd -t && sudo systemctl restart ssh
```

> [!TIP]
> Fertig! Der Server ist vollständig eingerichtet und abgesichert.