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

ما يتلقاه الأصل فعليًا بعد النفق

عندما يصل المتصفح إلى الموقع العام عبر VPN يحمل أيضًا حركة الإنترنت، تترجم البوابة الاتصال قبل أن يغادر. ويرى SaaS عنوان الخروج العام للبوابة، وهو عادة عنوان واحد أو نطاق صغير، و لا يرى أبدًا عنوان النفق للحاسوب المحمول. ولهذا تفشل إضافة 10.90.0.42 إلى قائمة السماح، ولهذا تفشل إضافة كل RFC 1918 بصوت أعلى: فالثانية تسمح لكل شبكة خاصة يمكنها الوصول إليك. والعنوان الوحيد الجدير بالاشتراط هو العنوان الذي تملكه مؤسستك فعليًا عند المخرج.

curl -s https://ifconfig.me
dig +short admin.example.com

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

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

لا تثق إلا بالوكيل الذي يعيد كتابة العنوان

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

set_real_ip_from 192.0.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
curl -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin

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

اربط الشرط بكل عملية محمية

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

user = requireAuthenticatedSession()
requirePermission(user, "admin")
requireVpnEgress(verifiedClientAddress(request))
performProtectedOperation(user, request)

يجب أن تغطي الحدود نفسها واجهة JSON API وعمليات التصدير وعناوين التنزيل الموقعة ومصافحة WebSocket، لأن أيًا منها لا يحتاج إلى طلب صفحة HTML أولًا. فرابط التنزيل الذي أُنشئ أثناء عمل VPN يظل صالحًا بعده ما لم تعد نقطة التنزيل تفحص. وتحتاج الجلسات طويلة الأمد إلى قاعدة إعادة تقييم أيضًا، وإلا أصبح طلب واحد مصادق عليه استثناءً دائمًا. والرفض الافتراضي هو الإعداد الوحيد الذي يصمد أمام تبدل الموظفين.

التخزينات المؤقتة المشتركة هي الطريق الآخر حول الفحص. فالتخزين الذي يحمل استجابة محمية بالفعل يستطيع تقديمها دون الاتصال بالأصل، لذا علّم استجابات الإدارة كخاصة وأبقِها خارج التخزين المشترك. وإذا كان على تخزين ما تقديمها، فيجب أن يعمل فحص الوصول قبل التقديم، وهذا يعني عادة أنه لا يمكن أن يكون تخزينًا مشتركًا على الإطلاق.

اختبر التجاوزات التي أغلقتها للتو

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

curl -sI https://admin.example.com/export.csv
curl -s -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin
curl -s https://admin.example.com/api/me -o /dev/null -w '%{http_code}\n'

ينبغي أن يعيد كل طلب الحالة التي تعد بها السياسة، وينبغي أن يسجل السجل أدلة العنوان التي استُخدمت. وغطِّ IPv6 بشكل منفصل، لأن الأصل ثنائي المكدس قد يرى عائلة مصدر مختلفة عن التي اختبرتها. وأبقِ عمليات العملاء العادية تعمل خارج VPN، وإلا سيُلغى التغيير عند أول شكوى من عميل. واكتب النتيجة المتوقعة لكل صف قبل تشغيله، حتى يكون النجاح المفاجئ ظاهرًا.

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

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