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

صِف المسار قبل أن تقارن أي شيء:

Client -> approved reverse proxy -> application origin

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

نوعان من الأدلة على العنوان

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

حقل التمرير بيانات وصفية عن سلسلة. X-Forwarded-For، X-Real-IP والحقل الموحّد Forwarded يمكن أن يكتبه أي عميل يصل إلى نقطة نهاية تعيده، لذا تعتمد موثوقيته بالكامل على من سُمح له بكتابته.

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

الترويسة لا تعيد توجيه الاتصال أبدًا

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

الخطأ المعاكس شائع بالقدر نفسه: HTTPS لا يجعل ترويسة التمرير التي يقدمها العميل صادقة. فهو يحمي نقل الادعاء الكاذب بالقدر نفسه الذي يحمي به الادعاء الصادق.

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

سمِّ الوكيل المسموح له بالادعاء

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

توضح وحدة العنوان الحقيقي في NGINX الفصل بوضوح. set_real_ip_from يسمّي المرسلين الذين يُحتسب ادعاؤهم، و real_ip_header يحدد الحقل الذي يحمله؛ الأولى تفعل الثقة، والثانية تقول فقط أين تنظر.

set_real_ip_from 10.20.0.0/24;
real_ip_header X-Forwarded-For;
# real_ip_recursive off - take the rightmost value in the field
# real_ip_recursive on  - walk the list back past every trusted address

التوجيه الذي يختار ترويسة فقط لا يثبت بذاته شيئًا عن الجهة التي أرسلت القيمة.

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

تعامل مع السلاسل متعددة المقاطع بتمعّن

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

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

عند إضافة مقطع، راجع تلك الوثيقة. فموازن الأحمال الجديد الذي يُدرج أمام الوكيل الموثوق قد يغيّر العنوان الفائز دون أن يعدّل أحد التطبيق.

احتفظ بالملاحظتين في السجل

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

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

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