رؤى · مقال · الهندسة · أبريل 2026
العزل في قاعدة البيانات المشتركة، وسياق الجلسة، ومخاطر الترحيل، ومنافذ الاستثناء للقلة من المستأجرين الذين يحتاجون إلى بنية تحتية مخصّصة، دون أن تتفرع قاعدة الشيفرة إلى نسخ منفصلة.
يَعِد أمان مستوى الصف (RLS) بتكاليف تشغيل أقل من تخصيص قاعدة بيانات معزولة لكل مستأجر. لكنه يتطلب انضباطاً لا يتراخى في استخدام عمود tenant_id، وربطاً آمناً لسياق الجلسة، واختبارات تثبت أن أي مستأجر لا يستطيع قراءة بيانات غيره.
تواجه منصات البرمجيات كخدمة (SaaS) متعددة المستأجرين، التي يخدم فيها النظام الواحد عملاء عدة بمعزل بعضهم عن بعض، قراراً معمارياً جوهرياً في مرحلة مبكرة من عمرها. فتخصيص قاعدة بيانات لكل مستأجر يبسّط العزل، لكنه يضاعف الأعباء التشغيلية مع نمو عدد العملاء إلى المئات أو الآلاف. أما قواعد البيانات المشتركة المحمية بأمان مستوى الصف فتوحّد البنية التحتية وتكاليفها، وتبسّط عمليات النشر. والثمن المقابل واضح: على كل طبقة في التطبيق أن تفرض حدود المستأجرين باتساق، من طبقة ربط الكائنات بقاعدة البيانات (ORM)، مروراً بالمهام الخلفية، ووصولاً إلى خطوط معالجة بيانات التحليلات.
ويبسّط نهج قاعدة البيانات الواحدة أيضاً إعداد التقارير الشاملة لجميع المستأجرين، وعمليات ترحيل المخططات، وإدارة الاتصالات. فمجمّع اتصالات واحد يخدم جميع المستأجرين، بدلاً من توجيه الحركة عبر عشرات أو مئات النسخ المعزولة. وتتعاظم هذه المزايا مع التوسع، لكنها تُدخل فئة من الأخطاء البرمجية لا تواجهها البنى المعزولة أبداً. فغياب شرط WHERE، أو عملية خلفية غير مقيّدة بنطاق المستأجر، قد يكشف بيانات عميل لعميل آخر في أجزاء من الثانية، فيُنشئ مسؤولية قانونية وضرراً بالسمعة معاً.
وحّد آلية تحديد المستأجر عند المصادقة، سواء عبر المطالبات المضمّنة في رموز JWT، أو متغيرات الجلسة، أو خطافات مجمّع الاتصالات. ويجب ضبط سياق المستأجر في كل مسار استعلام قبل أن يصل إلى الاتصالات المشتركة في المجمّع.
يوفّر نظام PostgreSQL دعماً مدمجاً لأمان مستوى الصف عبر تعليمات CREATE POLICY المرتبطة بمتغيرات الجلسة. فضبط متغير جلسة مثل app.current_tenant يحمل معرّف المستأجر الحالي في بداية كل معاملة يضمن أن تُرشَّح جميع الاستعلامات اللاحقة وفق تلك القيمة تلقائياً. ويجعل هذا النهج تحديد نطاق المستأجر مركزياً في طبقة قاعدة البيانات، بدلاً من الاعتماد كلياً على أن يتضمن كل استعلام في التطبيق المرشّح الصحيح. وتوفّر قواعد بيانات أخرى آليات مماثلة، وإن اختلفت تفاصيل التنفيذ وخصائص الأداء اختلافاً كبيراً.
يُدخل تجميع الاتصالات تعقيداً إضافياً على سياق المستأجر القائم على الجلسة. فأدوات مثل PgBouncer العاملة في وضع المعاملات تعيد ضبط حالة الجلسة بين معاملة وأخرى، لذا يجب ضبط سياق المستأجر داخل كل كتلة معاملة، لا مرة واحدة لكل اتصال. والفرق التي تغفل هذا التمييز تكتشفه غالباً في بيئة الإنتاج، حين تحمل الاتصالات المشتركة معرّفات مستأجرين قديمة من طلبات سابقة، فتقدّم البيانات بصمت إلى عميل آخر غير صاحبها. لذا تحقّق دائماً من توافق إعدادات أداة التجميع مع استراتيجية RLS قبل الإطلاق.

تتطلب كتابة سياسات فعّالة لأمان مستوى الصف دراسة متأنية لمساري القراءة والكتابة معاً. فسياسات SELECT تمنع القراءة غير المصرّح بها، لكن سياسات INSERT وUPDATE وDELETE لا تقل عنها أهمية. فالمستأجر الذي لا يستطيع قراءة غير صفوفه، لكنه يُدرج بالخطأ بيانات في قسم مستأجر آخر، يفتح باباً خفياً لتلف البيانات لن تكتشفه أبداً اختبارات القراءة المعتادة. لذا تعامل مع كل نوع من العمليات بوصفه حداً أمنياً مستقلاً يحتاج إلى تعريف سياسة خاص به وتغطية اختبارية مخصّصة.
الرفض الافتراضي هو نقطة البداية الأكثر أماناً لأي إعداد لأمان مستوى الصف في بيئة متعددة المستأجرين. فعّل RLS على كل جدول يخزّن بيانات مرتبطة بالمستأجر، واكتب عبارات USING صريحة لكل نمط وصول مسموح. فالجداول التي لم يُفعَّل فيها RLS تسمح بالوصول الكامل بصمت، أي أن جدولاً منسياً قد يكون منفذاً لتسرّب البيانات. ويساعد الاحتفاظ بسجل لجميع الجداول المرتبطة بالمستأجرين على التقاط الثغرات خلال مراجعة الشيفرة والتدقيق الآلي للسياسات.
أدوات الإدارة والدعم عالية الخطورة. فميزات الدخول بهوية العميل تحتاج إلى تسجيل الأحداث، وموافقات، وحدود زمنية. وتكفي جلسة واحدة منسية للدخول بهوية عميل لتتصدر عناوين الأخبار.
ينبغي أن يحفظ سجل التدقيق، عن كل وصول بصلاحيات مرتفعة، هوية المشغّل، والمستأجر المستهدف، والطابع الزمني، والبيانات المحددة التي اطّلع عليها. ويضمن حفظ هذه السجلات في نظام غير قابل للتعديل يقبل الإضافة فقط أن تجد تحقيقات ما بعد الحادث أدلة موثوقة. وسيطلب العملاء الخاضعون لعمليات تدقيق الامتثال سجلات الوصول، والقدرة على تقديمها عند الطلب تبني الثقة وتسرّع دورات إبرام الصفقات مع المشترين الحريصين على الأمن.
يجب أن تملأ عمليات الترحيل أعمدة المستأجر بأثر رجعي، وأن تتحقق من القيود قبل تفعيل السياسات. فعمليات الترحيل الجزئية تخلّف ثغرات صامتة.
تتطلب عمليات ترحيل المخططات في بيئة متعددة المستأجرين محمية بأمان مستوى الصف حذراً إضافياً مع القيم الافتراضية وقيود NOT NULL على أعمدة معرّف المستأجر. فإضافة عمود tenant_id إلى جدول قائم دون قيمة افتراضية ستفشل إذا كانت الصفوف الموجودة تفتقر إلى هذا المعرّف. ويجب تشغيل نصوص التعبئة بأثر رجعي قبل فرض القيود، وأن تكون الفترة بين التعبئة وتفعيل السياسة أقصر ما يمكن للحد من التعرض للمخاطر.
تساعد مفاتيح تفعيل الميزات على تعميم سياسات RLS الجديدة على مراحل عبر مجموعات المستأجرين. فتفعيل السياسة أولاً لمجموعة صغيرة من المستأجرين الداخليين أو التجريبيين يكشف الحالات الاستثنائية قبل أن تمس قاعدة العملاء بأكملها. ولأن التراجع عن سياسة في قاعدة البيانات أكثر إرباكاً من تبديل مفتاح تفعيل ميزة، فإن الجمع بين الآليتين يمنح الفرق مسار تعافٍ أسرع وأكثر أماناً خلال حوادث الترحيل.
يتغير ضبط الأداء مع أمان مستوى الصف. فينبغي أن تتوافق الفهارس مع الاستعلامات المقيّدة بنطاق المستأجر. كما أن خطط التنفيذ في سياق المستأجر تختلف عن المعاينات التي يراها المستخدم الأعلى صلاحية.
تحسّن الفهارس المركّبة التي يتصدرها عمود tenant_id أداء الاستعلامات في ظل أمان مستوى الصف. فمن دون معرّف المستأجر في مقدمة الفهرس، قد يفحص محرك قاعدة البيانات أجزاء كبيرة من الفهرس قبل أن يرشّح النتائج وصولاً إلى مستأجر واحد، فتضيع فائدة الفهرسة كلياً. لذا راجع خطط التنفيذ دائماً ضمن جلسة مقيّدة بنطاق المستأجر لا ضمن جلسة المستخدم الأعلى صلاحية، لترى تكاليف الاستعلام الواقعية التي تعكس بدقة ما يجري فعلياً في بيئة الإنتاج لعملائك.
قد لا يطبّق مخطِّط تنفيذ الاستعلامات شروط أمان مستوى الصف دائماً داخل الاستعلامات الفرعية أو تعبيرات الجداول المشتركة بالطريقة التي يتوقعها المطورون. فالاستعلامات المعقدة التي تتضمن عمليات ربط بين عدة جداول مقيّدة بنطاق المستأجر قد تُنتج خططاً يُطبَّق فيها مرشّح RLS في مرحلة متأخرة عما هو مقصود، ما يؤدي إلى فحص بيانات لا حاجة إليه. ويكشف تحليل الاستعلامات البطيئة باستخدام الأمر EXPLAIN ANALYZE في سياق المستأجر هذه الاختناقات، ويوجّه جهود التحسين المركّزة.
قد يحتاج كبار المستأجرين في نهاية المطاف إلى أجزاء مخصّصة من قاعدة البيانات. فصمّم طبقات تضمن قابلية النقل بحيث لا تتكاثر مسارات الشيفرة بلا ضابط حين تنقل كبار العملاء إلى بنية مخصّصة.

تفصل طبقة توجيه المستأجرين عند حدود التطبيق الموقعَ الفعلي لبيانات المستأجر عن بقية قاعدة الشيفرة. فسواء كان المستأجر في قاعدة البيانات المشتركة أو في جزء مخصّص، تُصدر شيفرة التطبيق الاستعلامات نفسها عبر الواجهات نفسها. ويمنع هذا التجريد تباين الميزات بين مستأجري القاعدة المشتركة ومستأجري البنية المخصّصة، وهو من أكثر مصادر الدين التقني شيوعاً على المدى الطويل في منصات SaaS متعددة المستأجرين.
ينبغي أن تشمل تمارين النسخ الاحتياطي والاستعادة اختبارات استعادة على مستوى المستأجر الواحد. فالعملاء الخاضعون للتنظيم سيسألون عما إذا كانت استعادة بيانات مستأجر آخر قد تتسرب إلى بيئتهم.
في قاعدة البيانات المشتركة، تشمل الاستعادة إلى نقطة زمنية محددة جميع المستأجرين في آن واحد، أي أن استعادة يستدعيها خلل في بيانات عميل واحد تؤثر في جميع العملاء في تلك القاعدة. أما النسخ الاحتياطية المنطقية المقيّدة بمستأجر بعينه فتوفّر خيارات استعادة دقيقة دون أثر واسع. ويمكن لأداة pg_dump في PostgreSQL، مع ترشيح المخططات والجداول، إنتاج لقطات خاصة بكل مستأجر، وإن كانت تتطلب نصوصاً برمجية متقنة لالتقاط جميع الجداول المرتبطة واعتماديات المفاتيح الخارجية.
تفرض أطر تنظيمية مثل SOC 2 واللائحة العامة لحماية البيانات (GDPR) والتشريعات الوطنية لحماية البيانات متطلبات محددة لعزل البيانات، وتسجيل الوصول، والمهل الزمنية للإبلاغ عن الاختراقات. ويدعم أمان مستوى الصف الامتثال بفرض حدود المستأجرين في طبقة قاعدة البيانات، لكنه لا يفي تلقائياً بجميع الالتزامات التنظيمية. وعلى الفرق أن تربط كل متطلب امتثال بضابط تقني محدد، وأن تتحقق من التغطية عبر عمليات تدقيق داخلية دورية، بدلاً من افتراض أن RLS وحده يكفي.
وثّق منافذ الوصول الطارئ لفرق الدعم، واحصل على موافقة الإدارة القانونية عليها. فالقواعد المطلقة التي لا تنص على استثناءات موثّقة تدفع إلى نشوء قواعد بيانات موازية غير معتمدة.
تظهر قواعد البيانات الموازية وعمليات تصدير البيانات غير المصرّح بها حين يشعر المهندسون بأن ضوابط الوصول المفرطة في صرامتها تعيق عملهم، فينشئون نسخاً غير رسمية من بيانات الإنتاج لتشخيص مشكلات العملاء. ومنع هذا السلوك يتطلب توفير مسارات مشروعة وخاضعة للتدقيق للوصول إلى بيانات المستأجرين في الطوارئ. فإجراء الوصول الطارئ المصمّم جيداً، الذي يوازن بين السرعة والمساءلة، يزيل كلياً الدافع إلى الالتفاف على الضوابط الأمنية، ويُبقي معلومات العملاء الحساسة داخل الأنظمة الخاضعة للحوكمة في جميع الأوقات.
وأخيراً، أتمت اختبارات التكامل التي تحاول الوصول إلى بيانات مستأجرين آخرين عبر تبديل الجلسات بقصد خبيث. فاجتياز الاختبار مرة واحدة عند الإطلاق لا يكفي، بل شغّله باستمرار ضمن مسار التكامل المستمر (CI).
وإلى جانب اختبارات التكامل، تكشف تمارين تحمّل الأعطال التي تحاكي إخفاق سياق المستأجر مواطن الضعف في مسارات معالجة الأخطاء. فالحقن المتعمّد لمعرّفات مستأجرين فارغة أو غير صالحة في مسارات الطلبات يكشف مسارات الشيفرة التي تتجاوز أمان مستوى الصف بصمت بدلاً من أن تفشل بأمان. وتبني هذه التمارين الثقة بأن أداء النظام يتراجع تدريجياً ودون أضرار في الظروف العدائية، بدلاً من أن يسرّب البيانات عبر حدود المستأجرين. حدّد مواعيدها كل ربع سنة، وناوب بين أعضاء الفريق الذين يصممون سيناريوهات الأعطال للحصول على وجهات نظر جديدة.
تتعامل منصة SaaS السليمة متعددة المستأجرين مع أمان مستوى الصف بوصفه طبقة واحدة ضمن استراتيجية دفاع متعددة الطبقات، لا حلاً قائماً بذاته. فالفحوص على مستوى التطبيق، وتقسيم الشبكة، والتخزين المشفّر، والمراقبة المستمرة، كلها تسهم في وضع عزل متين. وحين تعمل هذه الطبقات معاً، تكسب المنصة ثقة العملاء، وتلبي متطلبات المدققين، وتتوسع بكفاءة دون التضحية بضمانات خصوصية البيانات التي يشترطها عملاء المؤسسات.
نعقد جلسات لمجموعات صغيرة من العملاء والمهتمين دون عروض تقديمية، نركّز فيها على بيئتك التقنية والقيود التي تعمل ضمنها والقرارات التي تنتظرك.