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 :
- vérifier que les NAT
80et443existent ; - retourner dans le Proxy Host NPM ;
- onglet SSL ;
- demander à nouveau un certificat ;
- 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 par443; - fermer ou restreindre
81, interface admin NPM ; - fermer ou restreindre
9001, console MinIO ; - ne garder publiquement que
80,443et éventuellement2222.
É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.