Documentation — DataLab0Page 33 / 36 — Domaine, HTTPS et sécurité de base — appv2dev.datalab0.com · v00001 · b00005

Domaine, HTTPS et sécurité de base — appv2dev.datalab0.com

Contexte validé

Le déploiement public validé utilise :

Domaine DEV : appv2dev.datalab0.com
IP publique Proxmox : 147.135.131.39
VM privée Ubuntu : 192.168.100.10
Accès SSH : port public 2222 -> VM 22
Accès HTTPS : ports publics 80/443 -> VM 80/443

Le domaine DEV permet d’éviter l’accès brut par IP et prépare une séparation propre entre environnements :

appv2dev.datalab0.com      -> environnement DEV
appv2.datalab0.com         -> futur environnement PROD éventuel
appv2staging.datalab0.com  -> futur environnement STAGING éventuel

DNS OVH

L’enregistrement DNS ajouté pour le DEV est :

appv2dev        IN A     147.135.131.39

Test DNS :

nslookup appv2dev.datalab0.com

Résultat attendu :

Name:   appv2dev.datalab0.com
Address: 147.135.131.39

Reverse proxy HTTPS

Le HTTPS est géré par Nginx Proxy Manager, installé dans la même VM Docker que l’application.

Architecture :

Internet
  ↓
https://appv2dev.datalab0.com
  ↓
IP publique Proxmox 147.135.131.39:443
  ↓ NAT
VM privée 192.168.100.10:443
  ↓
Nginx Proxy Manager
  ↓ proxy HTTP
DataLab0 Docker reverse-proxy :8080

Installation Nginx Proxy Manager

Dossier utilisé :

mkdir -p ~/npm
cd ~/npm

Fichier docker-compose.yml :

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Lancement :

docker compose up -d

Interface d’administration :

http://147.135.131.39:81

Identifiants initiaux Nginx Proxy Manager :

Email: admin@example.com
Password: changeme

Ils doivent être changés immédiatement après la première connexion.

NAT Proxmox pour Nginx Proxy Manager

Les ports publics nécessaires :

80  -> 192.168.100.10:80
443 -> 192.168.100.10:443
81  -> 192.168.100.10:81, interface admin NPM

Commandes Proxmox :

iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.100.10 --dport 80 -j MASQUERADE

iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to-destination 192.168.100.10:443
iptables -t nat -A POSTROUTING -p tcp -d 192.168.100.10 --dport 443 -j MASQUERADE

iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 81 -j DNAT --to-destination 192.168.100.10:81
iptables -t nat -A POSTROUTING -p tcp -d 192.168.100.10 --dport 81 -j MASQUERADE

Rendre persistant :

netfilter-persistent save

Proxy Host NPM

Dans Nginx Proxy Manager :

Proxy Hosts -> Add Proxy Host

Configuration :

Domain Names: appv2dev.datalab0.com
Scheme: http
Forward Hostname / IP: 192.168.100.10
Forward Port: 8080

Options conseillées :

Block Common Exploits: enabled
Websockets Support: enabled

Onglet SSL :

Request a new SSL Certificate
Force SSL: enabled
HTTP/2 Support: enabled
Agree to Let's Encrypt Terms of Service: enabled

URL finale validée :

https://appv2dev.datalab0.com

Point d’attention certificat SSL

Si l’erreur suivante apparaît :

ERR_SSL_UNRECOGNIZED_NAME_ALERT

cela signifie généralement que NPM répond sur 443, mais que le certificat n’a pas été correctement généré.

Cause fréquente : le port 80 n’était pas encore accessible au moment du challenge Let's Encrypt.

Correction :

  1. vérifier que les NAT 80 et 443 existent ;
  2. retourner dans le Proxy Host NPM ;
  3. onglet SSL ;
  4. demander à nouveau un certificat ;
  5. réactiver Force SSL.

Sécurité SSH validée

L’accès SSH public utilise :

147.135.131.39:2222 -> 192.168.100.10:22

Connexion depuis Windows :

ssh -i $HOME\.ssh\id_ed25519 -p 2222 admin@147.135.131.39

La clé publique du PC est placée dans :

/home/admin/.ssh/authorized_keys

Permissions attendues :

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Configuration SSH sécurisée

Fichier :

sudo nano /etc/ssh/sshd_config

Options validées :

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no

Tester la configuration avant redémarrage :

sudo sshd -t

Si la commande ne retourne rien, la configuration est valide.

Redémarrer SSH :

sudo systemctl restart ssh

Important : garder une session SSH ouverte pendant le test, puis ouvrir une deuxième session depuis le PC pour confirmer que l’accès par clé fonctionne toujours.

Fail2ban

Fail2ban a été installé et activé dans la VM :

sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Vérification :

sudo systemctl status fail2ban

Statut attendu :

Active: active (running)

Fail2ban protège notamment contre les tentatives de brute force SSH.

Ports publics actuellement utilisés

2222 -> SSH VM
80   -> NPM / Let's Encrypt HTTP challenge
443  -> HTTPS public appv2dev.datalab0.com
81   -> interface admin Nginx Proxy Manager
8080 -> accès direct historique à DataLab0, à fermer/protéger plus tard
9001 -> console MinIO, à fermer/protéger plus tard si inutile publiquement

Recommandation prochaine sécurité

À court terme, réduire l’exposition publique :

  • fermer ou restreindre 8080, car HTTPS passe maintenant par 443 ;
  • fermer ou restreindre 81, interface admin NPM ;
  • fermer ou restreindre 9001, console MinIO ;
  • ne garder publiquement que 80, 443 et éventuellement 2222.

État validé

À ce stade, le socle dispose de :

  • domaine DEV ;
  • HTTPS Let’s Encrypt ;
  • reverse proxy Nginx Proxy Manager ;
  • SSH par clé uniquement ;
  • root SSH interdit ;
  • fail2ban actif ;
  • règles NAT persistantes ;
  • Docker Compose applicatif fonctionnel.