أمان بوابة Kubernetes
افتح مجموعة وانتقل إلى الأمان لتقرّر ما تسمح بوابتها المُدارة بمروره إلى مواقعك وواجهاتك البرمجية. يعمل كل إعداد على البوابة قبل أن يصل الطلب إلى حاوياتك، فلا تحتاج تطبيقاتك إلى أي تغيير.
يسري كل إعداد على كل أسماء المضيفين في المجموعة، أو على الأسماء التي تختارها فقط: اسم مضيف المجموعة نفسه، وأسماؤها الإضافية، ونطاقاتك الخاصة. ويظهر القسم ما دامت البوابة المُدارة مفعّلة، ولا يشمل الخدمات من نوع LoadBalancer.
كيف تُطبَّق التغييرات
- لا يتغيّر شيء حتى تحفظ. أضف وعدّل وأعد الترتيب وأوقف وأزل كما تشاء، ويعدّ القسم تغييراتك غير المحفوظة. يعرض زر مراجعة وحفظ بالضبط ما سيتغيّر، ولا يصل شيء إلى البوابة حتى تؤكّد.
- بعد دقيقة تقريبًا يسري التغيير. تعرض كل قاعدة جارٍ التطبيق حتى تُبلغ المجموعة عنها، ثم مُطبَّقة، أو فشل مع السبب.
- شخصان يعدّلان في الوقت نفسه. إن حفظ أحدهم بعد أن فتحتَ الصفحة، يُرفض حفظك وتُحمَّل أحدث نسخة ويبقى تعديلك على الشاشة، لتراجعه من جديد.
- من يستطيع التغيير. مالكو مساحة العمل ومشرفوها ومطوّروها؛ أما تشغيل القواعد المُدارة فيحتاج إلى مالك أو مشرف. والمشاهدون، وفريق الدعم حين يساعدك، يرون الإعدادات للقراءة فقط.
ما يسري دائمًا على كل اسم مضيف
ما إن يُفعَّل أي إعداد في هذه الصفحة حتى تطبّق البوابة ما يلي على كل أسماء المضيفين في المجموعة، أيًّا كانت إعدادات كل اسم:
- تُنظَّف المسارات. تُدمج الشرطات المكرّرة، ويتلقّى المسار الذي فيه شرطة أو شرطة عكسية مرمّزة (
%2Fأو%5C) الرمز400، فلا يمكن كتابة مسار بطريقتين للإفلات من قاعدة. - تُحسب مقاطع النقاط ذات المعاملات خطوات. مقطع
.أو..تتبعه معاملات;، مثل/static/..;/admin، خطوة صعود في المسار عند بعض الخوادم، فتقرؤه البوابة كذلك وترى كل قاعدة/admin. وإن كُتب بفاصلة منقوطة مرمّزة (%3B) يتلقّى403. - مُهل ملف الأمان وقواعد الترويسات تسري على كل اسم مضيف، ومنها التي لم تعطها إعدادات خاصة بها.
- تُرفض سياسات البوابة الخاصة بك. ما دام أي شيء هنا مفعّلًا، ترفض المجموعة سياسات البوابة الجديدة في مساحات الأسماء الخاصة بك؛ انظر سياساتك الخاصة.
وتعرض مراجعة وحفظ هذه البنود حين يشغّل حفظٌ الأمانَ أول مرة.
يحصل اسم المضيف الذي له إعدادات خاصة به على مستمع خاص به في البوابة. والمسار الخاص بك المثبّت على المستمع الرئيسي للبوابة، بوضع sectionName: http في parentRefs، يتوقف حينها عن الإجابة على ذلك الاسم: تسمّي مراجعة وحفظ كل مسار كهذا، وينتظر الحفظ حتى تؤكّد. أزل sectionName من المسار ليجيب في كل مكان.
النظرة العامة وملف الأمان
تقول النظرة العامة إن كان أحدث تغيير قد طُبِّق، وكم طلبًا رفضته البوابة في آخر ساعة: المحظورة، والتي تجاوزت حد المعدّل، والتي رُفض تسجيل دخولها، والتي رصدتها القواعد المُدارة.
ملف الأمان هو الأساس الذي يحصل عليه كل اسم مضيف في المجموعة:
| متوقف | قياسي | صارم | |
|---|---|---|---|
| المسارات المحظورة | لا شيء | 25: الملفات السرّية ولوحات الإدارة، مثل /.git و/.env و/.ssh و/wp-admin و/phpmyadmin، والنقاط والشرطات المرمّزة مرتين | 31: مسارات القياسي، ومعها نقاط التصحيح مثل /actuator و/debug/pprof |
| أكبر محتوى للطلب | بلا حد | 100 م.ب | 10 م.ب |
| المهلة المتاحة للعميل لإرسال ترويساته | بلا حد | 30 ث | 10 ث |
| إغلاق الاتصالات الخاملة بعد | بلا حد | 300 ث | 60 ث |
| الطلبات في الثانية لكل عنوان | بلا حد | بلا حد | 20 |
| أسماء الترويسات التي فيها شرطة سفلية | مسموحة | مسموحة | مرفوضة |
يشمل المسار المحظور كل ما يبدأ به: /.env يحظر أيضًا /.env.local، و/.git يحظر /.git/config. ويتلقّى طلب أيٍّ منها الرمز 403. يناسب القياسي أغلب المواقع؛ واختر الصارم لواجهة برمجية أو أداة إدارة لا تحتاج أبدًا إلى رفع ملفات كبيرة ولا إلى عملاء بطيئين. ولتقديم أحد المسارات المحظورة عن قصد، أضف قاعدة جدار حماية تسمح به: الطلب المسموح يتخطّى قائمة الملف.
ولضبط الملف بدقّة، عدّل المسارات المحظورة: أضف مساراتك، أو أزل أحد مسارات الملف، أو عُد إلى قائمة الملف، مع وسم كل مسار بـمن الملف أو مخصّص. وفي الحدود، أبقِ قيمة الملف، أو عيّن قيمتك، أو أوقف الحد: محتوى الطلب من 1 إلى 10,240 م.ب، ومهلة إرسال الترويسات من 1 إلى 300 ث، والاتصالات الخاملة من 5 إلى 3,600 ث، والطلبات لكل عنوان من 1 إلى 100,000 في الثانية. وتمرّ التعديلات بالمراجعة نفسها قبل الحفظ، وتبقى قائمتك وحدودك الخاصة عند تغيير الملف. ويسري كلاهما على كل أسماء المضيفين في المجموعة: ولحظر مسار على اسم مضيف واحد فقط، استخدم قاعدة جدار حماية.
قواعد جدار الحماية
تُفحص قواعد جدار الحماية من الأعلى إلى الأسفل لكل طلب، وأول قاعدة تطابقه تقرّر. والطلب الذي لا تطابقه أي قاعدة ينتقل إلى ملف الأمان.
| الإجراء | ما يفعله |
|---|---|
| سماح | يمرّر الطلب. تُتخطّى القواعد التالية ومسارات الملف المحظورة، وتبقى حدود المعدّل تحسبه |
| رفض | يجيب بالرمز 403 |
| سماح حصري | داخل أسماء المضيفين والمسارات والطرق في القاعدة، لا يمرّر إلا الطلبات الآتية من العناوين المدرجة، أو الحاملة للترويسات المدرجة. وكل طلب آخر هناك يتلقّى 403 |
يطابق الطلب القاعدة حين يطابق كل حقل ملأته، ويكفي داخل الحقل الواحد أن يطابق إدخالًا واحدًا منه. والحقل المتروك فارغًا يطابق أي شيء.
- عناوين العملاء: عناوين أو نطاقات IPv4 أو IPv6، مثل
203.0.113.10أو198.51.100.0/24. وهو عنوان الزائر نفسه كما وصل إلى حافة المنصّة. - المسارات: يساوي تمامًا يقارن المسار كله؛ ويبدأ بـ يقارن بدايته نصًّا؛ ويطابق النمط يأخذ تعبيرًا نمطيًا يجب أن يطابق المسار كله، مثل
/api/v[0-9]+/internal/.*. ويقرأ النمط المسار وحده، لا نص الاستعلام بعد?: في قاعدة سماح، يمرّر.*\.css$الطلب/site.css?v=2لا/.env?x=.css. وتبقى الأنماط بسيطة لتبقى سريعة: لا نظر أمامي ولا خلفي ولا إحالات خلفية، وتكراران معدودان على الأكثر مثل{2,5}لا يتجاوز أيٌّ منهما 30، و200 حرف على الأكثر. - الطرق:
GETوPOSTوغيرهما. وعدم اختيار أي طريقة يطابق كل الطرق. وقاعدة رفض أو سماح حصري، وحد المعدّل، التي تسمّي طرقًا تأخذ أيضًاHEADمعGET، وOPTIONS، لأن الخوادم تجيب عنها من المعالجات نفسها. - الترويسات: يجب أن تكون كل ترويسة مدرجة على الطلب بإحدى قيمها. ولا يمكن مطابقة الترويسات التي تضبطها المنصّة، مثل
HostوX-Forwarded-ForوAuthorizationوCookie.
استخدم الأسهم لتغيير الترتيب، والمفتاح لإيقاف قاعدة دون إزالتها.
مثال: حظر /.git و/.env
يحظرهما الملف القياسي أصلًا. فإن كان الملف متوقفًا، أو للتأكّد، أضف قاعدة:
| الحقل | القيمة |
|---|---|
| الاسم | حظر الملفات السرّية |
| الإجراء | رفض |
| المسارات | يبدأ بـ /.git، يبدأ بـ /.env |
| تسري على | كل أسماء المضيفين في هذه المجموعة |
ويعرض قسم قواعد جدار الحماية الفارغ هذه القاعدة مثالًا تبدأ منه.
مثال: السماح بـ /admin من مكتبك فقط
| الحقل | القيمة |
|---|---|
| الاسم | الإدارة من المكتب فقط |
| الإجراء | سماح حصري |
| المسارات | يبدأ بـ /admin |
| عناوين العملاء | عنوان مكتبك، مثل 203.0.113.10 |
| تسري على | اسم المضيف الذي يقدّم صفحات الإدارة فقط |
يتلقّى كل من عداك 403 على /admin وما تحته، ويبقى باقي الموقع كما هو. وإن كان لمكتبك عدة عناوين، فاكتب كلًّا منها في سطر، أو اكتب النطاق.
وقاعدة الرفض أو السماح الحصري المحدودة بأسماء مضيفين تسري أيضًا على اسم المضيف الخاص بالمجموعة، ما لم توقف طبّقها أيضًا على اسم المضيف الخاص بالمجموعة: فأسماء مضيفيك الأخرى تشير إليه، والمسار الذي لا يحدد أسماء مضيفين يقدّم الصفحات نفسها هناك، فيتجاوز طلبٌ لذلك الاسم القاعدة. أما قاعدة السماح فتسري على أسماء المضيفين التي تسمّيها فقط. وتنبّهك مراجعة وحفظ حين يظل مسار يقدّم صفحات القاعدة على اسم مضيف لا تغطيه القاعدة.
تحديد المعدّل
يحدّ حد المعدّل عدد الطلبات التي يرسلها عنوان عميل واحد: محسوبةً لكل اسم مضيف، أو لكل اسم مضيف ومسار حين تحدّد مسارًا. وفوق الحد تجيب البوابة بالرمز 429.
- الحد: عدد الطلبات في الثانية أو الدقيقة أو الساعة.
- الدفعة: يمكن للعميل أن يستهلك حصة المدة كاملة دفعةً واحدة، ثم ينتظر حتى تمتلئ من جديد. فحدّ 600 في الدقيقة يمرّر 600 طلب دفعةً واحدة، ثم نحو 10 في الثانية.
- تسري على: كل أسماء المضيفين أو التي تختارها، ومسار واحد على الأكثر، واختياريًا بعض الطرق فقط.
- وأيضًا على اسم المضيف الخاص بالمجموعة: مفعّل افتراضيًا للحد المحدود بأسماء مضيفين، فلا يتجاوزه عميل عبر الاسم الذي تشير إليه الأسماء الأخرى؛ ويُحتسب هناك على حدة. وتنبّهك مراجعة وحفظ حين يقدّم مسار الصفحات المحدودة على اسم مضيف لا يغطيه الحد.
- يُحسب لكل وكيل. تشغّل البوابة عدة وكلاء ويحسب كلٌّ منهم ما يصله، فتقسم المنصّة كل حد بينهم: يبقى مجموع العميل قريبًا من الحد. والحد الأقل من عدد الوكلاء يمرّر طلبًا واحدًا لكل وكيل.
مثال: تحديد معدّل /api
| الحقل | القيمة |
|---|---|
| الاسم | الواجهة البرمجية |
| الحد | 10 في الثانية |
| المسارات | يبدأ بـ /api |
يستطيع حينها كل عنوان عميل أن يرسل 10 طلبات في الثانية إلى /api على كل اسم مضيف؛ والعميل الذي يتجاوزها يتلقّى 429 حتى تمتلئ حصته. وتبقى الطلبات المسموحة والطلبات التي تمرّرها قاعدة جدار حماية محسوبة.
المصادقة
تطلب المصادقة اسم مستخدم وكلمة مرور قبل أي صفحة من اسم مضيف، في نافذة تسجيل الدخول الخاصة بالمتصفح. استخدمها لمواقع الاختبار والأدوات الداخلية التي لا يجب أن تكون عامة.
- المستخدمون: حتى 50 لكل اسم مضيف، لكلٍّ منهم كلمة مرور من 12 إلى 128 حرفًا.
- تُدخَل كلمات المرور مرة واحدة ولا تُعرض مرة أخرى، لا في لوحة التحكم ولا عبر الواجهة البرمجية: لا تحتفظ المنصّة إلا بقيمة مُجزّأة منها. وحين تعدّل مستخدمًا، اترك كلمة المرور فارغة للإبقاء عليها. واحتفظ بكلمات المرور في مدير كلمات المرور الخاص بك.
- اشتراط عنوان أيضًا: اختياري. مع إدراج عناوين، يحتاج الزائر إلى عنوان مسموح وكلمة مرور صحيحة معًا.
- تتلقّى الطلبات التي بلا كلمة مرور صحيحة الرمز
401. - أيضًا على اسم المضيف الخاص بالمجموعة: مفعّل افتراضيًا. تشير أسماء مضيفيك الأخرى إلى اسم المضيف الخاص بالمجموعة، فالمسار الذي لا يحدد أسماء مضيفين يقدّم الصفحات نفسها هناك أيضًا؛ ومع تفعيل هذا يطلب ذلك الاسم تسجيل الدخول نفسه. وحين تغطيه عمليات تسجيل دخول لعدة أسماء مضيفين، لا يدخل إلا مستخدم تشترك فيه كلها، بكلمة المرور نفسها، ومن عنوان تسمح به كلها؛ وإن لم تشترك في شيء، لا يُدخل اسم المضيف الخاص بالمجموعة أحدًا. أوقفه فقط حين يقدّم ذلك الاسم مواقع يفتحها أي أحد، وأعطِ المسارات المحمية أسماء مضيفين خاصة بها.
- لا يُفتح خطأً أبدًا: إن تعذّرت قراءة كلمة مرور محفوظة، لا يُدخل اسم المضيف أحدًا، ويعلّم قسم الأمان تسجيل الدخول بأنه فشل، حتى تعيّن كلمات المرور من جديد.
وتسجيل الدخول بالرموز (JWT) والدخول الموحّد (OIDC) قادمان قريبًا.
مثال: مصادقة بكلمة مرور لاسم مضيف الاختبار
- في المصادقة، اختر حماية اسم مضيف، ثم اختر اسم مضيف الاختبار، مثل
staging.example.com. - أضف مستخدمًا، مثل
team، بكلمة مرور طويلة. - اختر مراجعة وحفظ. بعد دقيقة، يطلب اسم المضيف واسم المضيف الخاص بالمجموعة اسم المستخدم وكلمة المرور. ولا تطلبه أسماء مضيفيك الأخرى إلا إن قدّم لها مسارٌ الصفحات نفسها: تنبّهك مراجعة وحفظ قبل الحفظ حين يظل مسار بلا أسماء مضيفين، أو بعدة أسماء، يقدّم الصفحات المحمية على اسم مضيف بلا تسجيل دخول. أعطِ ذلك المسار أسماء مضيفين خاصة به، أو احمِ تلك الأسماء أيضًا.
CORS
يسمح CORS لصفحات الويب على مصادر أخرى باستدعاء اسم مضيف من المتصفح، مثل تطبيق صفحة واحدة على https://app.example.com يستدعي واجهة برمجية على api.example.com. تجيب البوابة عن طلبات الفحص المسبق التي يرسلها المتصفح وتضيف ترويسات CORS، فلا تحتاج واجهتك البرمجية إلى ذلك.
| الإعداد | معناه |
|---|---|
| المصادر المسموح بها | https://app.example.com، واحد في كل سطر، أو * لأي مصدر |
| الطرق | الطرق التي تستخدمها تلك الصفحات |
| ترويسات الطلب المسموح بها | ترويسات تتجاوز البسيطة ترسلها الصفحة، مثل content-type |
| ترويسات الاستجابة التي تقرؤها الصفحة | ترويسات تتجاوز البسيطة يقرؤها كود الصفحة |
| مدة تخزين إجابات الفحص المسبق | من 0 إلى 86,400 ثانية، و600 افتراضيًا |
| السماح ببيانات الاعتماد | يسمح للمتصفح بإرسال ملفات تعريف الارتباط، ويحتاج إلى مصادر مسمّاة لا * ولا نمط مثل https://*.example.com |
لكل اسم مضيف إعداد CORS واحد. وإن كان تطبيقك يرسل ترويسات CORS بنفسه، فاترك هذا متوقفًا لاسم مضيفه.
القواعد المُدارة
تفحص القواعد المُدارة كل طلب بحثًا عن الهجمات الشائعة، مثل حقن SQL والبرمجة عبر المواقع واجتياز المسارات، بمجموعة قواعد تحدّثها المنصّة باستمرار.
| الوضع | ما يفعله |
|---|---|
| متوقفة | لا تُفحص الطلبات |
| رصد فقط | تُفحص الطلبات وتُحسب ولا تُحظر أبدًا |
| حظر | الطلبات التي ترصدها القواعد تتلقّى 403 |
تمتد الصرامة من المستوى 1، بإنذارات كاذبة قليلة، إلى المستوى 4، الأشد صرامة. والمستوى الأعلى يلتقط هجمات أكثر ويرصد طلبات عادية أكثر خطأً. ابدأ بوضع رصد فقط على المستوى 1، وراقب العدد في النظرة العامة بضعة أيام، ثم انتقل إلى حظر، وارفع المستوى درجة واحدة في كل مرة.
- الذاكرة. تضيف القواعد المُدارة نحو 600 ميغابايت من الذاكرة إلى كل وكيل من وكلاء البوابة، على عُقد العمل لديك، وتحجزها المنصّة لها. وإن لم تجد عقدة عمل فيها مكان، يقول الأمان ما تفتقر إليه العُقد وينتظر الوكيل: أضف عقدة عمل، أو استخدم عُقدًا أكبر، أو أوقف القواعد المُدارة.
- تسري على. كل أسماء المضيفين، أو التي تختارها ومعها اسم المضيف الخاص بالمجموعة ما لم توقف ذلك، فلا تتجاوز الطلبات القواعد عبر الاسم الذي تشير إليه الأسماء الأخرى. وتنبّهك مراجعة وحفظ حين يقدّم مسار الصفحات نفسها على اسم مضيف لا تغطيه القواعد.
- من يشغّلها. مالك مساحة العمل أو مشرفها. وبعد تشغيلها يستطيع كل من يحق له تغيير المجموعة أن يغيّر الوضع والصرامة، أو يوقفها.
تُطرح القواعد المُدارة تدريجيًا. وحتى تستطيع مجموعة تشغيلها، يعرض القسم قريبًا.
وكلاء البوابة
تمرّر البوابة المُدارة حركتها عبر وكلاء على عُقد العمل لديك، سواء أكان أي إعداد هنا مفعّلًا أم لا.
- كم عددهم. وكيل واحد في مجموعة بعقدة عمل واحدة. وما إن تصبح للمجموعة عقدتا عمل حتى يعمل وكيلان، واحد لكل عقدة، ومع ازدياد الحِمل حتى وكيل لكل عقدة، ستة على الأكثر. ولا تُحتسب عقدة عمل تُبعد قيودُها (taints) الحاوياتِ الأخرى، مثل مجمّع بمعالجات رسومية. ولا يتشارك وكيلان عقدة واحدة ما دام لكلٍّ منهما عقدته، ففقدان عقدة يبقي الآخرين يخدمون؛ وحين تُخلى عقدة أو تتعطل، قد يتشارك وكيلان عقدة واحدة بدل الانتظار.
- ما يحجزونه. يحجز كل وكيل 0.2 من المعالج و256 ميغابايت من الذاكرة على عقدة عمل، و1 غيغابايت مع تشغيل القواعد المُدارة، ويمكنه استخدام معالجين اثنين على الأكثر.
- التحديثات وإخلاء العُقد. يبدأ الوكيل الجديد قبل أن يتوقف القديم، ولا تُخلى عقدة عمل إلا ووكيل آخر يواصل الخدمة، فلا تتوقف الحركة.
- المزيد منهم. في وكلاء البوابة، ارفع على الأقل وعلى الأكثر، حتى 10 لكلٍّ منهما. ولا يعمل أبدًا أكثر من وكيل لكل عقدة: أضف عُقد عمل لتشغيل المزيد. ولا تتجاوز المجموعة الحد الأدنى إلا ما دامت تقدّم مقاييس الحاويات.
سياساتك الخاصة
هذه الإعدادات تخصّ البوابة المُدارة. وما دام أي شيء هنا مفعّلًا، ترفض المجموعة سياسات البوابة الجديدة في مساحات الأسماء الخاصة بك، فلا تحلّ أي منها محلّ هذه الإعدادات. أما السياسة التي كانت موجودة حين شغّلت الأمان فتظل تحلّ محلّ هذه الإعدادات لمساراتها: يعرض الأمان، ومراجعة وحفظ قبل أن تشغّله، كل واحدة منها بمساحة أسمائها واسمها. أزل سياستك لتسري إعدادات المجموعة.
الحدود
| الحد | |
|---|---|
| قواعد جدار الحماية | 200 لكل مجموعة |
| العناوين عبر قواعد جدار الحماية وتسجيل الدخول | 1,000 لكل مجموعة |
| المسارات في قاعدة جدار الحماية الواحدة | 16 |
| الترويسات في قاعدة جدار الحماية الواحدة | 8، لكلٍّ منها 16 قيمة |
| حدود المعدّل | 7 لكل مجموعة، بمسار واحد لكلٍّ منها |
| أسماء المضيفين التي عليها تسجيل دخول | 50، لكلٍّ منها 50 مستخدمًا و100 نطاق عناوين |
| أسماء المضيفين التي عليها CORS | 50، لكلٍّ منها 32 مصدرًا |
| أسماء المضيفين التي لها إعدادات خاصة بها، عبر كل الأقسام | 50 |
الواجهة البرمجية
| الطلب | ما يفعله |
|---|---|
GET /v1/kubernetes/clusters/{id}/gateway/security | الإعدادات، وstatus لكل قاعدة (applied أو pending أو failed أو disabled) مع reason، وrevision |
PUT /v1/kubernetes/clusters/{id}/gateway/security | يستبدل كل قسم موجود في المحتوى: profile أو firewall أو rateLimits أو auth أو cors أو waf. وتبقى الأقسام المتروكة كما هي |
GET /v1/kubernetes/clusters/{id}/gateway/security/stats?windowMinutes=60 | الطلبات المرفوضة، إجمالًا ولكل قاعدة، في آخر 5 إلى 1,440 دقيقة |
يحمل كل طلب PUT قيمة revision التي قرأتها: والطلب الذي بلا هذه القيمة يتلقّى 400، ويُرفض الحفظ بالرمز 409 CONFLICT إن حفظ أحدهم بينهما. ولا تُرسَل password لمستخدم إلا لتعيينها أو تغييرها، ولا تظهر أبدًا في أي استجابة. واستخدم مفتاح API يحمل kubernetes:update للكتابة.
{
"revision": 4,
"firewall": [
{
"name": "Block secret files",
"action": "deny",
"paths": [
{ "type": "prefix", "value": "/.git" },
{ "type": "prefix", "value": "/.env" }
]
}
]
}