# Configuration de VPS Hetzner

> D'un serveur vide à une machine prête pour la production et sécurisée. Choisissez comment vous souhaitez configurer votre serveur.

:::tabs
=== Automatique (AI)
### Configuration automatique via AI
Accordez à votre assistant AI l'accès à ce dépôt. Il effectuera automatiquement tous les contrôles, configurera la sécurité et générera un fichier contenant tous les accès (credentials guide) sur votre ordinateur.

[Ouvrir le Dépôt GitHub](https://github.com/orlovvugorivzai/vps-hetzner-setup-by-orlov)

=== Manuel
### Préparation des variables
Dans les commandes ci-dessous, vous devrez remplacer les accolades par vos propres valeurs :

- `{username}` — le nom de votre utilisateur standard (ex. `dev`)
- `{nickname}` — un nom court pour le serveur par commodité (ex. `hetzner-main`)
- `{SERVER_IP}` — l'adresse IP publique de votre nouveau serveur

:::

## 1. Création d'une clé SSH (Localement)
À exécuter sur **votre ordinateur** (Mac ou Linux) AVANT de vous connecter au serveur.

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

Copiez la sortie de la deuxième commande (elle commence par `ssh-ed25519 ...`). C'est votre clé publique.

## 2. Connexion en tant que Root
Connectez-vous au serveur avec le mot de passe envoyé par Hetzner par e-mail.

> [!WARNING]
> Hetzner peut demander un changement de mot de passe. Entrez le mot de passe actuel, puis deux fois le nouveau mot de passe temporaire. Si la connexion est interrompue après cela, reconnectez-vous simplement avec le nouveau mot de passe.

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

## 3. Mise à jour du système
Mise à jour de tous les paquets en mode non interactif (sans fenêtres pop-up grub).

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

## 4. Création d'un utilisateur avec sudo
Travailler sous root est dangereux. Nous créons un utilisateur standard et lui accordons les droits administrateur.

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

## 5. Déploiement de la clé SSH
Nous allons enregistrer votre clé publique, copiée à l'étape 1, sur le serveur.

```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. Vérification de la connexion
> [!IMPORTANT]
> **CHECKPOINT OBLIGATOIRE**
> Ne fermez pas la session root ! Ouvrez une nouvelle fenêtre de terminal sur votre PC et essayez de vous connecter via la clé. Vous ne pouvez continuer qu'après une connexion réussie.

Vérifiez si `sudo` fonctionne (le système doit demander le mot de passe défini à l'étape 4 et afficher "root") :

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

## 7. Firewall (UFW)
Exécutez toutes les commandes suivantes en tant que votre nouvel utilisateur (avec sudo). Nous configurons la politique « tout refuser entrant, sauf SSH, HTTP et 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. Protection du noyau (sysctl)
Application des paramètres pour se protéger contre les attaques réseau.

```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. Paquets de base et heure
Une heure précise est critique pour les logs, les certificats SSL et fail2ban.

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

## 10. Configuration SSH locale
Configuration d'un raccourci **sur votre PC local** pour vous connecter ultérieurement avec la commande courte `ssh {nickname}`.

```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. Vérification de la sécurité
Vérifiez si la commande courte fonctionne depuis le PC local et si les protections de base sont activées.

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

## 12. Verrouillage final
Installation de la protection contre le brute-force (fail2ban) et interdiction définitive de la connexion par mot de passe et de la connexion root.

```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]
> Terminé ! Le serveur est entièrement configuré et sécurisé.