Поздравляю, CloudStack уже онлайн, поцелуй шеф-повара. Теперь мы добавим броню и выпустим версию, за которую ваше будущее «я» будет вам благодарно, а не возненавидит 🤣
Вот чем мы займемся в этой части:
- Включить UEFI с поддержкой безопасной загрузки.
- Поставьте Nginx впереди как наш балансировщик нагрузки/обратный прокси-сервер, завершите работу TLS и (при необходимости) свяжите его с Cloudflare для защиты от ботов/DDoS-атак.
- Пользовательский бренд CloudStack (улучшение пользовательского интерфейса, URL-адрес прокси-сервера консоли, вторичные домены хранения), поэтому это похоже на твой облако.
- Запустить новую виртуальную машину от начала до конца, с парой подводных камней, о которых вы не споткнетесь.
Небольшое замечание по Cloudflare: решать вам. Я использую его, потому что он делает правила WAF и кэширование невероятно простыми 😂, а ещё он даёт мне бесплатный SSL. Если предпочитаете минимализм, пропустите его. Мы всё равно будем блокировать всё с помощью Nginx и разумных правил брандмауэра.
О веб-обслуживании: системные виртуальные машины CloudStack (консольный прокси-сервер и вторичное хранилище) поставляются с Apache под капотом. Мы не собираемся его убирать. Вместо этого мы поместим Nginx на периферии обрабатывать пользовательский интерфейс и передавать только то, что необходимо системным виртуальным машинам. Цель состоит в том, чтобы маскировать системные виртуальные машины и IP-адреса пользовательского интерфейса и предоставить единую, понятную точку входа для пользователей и инструментов. Это удобнее, безопаснее и проще в обслуживании.
Запуск первой виртуальной машины
Для краткости я добавил галерею вместо отдельных изображений с пошаговыми инструкциями. Обратите внимание, что готовые шаблоны CloudStack не поставляются с изображениями для Windows.
Какие шаги здесь нужно выполнить:
- Направляйтесь к Предложения услуг – Предложение вычислений
По умолчанию предлагаются небольшие предложения, вы можете создавать новые и настраивать их по своему усмотрению или создать индивидуальное предложение, чтобы вам не пришлось создавать несколько предложений. - Направляйтесь к Вычислить – Экземпляры или вверху справа возле значка пользователя (Создавать – Пример)
Создайте новую виртуальную машину, выберите шаблон, затем выберите «Вычислительное предложение», «Хранилище», «Сеть» и нажмите «Продолжить». Вы можете управлять экземпляром, нажав «Просмотр консоли» или используя SSH.
Перед использованием SSH для виртуальных машин необходимо разрешить входящие/исходящие порты в группе безопасности на вкладке «Сеть» в меню или в разделе «Группы безопасности» на странице виртуальной машины. Если при создании виртуальной машины возникнут ошибки, посетите мою страницу на Github, чтобы узнать ответы на часто задаваемые вопросы.
Настройка UEFI
Хост-система необходимо установить в режиме UEFI.
Вы можете проверить текущий режим загрузки
test -d /proc/device-tree && echo "U-Boot mode" || (test -d /sys/firmware/efi && echo "UEFI boot mode" || echo "Legacy BIOS boot")
Настройте QEMU, отредактировав qemu.conf
файл
nano /etc/libvirt/qemu.conf
Найдите и раскомментируйте, измените или добавьте в конфигурацию следующее:
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"
]
Информация о параметрах, связанных с UEFI, добавлена в uefi.properties
который находится /etc/cloudstack/agent
nano /etc/cloudstack/agent/uefi.properties
Вставьте указанное содержимое в uefi.properties
файл
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/
Перезапустите службу.
systemctl restart libvirtd cloudstack-agent cloudstack-management
Отличная работа. Теперь перейдем к пользовательскому интерфейсу.
- Нажмите на «Инфраструктура» на левой стороне
- Нажмите на "Хозяин" и нажмите на используемый хост
- Находить «Поддерживается UEFI» ниже "Подробности" раздел; если он показывает true, это означает, что настройка прошла успешно
При создании "пример", давать возможность "Передовой" режим и выберите «УЕФИ» как «Тип загрузки»
Настройка NGINX + SSL + Cloudflare
Давайте продолжим и защитим наш фронтэнд с помощью NGINX, SSL, Cloudflare (или провайдера по вашему выбору).
Этот шаг полезен только в том случае, если вы планируете использовать доменное имя для доступа к пользовательскому интерфейсу, консоли, загрузки образов хранилища и маскировки исходного IP-адреса, настройки правил WAF, CDN и т. д.
Размещение Cloudflare (или любого другого балансировщика нагрузки) в качестве приоритета для сокрытия исходного IP-адреса обеспечивает реальную безопасность и устойчивость. даже с выключенным кэшированиемCloudflare выступает в роли обратного прокси-сервера на периферии сети, поглощая нежелательный трафик, прерывая TLS и фильтруя запросы до того, как они попадут в вашу систему. Это само по себе предотвращает сканирование, атаки L7 и попытки исчерпания ресурсов TLS, которые в противном случае могли бы нарушить вашу систему.
Настройки
Перейти к Инфраструктура – Системные виртуальные машины и найдите IP-адреса системных виртуальных машин
Системные виртуальные машины должны быть запущены, а агент — включен.
Далее нажмите на «Конфигурация» на левой стороне, затем нажмите на «Глобальные настройки»
- Искать consoleproxy.url.domain и secstorage.ssl.cert.domain и меняться соответственно.
- Искать consoleproxy.sslEnabled и secstorage.encrypt.copy и установите значение true/включите.
Установить Certbot
Чтобы включить SSL для CloudStack UI, CPVM и SSVM, мы настроим Nginx как обратный прокси-сервер. Для сертификатов мы будем использовать Certbot (Let's Encrypt) — это бесплатный, быстрый и автоматически обновляемый сервис до истечения 90 дней.
Настроить Certbot
В данном случае я использую Certbot с DNS-запросом Cloudflare для выпуска TLS-сертификата. Получите доступ к Cloudflare с ограниченной областью действия. API-токен здесь, подключите его к плагину Cloudflare от Certbot, и вы сможете продлевать домены без помощи рук. Certbot поддерживает множество других DNS-провайдеров, выберите того, который соответствует вашему. Проверьте здесь
sudo apt install -y certbot python3-certbot-dns-cloudflare
sudo mkdir -p /etc/letsencrypt
echo "dns_cloudflare_api_token = YOUR_API_TOKEN_HERE" > /root/.cloudflare.ini
sudo chmod 600 /root/.cloudflare.ini
# 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/
Установка NGINX
Я обычно поднимаю порты CloudStack по умолчанию с 8080/8443 к 9080/9443 чтобы Nginx и службы Java/Tomcat не конкурировали за одни и те же сокеты.
Сначала нам нужно настроить KeyStore для CloudStack.
# 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
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
keytool -importkeystore \
-srckeystore /etc/cloudstack/management/cloudstack.p12 \
-srcstoretype PKCS12 \
-srcstorepass STRONGPASSWORDHERE! \
-destkeystore /etc/cloudstack/management/cloudstack.jks \
-deststoretype JKS \
-deststorepass STRONGPASSWORDHERE!
Настройка Cloudmonkey
# 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.
# 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'
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
Я курировал конфигурации NGINX именно для CloudStack и его сервисов, на моем Гитхаб
sudo apt install -y nginx nginx-extras nginx-common
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#
# 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
Вуаля — ваш CloudStack Пользовательский интерфейс, прокси-сервер консоли и вторичное хранилище Теперь ваш домен должен быть доступен по протоколу TLS.
Далее, запрыгивайте в Cloudflare (или ваш CDN/WAF) и установить без кэша Правила для этих хостов. В Cloudflare, в частности, добавьте правила кэширования/страниц (или правила кэширования) обойти кэширование для доменов пользовательского интерфейса/консоли/хранилища и отключить ракетный погрузчик для них это может помешать работе консоли.
Еще одно предупреждение: Пользовательский интерфейс по-прежнему доступен через публичный IP-адрес.Это не идеально. В следующей части мы ограничим прямой доступ к источнику, зашифруем подключения к базе данных и подключим iptables как небольшой, надёжный сервис, а также перегрузим ЦП/ОЗУ/ХРАНИЛИЩЕ.