Ajout du guide PDF HestiaCP réutilisable (HestiaCP 1.10.4)
- 14 chapitres + annexe en Markdown (chapitres/), 99 étapes - Générateur WeasyPrint (build/build.py) : PDF générique ou personnalisé via --vars fichier.conf - PDF générique + PDF personnalisé srv1.skglobalinstitute.com - Commandes v-* vérifiées contre le code source HestiaCP 1.10.4 - 03-bis-hestiacp.md pointe vers le nouveau guide Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018J2PsVQ28oW4xEkWJpcU9G
This commit is contained in:
204
hestiacp/chapitres/04-securisation.md
Normal file
204
hestiacp/chapitres/04-securisation.md
Normal file
@@ -0,0 +1,204 @@
|
||||
# Sécuriser le serveur
|
||||
|
||||
À partir de maintenant, on travaille avec votre utilisateur {{USER}} et `sudo`, plus jamais en root direct. HestiaCP a déjà mis en place un pare-feu (iptables) et Fail2ban ; ce chapitre complète ce qu'il ne fait pas.
|
||||
|
||||
## Se connecter avec votre utilisateur
|
||||
|
||||
Depuis votre ordinateur :
|
||||
|
||||
```bash
|
||||
ssh {{USER}}@{{IP}}
|
||||
```
|
||||
|
||||
## Rendre les commandes HestiaCP utilisables avec sudo
|
||||
|
||||
Les commandes HestiaCP (`v-…`) sont dans `/usr/local/hestia/bin`, mais `sudo` ne cherche pas dans ce dossier. Sans ce réglage, `sudo v-list-users` répond « command not found ».
|
||||
|
||||
```bash
|
||||
echo 'Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/usr/local/hestia/bin"' | sudo tee /etc/sudoers.d/020-hestia-path
|
||||
sudo chmod 440 /etc/sudoers.d/020-hestia-path
|
||||
sudo visudo -c
|
||||
```
|
||||
|
||||
> [!CHECK]
|
||||
> `sudo v-list-users` affiche la liste des utilisateurs, dont {{ADMIN}}.
|
||||
|
||||
## Activer la double authentification du panel
|
||||
|
||||
Dans le panel, connecté en {{ADMIN}} :
|
||||
|
||||
1. Cliquez sur votre nom d'utilisateur en haut à droite (**Modifier l'utilisateur**).
|
||||
2. Cochez **Activer l'authentification à deux facteurs** et enregistrez.
|
||||
3. Scannez le QR code avec une application TOTP (Aegis, Google Authenticator, 2FAS…).
|
||||
4. **Notez le code de récupération** dans votre gestionnaire de mots de passe.
|
||||
|
||||
> [!TIP]
|
||||
> Si vous perdez votre téléphone, vous pouvez désactiver la double authentification en SSH avec `sudo v-delete-user-2fa {{ADMIN}}`.
|
||||
|
||||
## Fermer l'IPv6 entrante
|
||||
|
||||
Le pare-feu de HestiaCP ne gère **que l'IPv4**. En IPv6, le SSH et le panel (qui écoute aussi sur `[::]:{{PANEL_PORT}}`) seraient joignables sans pare-feu ni Fail2ban. Comme HestiaCP ne sert rien en IPv6, on bloque tout le trafic IPv6 entrant, sauf les réponses et l'ICMPv6, indispensable au fonctionnement de l'IPv6. Le serveur peut toujours sortir en IPv6.
|
||||
|
||||
Créez le script de pare-feu IPv6 :
|
||||
|
||||
```bash
|
||||
sudo tee /usr/local/sbin/ip6-firewall.sh > /dev/null << 'EOF'
|
||||
#!/bin/sh
|
||||
# Pare-feu IPv6 : HestiaCP ne filtre que l'IPv4.
|
||||
# Bloque tout l'entrant IPv6 sauf loopback, réponses et ICMPv6.
|
||||
ip6tables -P INPUT ACCEPT
|
||||
ip6tables -F INPUT
|
||||
ip6tables -A INPUT -i lo -j ACCEPT
|
||||
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
||||
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
|
||||
ip6tables -P INPUT DROP
|
||||
EOF
|
||||
sudo chmod 750 /usr/local/sbin/ip6-firewall.sh
|
||||
```
|
||||
|
||||
Puis le service qui l'applique à chaque démarrage :
|
||||
|
||||
```bash
|
||||
sudo tee /etc/systemd/system/ip6-firewall.service > /dev/null << 'EOF'
|
||||
[Unit]
|
||||
Description=Pare-feu IPv6 (entrant bloque)
|
||||
DefaultDependencies=no
|
||||
Wants=network-pre.target
|
||||
Before=network-pre.target
|
||||
After=local-fs.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/local/sbin/ip6-firewall.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now ip6-firewall.service
|
||||
```
|
||||
|
||||
> [!CHECK]
|
||||
> `sudo ip6tables -S INPUT` commence par `-P INPUT DROP`. Depuis votre ordinateur, si vous avez l'IPv6, `ssh -6 {{USER}}@{{IPV6}}` ne doit **pas** répondre, alors que `ssh {{USER}}@{{IP}}` fonctionne toujours.
|
||||
|
||||
## Changer le port SSH (1/2) : ouvrir le nouveau port
|
||||
|
||||
On procède en deux temps pour ne jamais se retrouver bloqué dehors : d'abord SSH écoute sur **les deux ports**, puis on ferme le port 22.
|
||||
|
||||
Le fichier commence par `00-` pour passer avant les fichiers de cloud-init : pour un même réglage, OpenSSH garde la première valeur lue.
|
||||
|
||||
```bash
|
||||
sudo tee /etc/ssh/sshd_config.d/00-securite.conf > /dev/null << 'EOF'
|
||||
Port 22
|
||||
Port {{SSH_PORT}}
|
||||
EOF
|
||||
sudo sshd -t && echo "Configuration SSH valide"
|
||||
```
|
||||
|
||||
Ubuntu 24.04 démarre SSH à la demande via `ssh.socket` : il faut recharger systemd pour que le nouveau port soit pris en compte.
|
||||
|
||||
```bash
|
||||
systemctl is-active ssh.socket
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart ssh.socket
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Si `systemctl is-active ssh.socket` répond `inactive`, votre image utilise le service classique : remplacez les deux dernières lignes par `sudo systemctl restart ssh`.
|
||||
|
||||
Mettez à jour le pare-feu HestiaCP. Il détecte tout seul les ports SSH et met à jour sa règle « SSH » et Fail2ban :
|
||||
|
||||
```bash
|
||||
sudo v-update-firewall
|
||||
sudo v-list-sys-sshd-port
|
||||
sudo v-list-firewall | grep SSH
|
||||
```
|
||||
|
||||
> [!CHECK]
|
||||
> `v-list-sys-sshd-port` affiche `22` et {{SSH_PORT}} ; la règle SSH du pare-feu contient `22,{{SSH_PORT}}`. Dans un **nouveau terminal**, `ssh -p {{SSH_PORT}} {{USER}}@{{IP}}` fonctionne.
|
||||
|
||||
## Changer le port SSH (2/2) : fermer le port 22 et durcir
|
||||
|
||||
Seulement après avoir réussi la connexion sur le port {{SSH_PORT}}. On ferme le port 22, on interdit la connexion root et on n'accepte plus que les clés SSH :
|
||||
|
||||
```bash
|
||||
sudo tee /etc/ssh/sshd_config.d/00-securite.conf > /dev/null << 'EOF'
|
||||
Port {{SSH_PORT}}
|
||||
PermitRootLogin no
|
||||
PasswordAuthentication no
|
||||
KbdInteractiveAuthentication no
|
||||
PubkeyAuthentication yes
|
||||
EOF
|
||||
sudo sshd -t && sudo systemctl daemon-reload && sudo systemctl restart ssh.socket
|
||||
sudo v-update-firewall
|
||||
```
|
||||
|
||||
> [!DANGER] Gardez votre session ouverte
|
||||
> Ne fermez pas le terminal actuel. Testez dans un nouveau terminal : `ssh -p {{SSH_PORT}} {{USER}}@{{IP}}` doit fonctionner, et `ssh root@{{IP}} -p {{SSH_PORT}}` doit être refusé. En cas de problème, la console VNC du panel Contabo permet toujours de se connecter.
|
||||
|
||||
> [!CHECK]
|
||||
> `sudo sshd -T | grep -E "^(port|permitrootlogin|passwordauthentication)"` affiche `port {{SSH_PORT}}`, `permitrootlogin no` et `passwordauthentication no`.
|
||||
|
||||
Sur votre ordinateur, ajoutez un raccourci dans `~/.ssh/config` :
|
||||
|
||||
```text
|
||||
Host {{HOST}}
|
||||
HostName {{IP}}
|
||||
Port {{SSH_PORT}}
|
||||
User {{USER}}
|
||||
```
|
||||
|
||||
Il suffira ensuite de taper `ssh {{HOST}}`.
|
||||
|
||||
## Vérifier le pare-feu et Fail2ban
|
||||
|
||||
```bash
|
||||
sudo v-list-firewall
|
||||
sudo fail2ban-client status
|
||||
```
|
||||
|
||||
Ports ouverts par HestiaCP : ping, {{PANEL_PORT}} (panel), 80/443 (web), 25/465/587 (SMTP), 143/993 (IMAP), 110/995 (POP3), 53 TCP/UDP (DNS) et {{SSH_PORT}} (SSH).
|
||||
|
||||
Prisons Fail2ban actives : `ssh-iptables`, `exim-iptables`, `dovecot-iptables`, `hestia-iptables` (panel), `phpmyadmin-auth` et `recidive`. Une IP bannie 5 fois en une journée est bloquée 10 jours sur tous les ports.
|
||||
|
||||
> [!TIP] Débannir une IP (la vôtre, par exemple)
|
||||
> `sudo v-list-firewall-ban` affiche les IP bannies. `sudo v-delete-firewall-ban <IP> ALL` débannit une IP partout.
|
||||
|
||||
> [!WARNING] Ne réactivez jamais UFW
|
||||
> HestiaCP et UFW se marchent dessus. Toute règle se gère dans le panel (**roue dentée › Pare-feu**) ou avec `v-add-firewall-rule`.
|
||||
|
||||
## Cacher phpMyAdmin
|
||||
|
||||
phpMyAdmin est accessible sur **tous** vos domaines à l'adresse `/phpmyadmin`, que les robots testent en permanence. Remplacez ce chemin par un nom difficile à deviner :
|
||||
|
||||
```bash
|
||||
sudo v-change-sys-db-alias pma gestion-bdd-7f3k9
|
||||
```
|
||||
|
||||
phpMyAdmin sera alors accessible sur `https://{{FQDN}}/gestion-bdd-7f3k9/`. Choisissez votre propre suffixe.
|
||||
|
||||
## Vérifier les mises à jour automatiques
|
||||
|
||||
Deux mécanismes complémentaires :
|
||||
|
||||
- **unattended-upgrades** (Ubuntu) installe chaque jour les correctifs de sécurité du système ;
|
||||
- **HestiaCP** se met à jour lui-même chaque nuit (tâche `v-update-sys-hestia-all`).
|
||||
|
||||
```bash
|
||||
systemctl is-enabled unattended-upgrades
|
||||
cat /etc/apt/apt.conf.d/20auto-upgrades
|
||||
sudo v-list-sys-hestia-autoupdate
|
||||
```
|
||||
|
||||
> [!CHECK]
|
||||
> `enabled` ; les deux lignes `APT::Periodic` valent `"1"` ; l'autoupdate HestiaCP est `Enabled`.
|
||||
|
||||
Si `20auto-upgrades` n'existe pas :
|
||||
|
||||
```bash
|
||||
sudo dpkg-reconfigure -plow unattended-upgrades
|
||||
```
|
||||
|
||||
> [!NOTE] Mises à jour manuelles
|
||||
> Pour PHP, Nginx et MariaDB, qui viennent de dépôts externes, lancez de temps en temps `sudo apt update && sudo apt upgrade`. Si apt demande quoi faire d'un fichier de configuration modifié, répondez toujours **garder la version actuelle** (N).
|
||||
Reference in New Issue
Block a user