Durcir l'accès à l'interface d'administration Proxmox sur un serveur dédié
I. Introduction
Je dispose d’un serveur dédié chez un hébergeur qui me sert d’hyperviseur avec Proxmox installé. Ce serveur dispose d’une adresse IPv4 publique ainsi que d’une adresse IPv6 globale et suite à l’installation par défaut de Proxmox, l’interface web d’administration de l’hyperviseur était directement exposée sur le port 8006/TCP en HTTPS.
Certes, la communication est chiffrée via TLS, certes, il est possible de mettre en place un mot de passe robuste et un second facteur d’authentification mais l’idée d’exposer ce service sensible aux quatre vents ne me satisfaisait pas du tout. Plusieurs options s’offraient à moi :
- Réaliser un filtrage autorisant uniquement les adresses IP publiques légitimes (allow list) à se connecter sur ce port.
- Mettre en place un filtrage reposant sur le port knocking1.
- Monter un tunnel VPN puis n’autoriser la connexion à l’interface que depuis les clients VPN connectés (Wireguard, OpenVPN).
- Utiliser la fonction de redirection de ports native au service OpenSSH qui tourne par défaut sur le serveur dédié.
La première proposition était vraiment trop restrictive car je souhaite pouvoir me connecter sur l’interface d’administration où que je me trouve et dès que j’en ai besoin. La deuxième proposition est assez fun techniquement mais elle impose très souvent l’utilisation d’un service dédié au port knocking, tant sur le serveur que sur le poste client, ce qui alourdit là-aussi le processus.
J’ai donc hésité entre la troisième et la quatrième solution. J’ai finalement choisi la dernière du fait que j’aime le service SSH et surtout parce qu’il était déjà effectif et opérationnel sur mon serveur dédié.
II. Qu’est-ce que le port forwarding avec SSH ?
Avec OpenSSH, plusieurs types de redirection de port sont possibles :
- la redirection locale de port ;
- la redirection distante de port ;
- le transfert dynamique de port.
Dans le cas présent, c’est une redirection locale de port qui sera utilisée. La redirection locale de port est une technique qui consiste à rediriger le trafic réseau d’un port spécifique vers un autre port, souvent sur une machine différente. Cette technique est utilisée pour acheminer le trafic à travers une connexion SSH sécurisée, permettant d’accéder à des services distants ou locaux sans les exposer directement notamment dans des environnements hostiles.
Ainsi, si je configure le service web pour écouter uniquement sur les interfaces de boucle locale 127.0.0.1 ou ::1 et que de surcroît je n’autorise que des requêtes ICMP écho et SSH en entrée sur le serveur via un firewall, alors la connexion à l’interface web d’administration de Proxmox est désormais impossible depuis Internet.
Certes, me direz-vous, le port 8006/TCP n’est plus directement exposé mais plus personne ne peut accéder à l’interface web d’administration hormis un navigateur présent sur le serveur en question et sollicitant le service par l’adresse de loopback. Et bien c’est là que la redirection de port par SSH intervient !
L’idée est d’établir une connexion SSH entre le client Anakin et le serveur Tatooine (1) dans laquelle on redirigera le service d’administration de Promox à l’écoute sur l’interface de boucle locale du serveur sur le port 8006 sur l’interface de boucle locale du client également sur le port 8006 (2). Enfin, il suffira de lancer un navigateur web sur la machine cliente avec comme URL https://[::1]:8006 (3).
L’intérêt est simple :
- ne pas exposer le port 8006/TCP directement sur internet mais obliger à se connecter et s’authentifier sur le serveur avec SSH puis encapsuler le flux d’administration du serveur Proxmox dans le tunnel SSH préalablement établi.
III. Mise en oeuvre technique
Concrètement, voici comment cela se configure techniquement.
Sur le serveur, il faut tout d’abord s’assurer que le service SSH accepte la redirection de port.
jabba@tatooine:~$ sudoedit /etc/ssh/sshd_config
# Cette ligne ne doit pas être commentée et avec la valeur yes
AllowTcpForwarding yes
jabba@tatooine:~$ sudo systemctl restart ssh
Sur le client, il est dorénavant possible de se connecter via SSH et la redirection locale de port.
anakin@mustafar:~$ ssh -6 -L 8006:[::1]:8006 jabba@2001:db8::beef
Une fois la connexion SSH établie, il suffit d’ouvrir un navigateur web sur le poste client et rentrer l’URL suivante :
- https://[::1]:8006.
L’accès à l’interface web d’administration est opérationnelle après avoir validé le certificat X509 auto-signé présenté par le serveur.
Il est important de ne pas oublier de configurer sur le serveur les règles de firewall adéquates autorisant uniquement les requêtes SSH et ICMP écho depuis Internet. Cela peut se faire par l’interface graphique de Proxmox ou en ligne de commande. Une fois le pare-feu correctement configuré, il est également possible de vérifier que l’accès direct au service web d’administration de Proxmox n’est plus possible via l’URL (si la configuration du service web n’a pas été modifiée et que ce dernier est à l’écoute sur toutes les interfaces réseaux du serveur) :
- https://[2001:db8::beef]:8006
IV. Conclusion
Dorénavant, seul le service SSH est exposé ce qui réduit drastiquement la surface d’attaque de notre hyperviseur. Cependant, il faut garder à l’esprit que OpenSSH dispose également de vulnérabilités. Il est donc essentiel d’appliquer régulièrement les mises à jour de sécurité concernant ce service et de durcir sa configuration ainsi que les méthodes d’authentification associées.
Pour ma part, j’ai adapté le fichier de configuration /etc/ssh/sshd_config à mes besoins et j’ai mis en place une authentification forte sur mon serveur avec FIDO22.