جدول المحتويات

تهانينا، كلاود ستاك أصبح متاحًا، قبلة الشيف. الآن نضيف الدرع ونرسل نسخة ستشكرك عليها شخصيتك المستقبلية، بدلًا من أن تكرهك 🤣

وهذا ما سنتناوله في هذا الجزء:

  • تشغيل UEFI مع دعم التمهيد الآمن.
  • ضع Nginx في المقدمة كموازن التحميل/الوكيل العكسي، قم بإنهاء TLS، وقم (اختياريًا) بإقرانه بـ كلاود فلير للحماية من الروبوتات/DDoS.
  • العلامة التجارية المخصصة CloudStack (تلميع واجهة المستخدم، وعنوان URL لوكيل وحدة التحكم، ومجالات التخزين الثانوية) لذا يبدو الأمر كما لو لك سحاب.
  • إطلاق جهاز افتراضي جديد من النهاية إلى النهاية، مع ذكر بعض الأخطاء التي قد تقع فيها حتى لا تتعثر بها.

ملاحظة سريعة حول Cloudflare: القرار لك تمامًا. أستخدمه لأنه يُسهّل قواعد جدار حماية التطبيقات (WAF) والتخزين المؤقت بشكل كبير 😂، كما أنه يمنحني شهادة SSL مجانية. إذا كنت تفضل تقليل استهلاك البيانات، فتجاوزه. سنستمر في تأمين كل شيء باستخدام Nginx وقواعد جدار الحماية المناسبة.

حول خدمة الويب: يتم شحن أجهزة VM الخاصة بنظام CloudStack (وكيل وحدة التحكم والتخزين الثانوي) مع Apache تحت الغطاء. نحن لا ننتزع ذلك. بدلاً من ذلك، سنضع Nginx على الحافة للتعامل مع واجهة المستخدم وإرسال ما هو مطلوب فقط إلى أجهزة VM للنظام. الهدف هو إخفاء عناوين IP الخاصة بالأجهزة الافتراضية للنظام وواجهة المستخدم وتقديم نقطة دخول واحدة ونظيفة للمستخدمين والأدوات. فهي أكثر ترتيبًا وأمانًا وسهولة في الصيانة.

إطلاق أول جهاز افتراضي

أضفتُ معرضًا بدلًا من الصور الفردية مع خطواتٍ مختصرة. يُرجى العلم أن قوالب CloudStack الجاهزة لا تأتي مع صور Windows.
ما هي الخطوات الواجب اتباعها هنا:

  1. توجه إلى عروض الخدمة - عروض الحوسبة
    الإعدادات الافتراضية هي عبارة عن عروض صغيرة، ويمكنك إنشاء عروض جديدة وتخصيصها كما يحلو لك أو إنشاء عرض مخصص حتى لا تضطر إلى إنشاء عروض متعددة.
  2. توجه إلى حساب - الحالات أو أعلى اليمين بالقرب من أيقونة المستخدم (يخلق - مثال)
    أنشئ جهازًا افتراضيًا جديدًا، ثم حدد القالب، ثم اختر "عرض الحوسبة"، ثم "التخزين"، ثم "الشبكة"، ثم "المتابعة". يمكنك تشغيل المثيل بالضغط على "عرض وحدة التحكم" أو باستخدام 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

عمل رائع، انتقل الآن إلى واجهة المستخدم.

  1. انقر على "بنية تحتية" على الجانب الأيسر
  2. انقر على "يستضيف" وانقر على المضيف المستخدم
  3. يجد “مدعوم من UEFI” تحت "تفاصيل" القسم؛ إذا كان صحيحًا، فهذا يعني أن الإعداد كان ناجحًا

عند إنشاء "مثال"، يُمكَِن "متقدم" الوضع والاختيار "UEFI" كما هو الحال "نوع التمهيد"

إعداد NGINX + SSL + Cloudflare

دعنا نمضي قدمًا ونقوم بتأمين واجهتنا الأمامية باستخدام NGINX أو SSL أو Cloudflare (أو مزود الخدمة الذي تختاره).

هذه الخطوة مفيدة فقط إذا كنت تخطط لاستخدام اسم المجال للوصول إلى واجهة المستخدم ووحدة التحكم وتنزيل صور التخزين وإخفاء عنوان IP الأصلي وإعداد قواعد WAF وCDN وما إلى ذلك...

إن وضع Cloudflare (أو أي موازن تحميل) في المقدمة لإخفاء عنوان IP الأصلي يوفر أمانًا ومرونة حقيقية، حتى مع إيقاف التخزين المؤقتيعمل Cloudflare كوكيل عكسي على الحافة، حيث يمتص حركة البيانات غير المرغوب فيها، وينهي بروتوكول TLS، ويصفي الطلبات قبل أن تصل إلى إعداداتك. هذا وحده يقلل من عمليات المسح، وهجمات المستوى السابع، ومحاولات استنزاف بروتوكول TLS التي قد تُلحق الضرر بإعداداتك.

إعدادات

اذهب الى بنية تحتية - أجهزة افتراضية للنظام وابحث عن عناوين IP الخاصة بأجهزة النظام الافتراضية
يجب أن يكون نظام VM قيد التشغيل وأن يكون الوكيل قيد التشغيل.

هذا مجرد مثال، ابحث عن عنوان IP الحقيقي.

بعد ذلك، انقر فوق "إعدادات" على الجانب الأيسر، ثم انقر فوق "الإعدادات العالمية"

  1. بحث عن consoleproxy.url.domain و نطاق secstorage.ssl.cert وتتغير وفقا لذلك.
  2. بحث عن تم تمكين consoleproxy.ssl و تشفير التخزين.نسخ وضبطه على true/تشغيل.
تثبيت Certbot

لتمكين SSL لواجهة مستخدم CloudStack و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 كخدمة صغيرة وموثوقة، ونزيد من استهلاك وحدة المعالجة المركزية/ذاكرة الوصول العشوائي/وحدة التخزين.

مصنفة في:

سحاب, أدلة,