PostgreSQL / المتوسط: التزامن وSQL القابلة للصيانة / الدرس 10
الأدوار والمصادقة وصلاحيات المخطط
افصل هوية الدخول والوصول للقاعدة وصلاحيات الكائن، وصمم دور تقرير محدوداً دون إضعاف المصادقة أو الثقة بمخططات قابلة للكتابة.
في هذه الصفحة
أهداف الدرس
- شرح الأدوار وقواعد HBA ذات المطابقة الأولى.
- تمييز CONNECT وUSAGE ومنح الجداول.
توحد الأدوار المستخدمين والمجموعات
تملك الأدوار الكائنات والمنح والعضوية، وتميز LOGIN الدور القادر على بدء جلسة. لا تستخدم PostgreSQL هوية user@host الخاصة بـ MySQL؛ تضبط إعدادات الاتصال وpg_hba.conf القبول والمصادقة ثم تفحص صلاحيات الكائن. لا يمنح الدخول كل الجداول. افصل التشغيل والترحيل والمراقبة ولا تستخدم المستخدم الفائق للطلبات العادية.
افحص الهوية والإمكانات الفعلية
تفحص الدوال الهوية وصلاحيات محددة في جلسة تدريب مصرح لها. تتيح USAGE حل أسماء المخطط ولا تمنح SELECT. تسمح CONNECT بالاتصال مع بقية شروط القبول. تحتاج دالة الجدول كائناً موجوداً، فلا يعد خطأ الغياب جواب صلاحية سالباً. تعتمد القيم على المنح والملكية والعضوية ولا نختلقها.
SELECT session_user, current_user;
SELECT has_database_privilege(current_user, current_database(), 'CONNECT');
SELECT has_schema_privilege(current_user, 'quay_lab', 'USAGE');
SELECT has_table_privilege(current_user, 'quay_lab.bookings', 'SELECT');
افحص كل طبقة مستقلة ولا تمنح هذه الدوال شيئاً.
تحسم أول قاعدة HBA مطابقة المصادقة
تميز pg_hba.conf المقبس المحلي عن TCP وتطابق القاعدة والدور والعنوان. تستخدم أول قاعدة مطابقة ولا تنتقل للتالية عند فشل المصادقة. تتحقق peer من هوية النظام وscram-sha-256 من تبادل كلمة مناسب، مع أثر TLS والعميل. لا تعالج الفشل بإضافة trust واسعة. أصبح دعم MD5 مهملاً في 18؛ استخدم عملاء SCRAM ودليل الإصدار.
امنح دور التقرير نطاقه المطلوب فقط
يفترض مثال الإدارة وجود quay_reporter والمخطط وتطبيق مالك مصرح داخل مختبر مؤقت. منح USAGE وSELECT لجدول أضيق من كل الجداول الحالية والمستقبلية. تحدد العضوية والوراثة وصول الخدمة، والملكية مصدر تحكم قوي، فلا تجعل دور التشغيل مالكاً لكل الجداول. لا ينشئ المقرر حسابات حقيقية أو يضمن كلمات مرور.
GRANT USAGE ON SCHEMA quay_lab TO quay_reporter;
GRANT SELECT ON TABLE quay_lab.bookings TO quay_reporter;
SELECT has_table_privilege('quay_reporter', 'quay_lab.bookings', 'SELECT');
بعد نجاح المنح تكون SELECT صحيحة للجدول المحدد ولا تُستنتج صلاحيات أخرى.
تحتاج الكائنات المستقبلية والمسارات سياسة
تؤثر ALTER DEFAULT PRIVILEGES في كائنات مستقبلية ينشئها الدور المعني لا الموجود أو كل المنشئين تلقائياً. راجع ملكية الترحيل قبل توقع القراءة. تختلف افتراضات public حسب الإصدار والترقية. تحتاج SECURITY DEFINER مساراً ومنحاً مضبوطين حتى لا يوجه المستدعي الحل المميز. اختبر رفض العمليات الأخرى والقراءة بحساب الخدمة.
الأخطاء الشائعة وإصلاحها
permission denied for schema (42501)
- لماذا يحدث؟
- يفتقد الدور صلاحية المخطط اللازمة لحل الكائن.
- كيف تصلحه؟
- راجع USAGE وامنحها بنطاق ضيق عبر التجهيز المصرح.
- كيف تتجنب تكراره؟
- اختبر صلاحيات المخطط والجدول منفصلة.
password authentication failed for user (28P01)
- لماذا يحدث؟
- لا تتطابق طريقة HBA أو الاعتماد أو إمكان العميل.
- كيف تصلحه؟
- افحص القاعدة والاعتماد دون توسيع الوصول.
- كيف تتجنب تكراره؟
- وثق المقبس وTCP والدور والقاعدة وTLS وSCRAM.
لا يقرأ الدور جدول ترحيل جديداً
- لماذا يحدث؟
- ضبطت الافتراضات لمنشئ آخر أو منحت الجداول القديمة فقط.
- كيف تصلحه؟
- افحص المالك وطبق سياسة الموجود والمستقبل المراجعة.
- كيف تتجنب تكراره؟
- ضمّن مالك الترحيل في فحص قبول الصلاحيات.
اختبر فهمك
1. يملك الدور SELECT على quay_lab.bookings ولا يحل الاسم. ما النطاق الإضافي؟
اعرض الحل المشروح
افحص USAGE على quay_lab والقاعدة المقصودة. صلاحية الجدول وحل المخطط منفصلتان. امنح المطلوب بإجراء المالك ثم اختبر قراءة الجدول ورفض غيره والكتابة، ولا تستخدم المستخدم الفائق كحل.
2. لماذا لا تغطي افتراضات app_owner جدولاً ينشئه deploy_owner؟
اعرض الحل المشروح
ترتبط الافتراضات بمنشئ الكائن المستقبلي لا سياسة مخطط عامة مستقلة عن الملكية. افحص منفذ CREATE TABLE وSET ROLE إن وجدت، واضبط سياسة المنشئ وعالج القديم منفصلاً ثم اختبر بعد ترحيل ممثل.
أهم ما تعلمته
- الدخول وHBA وحل المخطط والوصول للجدول فحوص منفصلة.
- الملكية ومنح الكائنات المستقبلية من تصميم الترحيل.