Aller au contenu

Sécurité - SSL, Authentification et Bonnes Pratiques

Vue d'ensemble

Configuration de sécurité multi-couches pour protéger les services du serveur srv759970.

SSL/TLS avec Let's Encrypt

Certificats actifs (mai 2026)

Certbot gère le renouvellement automatique via systemd timer. Vérifier avec certbot certificates.

Services avec certificats actifs : dashy, docs, mail, webmail, calendar, analytics, portainer, glances, cooking, packages, jokers, audioguides, tts, stt, rag (claudito), lobehub, calatea-coaching.fr, solidarlink, incluzhact.fr, panneauxsolidaires.fr

Les certificats des services supprimés (monitoring/Grafana, whisperx, dozzle, faster-whisper, neutts, ragflow, etc.) ont expiré ou ont été révoqués. Supprimer les configs nginx stale correspondantes.

Création d'un nouveau certificat

certbot certonly --nginx \
  -d <subdomain>.srv759970.hstgr.cloud \
  --non-interactive \
  --agree-tos \
  -m julien@julienfernandez.xyz

Configuration SSL Nginx

ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

Renouvellement automatique

# Vérifier le timer
systemctl status certbot.timer

# Renouvellement manuel
certbot renew

# Vérifier les certificats
certbot certificates

Authentification

Basic Auth Nginx

Configuration pour services internes (dashy, portainer, glances, lobehub, mail admin).

Snippet réutilisable

/etc/nginx/snippets/basic-auth.conf

auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;

Gestion des credentials

# Ajouter/modifier un utilisateur
htpasswd /etc/nginx/.htpasswd julien
systemctl reload nginx

# Lister les utilisateurs
cat /etc/nginx/.htpasswd

Services protégés vs publics (mai 2026)

Protégés par Basic Auth : - Dashy (dashy.srv759970.hstgr.cloud) - Portainer (portainer.srv759970.hstgr.cloud) - Glances (glances.srv759970.hstgr.cloud) - LobeHub (lobehub.srv759970.hstgr.cloud) - Mail admin (mail.srv759970.hstgr.cloud)

Publics (pas de Basic Auth) : - MkDocs Documentation (docs.srv759970.hstgr.cloud) - Audioguides (audioguides.srv759970.hstgr.cloud) - Sites clients (calatea-coaching.fr, incluzhact.fr, solidarlink, etc.)

Pare-feu (UFW)

Ports ouverts

ufw allow 22/tcp    # SSH
ufw allow 80/tcp    # HTTP
ufw allow 443/tcp   # HTTPS
ufw enable

Logs et Audit

Logs Nginx

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

Logs Docker

Via Portainer (logs tab) ou en ligne de commande :

docker logs <container_name>
docker logs -f --tail 50 <container_name>

SSH Hardening

Configuration recommandée

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

Fail2ban & nftables

Vue d'ensemble

Fail2ban est installé et actif avec 6 jails. Il utilise nftables (pas iptables) comme mécanisme de ban.

Jails actifs

Jail Filter Ports Max Retry Ban Time Purpose
sshd sshd 22 5 10min SSH brute-force
nginx-http-auth nginx-401 80,443 5 1h Nginx basic auth failures
opcode-auth nginx-401 80,443 5 1h 401 responses (sites protégés)
wordpress-auth wordpress-auth 80,443 5 1h WP login brute-force
wordpress-hard wordpress-hard 80,443 3 2h WP recon attacks
wordpress-xmlrpc wordpress-xmlrpc 80,443 2 1h XML-RPC abuse

ATTENTION: Le jail opcode-auth bannit les IPs qui recoivent trop de réponses 401. Accéder à un site protégé sans credentials = risque de ban !

Configuration

# Fichier principal
/etc/fail2ban/jail.local

# Whitelist (ignoreip)
ignoreip = 127.0.0.1/8 ::1 176.190.166.155 91.164.176.204

Commandes utiles

# Status
fail2ban-client status
fail2ban-client status opcode-auth

# Voir IPs bannies (nftables)
nft list set inet f2b-table addr-set-opcode-auth

# Débannir une IP
nft delete element inet f2b-table addr-set-opcode-auth { 1.2.3.4 }
fail2ban-client unban 1.2.3.4

# Ajouter à whitelist
# Éditer /etc/fail2ban/jail.local, ajouter IP à ignoreip
fail2ban-client reload

Troubleshooting: Port 443 bloqué intermittent

Si le site marche puis timeout après quelques minutes:

  1. Cause probable: IP bannie par fail2ban (trop de 401)
  2. Diagnostic: nft list ruleset | grep TON_IP
  3. Fix: nft delete element inet f2b-table addr-set-opcode-auth { TON_IP }
  4. Prévention: Ajouter IP à ignoreip dans jail.local

Checklist Sécurité

✅ Implémenté:

  • Certificats SSL valides
  • Renouvellement auto configuré
  • Force HTTPS sur tous les services
  • Basic Auth sur services sensibles
  • UFW configuré
  • Services internes sur 127.0.0.1
  • Fail2ban installé (6 jails actifs)
  • nftables comme banaction

⚠️ Recommandations:

  • Configurer alertes Grafana
  • Backup automatique quotidien
  • Rate limiting sur API endpoints

Ressources