المستندات / cloud-init وصور الأجهزة

cloud-init وصور الأجهزة

طريقتان لتخطّي التثبيت اليدوي: الصق قالب cloud-init عند إنشاء خادم VPS، أو ابنِ صورة جهاز فيها كل شيء مثبّت بالفعل.

cloud-init (خادم واحد في كل مرة)

panel/deploy/cloud-init.yaml هو قالب بيانات-مستخدم. حرّر الإعدادات القليلة في أعلاه، والصقه في مربع "بيانات المستخدم" لدى مزوّدك عند إنشاء الخادم، وتكون اللوحة جاهزة عند انتهاء إقلاع الخادم. يظهر التقدّم وأي فشل في /var/log/nimbopanel-provision.log.

لا تعامل بيانات المستخدم على أنها مخزن أسرار

هذا هو الجزء الذي يستحق القراءة مرتين. على كل مزوّد كبير، تبقى بيانات المستخدم قابلة للاسترجاع من داخل النسخة قيد التشغيل عبر HTTP على العنوان 169.254.169.254 — وذلك العنوان يمكن الوصول إليه من أي عملية على الجهاز، بما فيها سكربت PHP لعميل استضافة.

لذا فمفتاح الترخيص المُلصَق في بيانات المستخدم قابل للقراءة من كل عميل تستضيفه، ما لم يمنع ذلك شيء. القالب يمنعه على خطوتين، بهذا الترتيب:

  1. يُغلق خدمة البيانات الوصفية أمام الجميع عدا root، قبل أن يصل المفتاح إلى القرص؛
  2. بعد أن يخزّن المُثبِّت المفتاح في إعداد خاص بـ root فقط، يمزّق النسخة الموجودة على القرص من بيانات المستخدم.

إن كنت تفضّل عدم وضع المفتاح هناك إطلاقًا، فاتركه فارغًا وأدخِله من اللوحة بعد ذلك. يعمل الخادم بلا ترخيص إلى أن تفعل، وهي حالة مدعومة.

صور الأجهزة (خوادم كثيرة من بناء واحد)

panel/deploy/packer/nimbopanel.pkr.hcl يبني صورة فيها الحزمة كاملة مثبّتة. هناك تذهب الدقائق — الحزم و PHP والبريد و DNS وقاعدة البيانات — ولا شيء من ذلك يختلف بين الخوادم.

الخطأ الذي يجعل كل نسخة هو الخادم نفسه

يجب ألّا تحتوي الصورة على أي هوية. إن احتوت، فكل خادم مبنيّ منها يتشارك تلك الهوية:

مخبوز بالخطأ ما يحدث على كل نسخة
مفاتيح مضيف SSH تقدّم جميعها المفتاح نفسه. أي شخص متموضع بين عميل وخادمه يمكنه انتحاله، على جميعها، دون أي تحذير يُعرض
مُعرّف نسخة Nimbopanel بصمة الترخيص تُشتقّ منه، والمُثبِّت لا يعيد أبدًا بذر مُعرّف موجود أصلًا — فيبدو ألف خادم تفعيلًا واحدًا
/etc/machine-id تتضارب هويّات systemd وعقود إيجار DHCP و journald
قاعدة بيانات اللوحة وإعدادها كلمة مرور المسؤول ومفتاح الترخيص وكل حساب تُشحَن داخل ملف يُنزّله الغرباء
مفاتيح DKIM وشهادات TLS صادرة لجهاز البناء؛ بلا معنى على نسخة، ومُسرَّبة لكل من يملك الصورة

لا شيء من هذا يُعلن عن نفسه. تُكتشَف لاحقًا، على يد شخص آخر.

panel/deploy/image-deidentify.sh يزيلها كلها، وبناء Packer يشغّله كخطوة أخيرة ثم يُعيد تشغيله بـ --check، فيفشل البناء بدلًا من إنتاج لقطة تبدو نظيفة فحسب. كل ما يُزال يُعاد إنشاؤه على أول إقلاع للنسخة: يُولّد sshd مفاتيح مضيف جديدة، ويكتب systemd مُعرّف-جهاز جديدًا، ويبذر المُثبِّت مُعرّف نسخة جديدًا.

يُترَك /etc/machine-id فارغًا، لا محذوفًا — يقرأ systemd الملف الفارغ على أنه "ولّد واحدًا عند الإقلاع"، بينما الملف المفقود يمنع بعض الصور من الإقلاع إطلاقًا.

تحقّق قبل النشر

sudo ./image-deidentify.sh          # remove
sudo ./image-deidentify.sh --check  # confirm, exits non-zero if anything survives

شغّل الفحص على نسخة أُقلعت أيضًا، لا في وقت البناء فحسب. إن أبلغ عن أي شيء، فلا تنشر الصورة.

قوائم المتجر

برامج "التطبيق بنقرة واحدة" لدى المزوّدين (Vultr و DigitalOcean و Linode و Contabo) لكلٍّ صيغة تقديم ومراجعة خاصة به. الصورة أعلاه هي القطعة التي يطلبونها؛ والأوراق خاصة بكل مزوّد وليست شيئًا يمكن لهذه الأدوات أن تفعله عنك.