[Proxmox] Cloud serveur Proxmox 6.x sur un serveur Kimsufi

 

Cloud serveur Proxmox 6.x sur un serveur Kimsufi
Article original Publié le : 14 février 2020
Mise a jour le :

 

 

I. Solution

Pour les besoins d’un petit labs de quelques mois, c’est une solution correcte pour une vingtaine d’euros.
Voici l’instance utilisée

  • KS-11 Intel Xeon W3520 4c/8t 2,66GHz
  • 16Go DDR3 ECC 1333 MHz
  • SoftRaid 2x2To
  • 100 Mbps
  • 19,99 € HT (soit 23,99 € TTC)

Toutes les offres ici

Je dispose de quelques serveurs physiques récupérés gracieusement Dell et HP mais le cout élevé en électricité ça douille de ouf, le bruit même si isolé, les coupures de courant car non ondulé et connexion vdsl en carton … m’ont orienté vers cette solution,
C’est aussi l’occasion de tester cet environnement en cloud et d’essayer de le sécurisé au maximum.

 

 

II. Installation

Les templates sont nombreux, j’ai choisi par rapidité Proxmox v6.
L’installation est assez succincte, assez transparente même, à part le partitionnement tout est automatisé, on se retrouve après 20 min avec un Proxmox fraichement installé clé en main.


 

 

 

 

/!\ Le mot de passe root pour la connexion ssh/web est envoyé par mail a l’issu de l’installation.

 

 

III. Préparation de l’environnement

Les premières actions seront bien sûr de désactivés le compte root, faire du filtrage ip, changer le port ssh, générer un certificat Let’s Encrypt, mais commençons par le commencement ..

/!\ Créer un record dns chez le registrar

 

  • Maintenir son système a jour
# apt update && apt upgrade
  • Installation de paquet utile (pour l’utilisation de vim sous Debian voir cet article)
# yum install vim pwgen
  • Généré un mot de passe solide avec pwgen
# pwgen 14 1
  • Changé le mot de passe root
# passwd
  • Créer un compte utilisateur et l’ajouter au groupe sudoers (visudo)
# useradd utilisateur
# passwd utilisateur
# echo 'utilisareur ALL=(ALL:ALL) ALL' >> /etc/sudoers.d
  • Pour SSH, changer le port d’écoute, désactiver le compte root et ajouter le ou les utilisateurs autorisés à se connecter
# vi /etc/ssh/sshd_config

  • Recharger ssh
# systemctl reload sshd.service

 

Fermé la session et se reconnecter avec le compte utilisateur précédemment

/!\ Si l’erreur Could not chdir to home directory /home/utilisateur: No such file or directory apparait avec le compte utilisateur, il faut créer manuellement son home

$ sudo mkdir /home/utilisateur
$ sudo usermod --shell /bin/bash --home /home/utilisateur utilisateur
$ sudo chown -R utilisateur:utilisateur /home/utilisateur

Déconnecter/reconnecter et on retrouve un shell en /bin/bash avec son home

 

IV. Iptables

Il faut maintenant sécurisé iptables car par défaut il accepte tout.
Ce serveur n’a pas vocation à être ouvert a tout le monde, du coup je restreins le port ssh et le port d’administration de Proxmox a mes seules IP’s publiques.

/!\ L’importance de verrouiller au mieux ces points d’entrée
Dès que le serveur est en ligne, les bots bombardent à la recherche d’accès …

$ sudo tail -f /var/log/auth.log
Feb 12 18:29:21 sshd[10556]: Failed password for invalid user newuser from 42.192.41.xxx port 54582 ssh2
Feb 12 18:29:35 sshd[10597]: Failed password for root from 51.83.68.xxx port 41546 ssh2
Feb 12 18:29:46 sshd[10618]: Failed password for invalid user webmaster from 111.67.201.xxx port 48794 ssh2
Feb 12 18:31:01 sshd[10778]: Failed password for invalid user jiaxuan from 189.178.112.xxx port 59671 ssh2
Feb 12 18:31:57 sshd[10886]: Failed password for invalid user geoeast from 51.83.68.xxx port 56116 ssh2
Feb 12 18:32:12 sshd[10918]: Failed password for root from 42.192.41.xxx port 59006 ssh2
Feb 12 18:32:13 sshd[10937]: Failed password for root from 111.67.201.xxx port 60786 ssh2
Feb 12 18:33:50 sshd[11117]: Failed password for invalid user islam from 189.178.112.xxx port 47046 ssh2
Feb 12 18:34:25 sshd[11203]: Failed password for invalid user oracle from 51.83.68.xxx port 42452 ssh2

 

État par défaut

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

 

Avant de tout droper, il faut créer les règles pour s’assurer de garder la main dessus puis il faudra les sauvegarder.
Autoriser le loopback

$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A OUTPUT -o lo -j ACCEPT

 

Autoriser SSH pour son ou ses IP’s publiques

$ sudo iptables -A INPUT -p tcp -s ip_publique/32 --dport 2222 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp -s ip_publique/32 --dport 2222 -j ACCEPT

 

Autoriser le port de l’interface Proxmox pour son ou ses IP’s publiques

$ sudo iptables -A INPUT -p tcp -s ip_publique/32 --dport 8006 -j ACCEPT

 

Autoriser les ports dns en udp/tcp et http/https en tcp pour que la machine puisse sortir et faire des updates/installes

$ sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

 

Conserver un état connecté

$ sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

 

Autoriser l’icmp,
/!\ J’ai eu droit a un reboot en mode rescue (Le serveur est démarré (demande du ‘login’ à l’écran) mais inaccessible par le réseau (pas de ‘ping’).)

$ sudo iptables -A INPUT -p icmp -j ACCEPT

Autant autoriser le ping en sortant pour les machines !

$ sudo iptables -A OUTPUT -p icmp -j ACCEPT

 

Autoriser le ntp

$ sudo iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

 

Autoriser le DHCP d’Ovh (stack erreur persistante dans les logs)
dhclient[754]: DHCPREQUEST for xx.xx.xx.xx on vmbr0 to 91.121.126.xx port 67
dhclient[754]: send_packet: Operation not permitted
dhclient[754]: dhclient.c:2755: Failed to send 300 byte long packet over fallback interface.

$ sudo iptables -I INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT
$ sudo iptables -I OUTPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT

 

Enfin bloquer tout le trafic et sauvegarder l’état de la configuration

$ sudo iptables -P INPUT DROP
$ sudo iptables -P OUTPUT DROP

 

 

Les règles minimales sont en places, si les règles de drop sont passés alors on peut sauvegarder la conf.

/!\ Sur Debian les règles ne sont pas persistantes au redémarrage
Possible de faire un script au démarrage pre-up qui s’exécute après que la configuration réseau soit chargée ou
Installer le paquet iptables-persistent et son service netfilter-persistent qui va permettre de pérenniser tout ça.

$ sudo apt install iptables-persistent

 

Puis sauvegarder les règles

$ sudo iptables-save > /etc/iptables/rules.v4

 

Et recharger la conf.

$ sudo systemctl restart netfilter-persistent.service

 

/!\ Les règles d’accès ci-dessus sont un minimum, il y aura d’autres règles à ouvrir plus loin dans la doc

 

 

V. Let’s Encrypt

On peut enfin se connecter a l’interface graphique

 

Pour la mise en place du certificat Let’s Encrypt, c’est devenu beaucoup plus simple que dans mon souvenir en v4

  • Aller sur le node -> system -> certificates
  • Cliquer sur Add et ajouter son domaine

  • Puis Add ACME Account, renseigner son mail et accepter le TOS

  • Puis lancer la création du certificat

/!\ Lets’Encrypt nécessite l’ouverture des ports 80 et 443 en entrée

$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4
$ sudo systemctl restart netfilter-persistent.service

 

Le service pveproxy.service redémarre automatiquement et la page est bien sécurisé

 

 

VI. Création d’un nouveau bridge et NAT

Pour pouvoir créer x machines et contourner la restriction d’une seule IP publique, il faut créer un nouveau subnet pour ensuite naté les IP’s/ports

 

Actuellement il y a un bridge vmbr0 qui porte le port réseau enp1s0 auquel est rattaché l’IP publique

Crée un nouveau bridge sur le serveur qu’il s’appellera vmbr1 et qui portera l’adresse IP 192.168.50.1/24

  • Aller sur le node -> system -> network
  • Cliquer sur Create et Linux Bridge

 

/!\ Un redémarrage du serveur est nécessaire pour appliquer la nouvelle configuration réseau

$ sudo reboot

 

Il faut maintenant faire le routage, on peut imaginer divers scenarios,
Dans mon cas j’ai essentiellement besoin d’accès ssh sur les différentes vms

  • Activer l’IP Forwarding pour router les paquets entre interface
$ sudo bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
  • Pour translater et renvoyer tout le trafic du subnet 192.168.50.0/24 vers l’interface vmbr0
$ sudo iptables -t nat -A POSTROUTING -s '192.168.50.0/24' -o vmbr0 -j MASQUERADE
  • Il reste à définir sur chaque machine une adresse et port et faire une règle de nat prerouting
    le port sur la machine distante sera 22 et sera naté en sortie sur 2223
$ iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2223 -j DNAT --to 192.168.50.10:2223

 

Sauvegarder la conf et redémarrer le service

$ sudo iptables-save > /etc/iptables/rules.v4
$ sudo  systemctl restart netfilter-persistent.service

 

Lancer une connexion ssh sur la machine distante en utilisant le port défini

$ ssh -p2223 utilisateur@srv-proxmox.izero.fr
utilisateur@srv-proxmox.izero.fr's password:

/!\ Cette machine est exposée sur le net, il convient donc de désactiver le compte root et de configuré iptables comme vu plus haut.

 

 

VII. Next step ?

Pour bien faire il faudrait créer un nouvel admin et verrouiller le compte root de l’interface graphique, mais quand j’ai exécuté le script de Let’s Encrypt il y a eu des erreurs car il faisait appel a root. À voir …

Mettre en place un Fail2ban mais en verrouillant l’accès a mes IP’s publiques je pense que cela ne soit pas nécessaire.
si je me trompe je serais ravie d’avoir un retour

D’autres articles en lien avec celui-ci seront créés prochainement.

 

 

VIII. Tips

Supprimer la popup de subscription

# sed -i.bak 's/NotFound/Active/g' /usr/share/perl5/PVE/API2/Subscription.pm && systemctl restart pveproxy.service

 

 

IX. Quelques docs

http://www.octetmalin.net/linux/tutoriels/iptables-configurer-gerer-table-nat-dnat-snat-chaine-prerouting-postrouting-output.php

https://mind-and-go.com/blog/why-not-1/post/cloud-proxmox-derriere-une-seule-ip-24

https://vdillenschneider.fr/architecture-de-services-avec-proxmox-sur-un-serveur-kimsufi

http://communaute-omr.fr/?p=195

 

 

No votes yet.
Please wait...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.