Table des matières

Félicitations, CloudStack est en ligne, chef ! Nous ajoutons maintenant l'armure et livrons une version pour laquelle votre futur vous remerciera, et non pour laquelle vous le détesterez 🤣

voici ce que nous aborderons dans cette partie :

  • Activer l'UEFI avec prise en charge du démarrage sécurisé.
  • Mettre Nginx en avant en tant qu'équilibreur de charge/proxy inverse, terminez TLS et (facultativement) associez-le à Cloudflare pour la protection contre les bots/DDoS.
  • Marque personnalisée CloudStack (polissage de l'interface utilisateur, URL du proxy de la console, domaines de stockage secondaires) donc on a l'impression que ton nuage.
  • Lancer une nouvelle VM de bout en bout, avec quelques pièges annoncés pour que vous ne trébuchiez pas dessus.

Petit mot sur Cloudflare : c'est à vous de voir. Je l'utilise car il simplifie considérablement les règles WAF et la mise en cache 😂 et il me donne accès au SSL gratuit. Si vous préférez une solution simplifiée, passez votre chemin. Nous continuerons à sécuriser les choses avec Nginx et des règles de pare-feu raisonnables.

À propos du service Web : les machines virtuelles système de CloudStack (proxy de console et stockage secondaire) sont livrées avec Apache sous le capot. Nous ne le supprimons pas. Au lieu de cela, nous allons mettre Nginx à la périphérie pour gérer l'interface utilisateur et transmettre uniquement ce qui est nécessaire aux machines virtuelles du système. L'objectif est de masquer les IP des machines virtuelles système et de l'interface utilisateur et présente un point d'entrée unique et propre pour les utilisateurs et les outils. c'est plus propre, plus sûr et plus facile à entretenir.

Lancer la première VM

J'ai ajouté une galerie au lieu d'images individuelles avec des étapes pour simplifier l'installation. Veuillez noter que les modèles prêts à l'emploi de CloudStack ne sont pas fournis avec des images Windows.
Quelles sont les étapes à suivre ici :

  1. Dirigez-vous vers Offres de servicesOffre de calcul
    Les offres par défaut sont de petites offres, vous pouvez en créer de nouvelles et les personnaliser comme vous le souhaitez ou créer une offre personnalisée afin de ne pas avoir à créer plusieurs offres.
  2. Dirigez-vous vers CalculerInstances ou en haut à droite près de l'icône utilisateur (CréerExemple)
    Créez une nouvelle machine virtuelle, sélectionnez le modèle, l'offre de calcul, le stockage, le réseau et continuez. Vous pouvez utiliser l'instance en appuyant sur « Afficher la console » ou en utilisant SSH.

Avant d'utiliser SSH pour les machines virtuelles, vous devez autoriser les ports d'entrée/sortie dans le groupe de sécurité sous l'onglet « Réseau » du menu ou sous « Groupes de sécurité » sur la page de la machine virtuelle. En cas d'erreur lors de la création de la machine virtuelle, consultez ma page GitHub pour la FAQ.

Configuration de l'UEFI

Le système hôte doit être installé en mode UEFI.
Vous pouvez vérifier le mode de démarrage actuel

Frapper
test -d /proc/device-tree && echo "U-Boot mode" || (test -d /sys/firmware/efi && echo "UEFI boot mode" || echo "Legacy BIOS boot")

Configurez QEMU en modifiant le qemu.conf déposer

Frapper
nano /etc/libvirt/qemu.conf

Recherchez et supprimez les commentaires, modifiez ou ajoutez les éléments suivants à la configuration

Frapper
nvram = [
  "/usr/share/OVMF/OVMF_CODE_4M.fd:/usr/share/OVMF/OVMF_VARS_4M.fd",
  "/usr/share/OVMF/OVMF_CODE_4M.secboot.fd:/usr/share/OVMF/OVMF_VARS_4M.fd",
  "/usr/share/OVMF/OVMF_CODE_4M.ms.fd:/usr/share/OVMF/OVMF_VARS_4M.ms.fd"
]

Informations sur les paramètres liés à l'UEFI ajoutées dans uefi.properties qui est situé /etc/cloudstack/agent

Frapper
nano /etc/cloudstack/agent/uefi.properties

Collez le contenu spécifié dans le uefi.properties déposer

Frapper
guest.nvram.template.secure=/usr/share/OVMF/OVMF_VARS_4M.ms.fd
guest.loader.secure=/usr/share/OVMF/OVMF_CODE_4M.secboot.fd

guest.nvram.template.legacy=/usr/share/OVMF/OVMF_VARS_4M.fd
guest.loader.legacy=/usr/share/OVMF/OVMF_CODE_4M.fd

guest.nvram.path=/var/lib/libvirt/qemu/nvram/

Redémarrer le service

Frapper
systemctl restart libvirtd cloudstack-agent cloudstack-management

Bon travail, passons maintenant à l'interface utilisateur.

  1. Cliquez sur "Infrastructure" sur le côté gauche
  2. Cliquez sur "Hôte" et cliquez sur l'hôte utilisé
  3. Trouver « Prise en charge de l'UEFI » en dessous du "Détails" section ; si elle indique vrai, cela signifie que la configuration a réussi

Lors de la création d'un "exemple", activer "Avancé" mode et sélectionnez « UEFI » comme le « Type de démarrage »

Configurer NGINX + SSL + Cloudflare

Allons-y et sécurisons notre frontend avec NGINX, SSL, Cloudflare (ou le fournisseur de votre choix).

Cette étape n'est utile que si vous prévoyez d'utiliser un nom de domaine pour accéder à l'interface utilisateur, à la console, télécharger des images de stockage et masquer l'IP d'origine, configurer les règles WAF, CDN, etc.

Mettre Cloudflare (ou tout autre équilibreur de charge) en avant pour masquer l'IP d'origine achète une réelle sécurité et résilience, même avec la mise en cache désactivéeCloudflare agit comme un proxy inverse en périphérie, absorbant le trafic indésirable, mettant fin au protocole TLS et filtrant les requêtes avant qu'elles n'atteignent votre configuration. Cela réduit à lui seul les analyses, les attaques L7 et les tentatives d'épuisement du protocole TLS qui, autrement, impacteraient votre configuration.

Paramètres

Aller à InfrastructureMachines virtuelles système et recherchez les adresses IP des machines virtuelles système
Les machines virtuelles système doivent être en cours d'exécution et l'agent doit être opérationnel.

Ceci n'est qu'un exemple, recherchez la véritable adresse IP.

Ensuite, cliquez sur "Configuration" sur le côté gauche, puis cliquez sur « Paramètres globaux »

  1. Rechercher consoleproxy.url.domain et secstorage.ssl.cert.domain et changer en conséquence.
  2. Rechercher consoleproxy.sslActivé et secstorage.encrypt.copy et définir sur vrai/activer.
Installer Certbot

Pour activer SSL pour l'interface utilisateur CloudStack, CPVM et SSVM, nous allons configurer Nginx comme proxy inverse. Pour les certificats, nous utiliserons Certbot (Let's Encrypt) : c'est gratuit, rapide et renouvelable automatiquement avant 90 jours.

Configurer Certbot

Dans ce cas, j'utilise Certbot avec le challenge DNS de Cloudflare pour émettre le certificat TLS. Obtenez un certificat Cloudflare délimité. Jeton API iciConnectez-le au plugin Cloudflare de Certbot et vous bénéficierez de renouvellements mains libres. Certbot prend en charge de nombreux autres fournisseurs DNS ; choisissez celui qui correspond au vôtre. Vérifiez ici

Frapper
sudo apt install -y certbot python3-certbot-dns-cloudflare
Frapper
sudo mkdir -p /etc/letsencrypt
echo "dns_cloudflare_api_token = YOUR_API_TOKEN_HERE" > /root/.cloudflare.ini
Frapper
sudo chmod 600 /root/.cloudflare.ini
Frapper
# Issue a Certificate
certbot certonly -d example.com -d "*.example.com" \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.cloudflare.ini \
  --key-type rsa \
  --rsa-key-size 2048 \
  --agree-tos \
  --force-renewal\
  --no-eff-email\
  --email YOUR@EMAIL.COM
  
# The cert output should be in /etc/letsencrypt/live/example.com/
Installation de NGINX

Je remplace généralement les ports par défaut de CloudStack par 8080/8443 à 9080/9443 donc Nginx et les services Java/Tomcat ne se battent pas pour les mêmes sockets.
Tout d’abord, nous devons configurer KeyStore pour CloudStack

Frapper
# Verify key and certificate match. MD5 'must' match. Else: Generate new ones
echo "Certificate modulus:"
openssl x509 -noout -modulus -in /etc/letsencrypt/live/example.com/cert.pem | openssl md5

echo "Private key modulus:"
openssl rsa -noout -modulus -in /etc/letsencrypt/live/example.com/privkey.pem | openssl md5
Frapper
openssl pkcs12 -export -in /etc/letsencrypt/live/example.com/fullchain.pem \
  -inkey /etc/letsencrypt/live/example.com/privkey.pem \
  -out /etc/cloudstack/management/cloudstack.p12 \
  -name cloudstack \
  -password pass:STRONGPASSWORDHERE!
  
openssl pkcs12 -export \
  -inkey /etc/letsencrypt/live/example.com/privkey.pem \
  -in /etc/letsencrypt/live/example.com/fullchain.pem \
  -name cloudstack \
  -out /etc/cloudstack/management/cloud.pkcs12 \
  -password pass:STRONGPASSWORDHERE!
  
openssl pkcs8 -topk8 -inform PEM -outform PEM \
  -in /etc/letsencrypt/live/example.com/privkey.pem \
  -out /etc/cloudstack/management/privkey.pkcs8 -nocrypt
Frapper
keytool -importkeystore \
  -srckeystore /etc/cloudstack/management/cloudstack.p12 \
  -srcstoretype PKCS12 \
  -srcstorepass STRONGPASSWORDHERE! \
  -destkeystore /etc/cloudstack/management/cloudstack.jks \
  -deststoretype JKS \
  -deststorepass STRONGPASSWORDHERE!

Configurer Cloudmonkey

Frapper
# Install snap, then Install cloudmonkey
sudo apt install -y snapd 
sudo snap install cloudmonkey

cmk sync
cmk set profile mycloud
cmk set url http://127.0.0.1:8080
cmk set username YOUR_USERNAME
cmk set password YOUR_PASSWORD
cmk sync
# This is unsafe, We need to change them later to apikey secretkey instaed of username password and clear username, password. 
# Don't forget to change url ass well after changing the port. 
Frapper
# You need to "wget https://letsencrypt.org/certs/isrgrootx1.pem" then combine it with chain.pem

cmk upload customcertificate id=1 name=LetsEncryptChain certificate="$(cat /etc/letsencrypt/live/example.com/isrgrootx1.pem)" domainsuffix='*.example.com'

cmk upload customcertificate id=2 certificate="$(cat /etc/letsencrypt/live/example.com/cert.pem)" privatekey="$(cat /etc/cloudstack/management/privkey.pkcs8)" domainsuffix='example.com'

cmk upload customcertificate id=4 certificate="$(cat /etc/letsencrypt/live/example.com/fullchain.pem)" privatekey="$(cat /etc/cloudstack/management/privkey.pkcs8)" domainsuffix='*.example.com'
Frapper
nano /etc/cloudstack/management/server.properties
# Change 8080 port to 9080
http.enable=true
http.port=9080
# Set https to true and change port to 9443
https.enable=true
https.port=9443
# Change the following
https.keystore=/etc/cloudstack/management/cloudstack.jks
https.keystore.password=STRONGPASSWORDHERE!
# Use plain-text password

J'ai organisé des configurations NGINX pour CloudStack et ses services, sur mon Github

Frapper
sudo apt install -y nginx nginx-extras nginx-common
Frapper
cd /etc/nginx
# Copy and replace nginx.conf from github
wget https://github.com/abdessalllam/cloud-setup/raw/refs/heads/main/Nginx%20Confs/nginx.conf
# Then go to sites-available
cd /etc/nginx/sites-available
# Download UI, CPVM, SSVM Configs here. 
# Adjust all "Important: Change this" lines
wget https://github.com/abdessalllam/cloud-setup/raw/refs/heads/main/Nginx%20Confs/sites-available/ui.conf
wget https://github.com/abdessalllam/cloud-setup/raw/refs/heads/main/Nginx%20Confs/sites-available/ssvm.conf
wget https://github.com/abdessalllam/cloud-setup/raw/refs/heads/main/Nginx%20Confs/sites-available/cpvm.conf
# Should have 3 Files
root@cloudstack:/etc/nginx/sites-available# ls -ls
total 12
4 -rw-r--r-- 1 root root 1976 Jan 14 01:38 cpvm.conf
4 -rw-r--r-- 1 root root 1006 Jan 14 01:40 ssvm.conf
4 -rw-r--r-- 1 root root 2096 Jan 14 01:45 ui.conf
root@cloudstack:/etc/nginx/sites-available# 
Frapper
# Enable the configs
sudo ln -s /etc/nginx/sites-available/ui.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/cpvm.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/ssvm.conf /etc/nginx/sites-enabled/
# Add Cloudflare Ranges "If in Use" if not modify configs to comment the include file for realip.conf
cd /etc/nginx/conf.d/
wget https://github.com/abdessalllam/cloud-setup/raw/refs/heads/main/Nginx%20Confs/conf.d/realip.conf
# Reload Nginx
sudo nginx -t
# If there are no erros
sudo systemctl reload nginx
systemctl restart cloudstack-management

Voilà, votre CloudStack Interface utilisateur, proxy de console et stockage secondaire devrait maintenant être accessible sur votre domaine avec TLS.

Ensuite, sautez dans Cloudflare (ou votre CDN/WAF) et ensemble sans cache règles pour ces noms d'hôtes. Sur Cloudflare en particulier, ajoutez des règles de cache/page (ou règles de cache) à contourner la mise en cache pour les domaines UI/console/stockage, et désactiver le chargeur de fusée pour eux, cela peut interférer avec la console.

Un dernier avertissement : le L'interface utilisateur est toujours accessible via l'IP publiqueCe n'est pas idéal. Dans la partie suivante, nous allons verrouiller l'accès direct à l'origine, chiffrer les connexions aux bases de données et configurer iptables comme un service compact et fiable, et surcharger le CPU, la RAM et le stockage.

Classé dans :

Nuage, Guides,