أحكِم إغلاق الخادم، وضَعْ WAF أمام تطبيقك
منذ أول نشر، لا يسمح
erpc worker بدخول SSH إلا من عنوانك، ويُسقط كل اتصال وارد آخر. ويضع جدول [waf] بروكسي تصفية أمام الـ API الخاص بك.تصف هذه الصفحة ERPC CLI
v0.1.0-rc.4، وهو إصدار تمهيدي.جدار الحماية
يضبط النشر جدار حماية الخادم قبل أول تشغيل للتطبيق:
- SSH فقط من
firewall.ssh_allowومن العنوان الذي يأتي منه النشر؛ - يُسقَط كل اتصال وارد آخر، باستثناء
run.portمنfirewall.app_allow؛ وفي تطبيق خلف WAF يحلّ منفذ WAF محله، ولا يكون ذلك إلا حيث يشغّل WAF على الخادم بالفعل القواعد التي يضعها[waf]الآن (أدناه).
يعمل كل تغيير تحت مؤقِّت تراجع مدته 120 ثانية، ولا يُحتفَظ به إلا بعد أن ينجح اتصال جديد في الدخول، فلا يمكن لتغيير خاطئ أن يمنعك من الدخول.
غير أن قائمة السماح تبقى بعد زوال العنوان الذي أُنشئت منه: فإذا تغيّر عنوان منزلك، فطريق العودة هو دعم ERPC لخادم ERPC، أو وحدة تحكم المزوّد لخادم خاص بك. احتفظ في
firewall.ssh_allow بعنوان ثانٍ يمكنك الوصول منه إلى الخادم (مكتب، أو مخرج VPN) قبل أن تعتمد على عنوان منزلي.إذا تغيّر عنوانك، فأضف كل عنوان ثابت يستخدمه المسؤولون لديك:
bash
ضع WAF أمام تطبيقك
أضف جدولًا واحدًا إلى
erpc.toml:toml
بعد ذلك يشغّل
erpc worker deploy بروكسيًا عكسيًا لـHTTP على الخادم، في وحدة systemd خاصة به (erpc-waf-<app>-<env>): يعمل باسم مستخدم ديناميكي بلا امتيازات، بلا مفتاح ولا سر ولا أي شيء من الـ worker، ومحدودًا بـ1 GiB من الذاكرة. يستمع على waf.port، ويقرأ كل طلب قبل أن يقرأه التطبيق، ويرفض ما تسمّيه قواعده، ويمرّر الباقي إلى التطبيق على 127.0.0.1:<run.port>.-
يبقى التطبيق على واجهة loopback. لا يُفتح منفذه الخاص من الخارج أبدًا. يصل
erpc worker apiوفحص الصحة إلى التطبيق على واجهة loopback، متجاوزَين WAF. -
من يمكنه الاتصال لا تزال تحدده قائمة جدار الحماية، ومنفذ WAF هو المكان الوحيد الذي يجوز فيه لتلك القائمة أن تقول «الجميع»:shإذا لم يُدرَج أحد، يستمع WAF ولا يُسمح لأحد بالدخول، ويذكر النشر ذلك.
-
يُفتح المنفذ بعد أن يستمع WAF عليه، وليس قبل ذلك أبدًا. النشر الذي لا يعمل فيه WAF يفشل ويذكر السبب، مع بقاء التطبيق قيد التشغيل.
-
عندما تغيّر
[waf]، لا يُفتح المنفذ لأي شخص جديد حتى يضع نشرٌ القواعدَ الجديدة موضع التنفيذ. -
إزالة
[waf]منerpc.tomlثم النشر يزيلان WAF من الخادم.
إعدادات WAF
المطلوب هو
port فقط. كل مفتاح مع قيمته الافتراضية:toml
تُعطَّل
rate وmax_connections_per_address وban وnew_connections بالقيمة false (ban = false)، والمفتاح المحذوف يأخذ قيمته الافتراضية. ويذكر erpc worker check ما سيفعله جدول [waf] وما فيه من أخطاء، قبل أي نشر.ما يفعله WAF دون حاجة إلى أي إعداد
- الطلب الذي لا يُقرأ كطلب HTTP/1 واحد لا لبس فيه يتلقى 400، وكذلك المسار الذي ليس بصيغته القياسية.
- طلب تغيير البروتوكول (
Upgrade) يتلقى 501. - كل رفض يُحتسب ضمن الحظر، وكل رفض يُنهي اتصاله.
- العنوان هو عنوان IPv4، أو
/64من IPv6. - لا يمرّر WAF ترويسات اتصال العميل بالبروكسي (
Connectionوالترويسات التي تسمّيها، وKeep-AliveوProxy-AuthenticateوProxy-AuthorizationوProxy-ConnectionوTEوTrailer)، ولاExpect، ولا الترويسات التي يحتوي اسمها على شرطة سفلية، ولا ترويساتForwardedوX-Real-IPوX-Forwarded-Protoالخاصة بالعميل. ويضبطX-Real-IPعلى العنوان الذي جاء منه الاتصال، ويضيف ذلك العنوان إلى نهايةX-Forwarded-For؛ والمُدخل الأخير وحده فيX-Forwarded-Forهو ما يشهد به البروكسي.
اطّلع على ما يفعله WAF
الطلب المُمرَّر لا يترك سطرًا في السجل، ولا تُسجَّل أي ترويسة أو جسم أبدًا؛ أما استعلام الطلب المحجوب فيُسجَّل، في حدود ما تبلغه الـ 200 بايت. ولا يمكن لما يرسله العميل أن يكتب على طرفيتك: فـWAF يكتب سجله بأحرف ASCII قابلة للطباعة.
ما لا يفعله WAF
- لا TLS. يعمل بـHTTP/1.1 العادي على منفذه.
- لا HTTP/2: يرد عليه بـ400.
- لا WebSocket، ولا أي
Upgradeآخر: 501. - لا فحص لمحتوى الأجسام. يُقاس الجسم ولا يُقرأ أبدًا. قائمة طلبات المسح قصيرة، وهي مرشّح للضجيج لا ضمان: لا يزال التطبيق هو من يتحقق من مدخلاته.
- لا مصادقة. من يحق له استدعاء التطبيق أمرٌ يقرره التطبيق، وقائمة جدار الحماية.
- العنوان الواحد عميل واحد. العملاء خلف NAT أو بروكسي أو CDN واحد يتشاركون معدلًا واحدًا وحظرًا واحدًا؛ والعميل الذي له عناوين كثيرة له معدلات بعددها.
- يُنسى الحظر والأعداد عند إعادة تشغيل WAF.
- يتذكر 8192 عنوانًا على الأكثر ويحتفظ بـ1024 اتصالًا على الأكثر في وقت واحد.
- يستمع على IPv4 فقط، لذا فإن مُدخل IPv6 في
app_allowلا يصل إلى شيء حتى الآن. - يُقارَن المسار بالبايتات التي يُفك ترميزه إليها. التطبيق الذي يقرأ المسارات بتساهل أكبر (متجاهلًا حالة الأحرف أو معاملات
;، أو فاكًّا الترميز مرتين) يمكن الوصول إليه باسم لا يغطيهdeny_paths. أماallow_pathsفليس فيه هذه الثغرة: ما لم يُدرَج لا يُمرَّر. - القارئ البطيء يُخدَم حتى النهاية. العميل الذي يواصل تلقي الرد، مهما كان بطيئًا، يُخدَم حتى النهاية.
- يمكن للإغراق أن يقطع رفعًا كبيرًا. يعمل WAF على خيط واحد، لذا يمكن للإغراق أن يقطع رفعًا كبيرًا بـ408. والتطبيق الذي يقبل أجسامًا كبيرة يرفع
body_timeout_secsمعmax_body_bytes.
دليل الـ worker يتضمن كل قاعدة، بما في ذلك متى يُرجأ تغيير
app_allow حتى النشر التالي.





