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

ثلاثة أدوار تتقاسم كل شيء حاليا

مدخل VPN ومجموعة خدمات خاصة ومشغّل بناء تريد أشياء مختلفة. الأول يحتاج منفذا عاما وشبكة ضيقة من الجهة الخاصة. والثاني يحتاج تخزينا دائما وأسرار تطبيق. والثالث ينفذ شيفرة كتبها شخص آخر.

إعطاء الثلاثة الوصول نفسه هو ما يجعل العارض محيرا، لأن أي واحد منهم يمكنه بعد ذلك أن يؤثر في الآخرين. مهمة بناء تستطيع الوصول إلى مقبس المراقب الافتراضي هي مهمة تستطيع إيقاف VPN. ضيف خدمات لديه مسار إلى شبكة الإدارة يمكنه تغيير إعدادات المحول. الصلاحيات هي المشكلة، وقائمة العمليات ليست سوى المكان الذي تظهر فيه. تسمية الأدوار أولا تعطي كل صلاحية مكانا تعيش فيه.

الرسم أدناه نقطة انطلاق لهذا الفصل وليس وعدا بتوافر عال. تعامل معه كفرضية يجب التحقق منها، لا كتصميم نهائي.

افصل ثلاثة أدوار، لا ثلاث عمليات

ثلاثة ضيوف على مضيف واحد يعطون ثلاث مجموعات صلاحيات وثلاثة مواضع شبكية. وهم لا يعطون ثلاثة نطاقات فشل، ويجب أن يقول التصميم ذلك بصوت عال.

لا يفيد الفصل إلا إذا كان اختراق ضيف واحد لا يمنح الآخرين الصلاحيات تلقائيا، وهذا إعداد في المراقب الافتراضي وليس اصطلاح تسمية. تسمية جهاز ظاهري بوابة لا تمنع ضيفا آخر من الوصول إلى المضيف. اقرأ إعداد المحول الافتراضي بدلا من اسم المضيف، ثم أكد أن كل ضيف يجلس حيث تظن أنه يجلس.

host
├─ vpn-gw      10.60.10.2/24   public 51820/udp only
├─ services    10.60.0.10/24   no route to the management network
└─ ci-runner   10.60.20.2/24   outbound only, no host socket

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

دع ضيف VPN يفتح فقط الأبواب التي يملكها

انشر منفذ النفق على الموجه ولا شيء غيره. تنتمي منافذ إدارة الضيوف إلى مسار إدارة، لا إلى الإنترنت، وواجهة المراقب الافتراضي نفسها تنتمي إلى هناك أيضا.

ينبغي لشبكة الجهة الخاصة أن تصل إلى الخدمات التي يحتاجها المستخدمون البعيدون وأن تتوقف عندها. يبقى مصادقة التطبيق مفعلا، لأن النفق نقل وليس تسجيل دخول. أبق جدول توجيه ضيف VPN صغيرا بما يكفي لوصفه في جملة واحدة. إن لم تستطع وصفه بتلك البساطة، فقد ضاع الحد بالفعل.

virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'

أي شيء يستمع على المضيف ولا تحتاجه الإدارة يجب ألا يستمع إطلاقا. ويشمل ذلك واجهة برمجة المراقب الافتراضي، التي يسهل تركها مكشوفة على واجهة عامة.

مهام البناء تحتاج نوعا مختلفا من الحدود

مهمة CI تشغل أوامر يتحكم فيها المستودع، لذا تعتمد ثقتها على من يستطيع دفع الشيفرة. منفذ الصدفة يشغل تلك الأوامر بصفة مستخدم المشغل على المضيف، وهذا أوسع حد متاح.

منفذات الحاويات أضيق، والحاوية ذات الامتيازات ليست من الضيقة. أبق المشغل في ضيف خاص به بنطاق شبكي خاص به، وأعطه فقط وصول القطع الأثرية والنشر الذي تحتاجه المهام. العمال القابلون للاستبدال يقللون الحالة المحفوظة؛ ولا يقللون إمكانية الوصول أو تعرض الأسرار. وكلاهما ما زال يحتاج حدودا صريحة.

ضيف الخدمات يملك البيانات، لذا خطة نسخه الاحتياطي هي التي يجب أن تعمل. أبق المستودعات والتحميلات وقاعدة البيانات في الجدول نفسه. اختبر استعادة بدلا من قراءة حالة المهمة.

خطط للفشل الذي تتقاسمه الثلاثة

مضيف واحد نطاق فشل واحد. إعادة التشغيل تزيل النفق وكل خدمة خاصة في اللحظة نفسها، وهي بالضبط اللحظة التي يكون فيها طريق إلى الداخل أهم ما يكون.

احتفظ بوصول إلى وحدة التحكم لا يعتمد على ضيف VPN، سواء كان وحدة تحكم فعلية أو واجهة إدارة خارج النطاق أو وحدة تحكم من المزود. اللقطة المخزنة على القرص نفسه ليست نسخة مستقلة، ولا النسخة الاحتياطية التي تعمل داخل الضيف الذي تحميه. ثم اختبر البدء البارد كتسلسل لا كقائمة تحقق: المضيف، والشبكات الافتراضية، ومسار النفق، وتطبيق واحد مسمى بحساب عادي.

virsh list --all
systemctl is-active libvirtd
curl -sS -m 5 -o /dev/null -w '%{http_code}\n' https://10.60.0.10/
ss -ltnp | grep -E ':51820|:443'

ترتيب بدء العمليات لا يثبت شيئا عن المسارات وDNS، لذا اختبر المسار بدلا من حالات الوحدات. المسار هو ما يحتاجه المستخدم البعيد فعليا.

مقالات ذات صلة