المستخدمون والصلاحيات في قاعدة البيانات
كيفية إنشاء مستخدم منفصل لكل تطبيق في MySQL وPostgreSQL، ومنح أقل الصلاحيات، والتحقق من عدم السماح بأي شيء إضافي.
آخر تحديث 23 أغسطس 2026
التطبيق الذي يعمل بصلاحيات root أو postgres يسلّم كل قاعدة بيانات على الجهاز إلى المهاجم عند أول ثغرة. أما المستخدم المخصص الذي يملك صلاحيات على مخططه فقط فيحدّ من الضرر بمشروع واحد.
MySQL وMariaDB
المستخدم هنا هو زوج من «الاسم والمضيف»، وهذا هو المصدر الرئيسي للالتباس:
CREATE USER 'shop'@'localhost' IDENTIFIED BY 'long-random-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
FLUSH PRIVILEGES;
'shop'@'localhost' و'shop'@'%' مستخدمان مختلفان بكلمتي مرور مختلفتين. لا تنشئ سجلات بالمضيف % إلا عند الضرورة: فهو يسمح بتسجيل الدخول من أي عنوان.
الصلاحيات على البنية مطلوبة فقط أثناء الترحيلات:
GRANT CREATE, ALTER, DROP, INDEX, REFERENCES ON shop.* TO 'shop_migrate'@'localhost';
فصل دور التطبيق عن دور الترحيل ممارسة جيدة: فالاستعلام العادي عندئذ لا يستطيع فعليًا حذف جدول.
تحقق:
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'shop'@'localhost';
تغيير كلمة المرور والحذف:
ALTER USER 'shop'@'localhost' IDENTIFIED BY 'new-password';
DROP USER 'shop'@'localhost';
PostgreSQL
الدور وصلاحياته على قاعدة البيانات والمخطط:
CREATE ROLE shop WITH LOGIN PASSWORD 'long-random-password';
CREATE DATABASE shop OWNER shop;
REVOKE ALL ON DATABASE shop FROM PUBLIC;
لدور للقراءة فقط (التقارير، التحليلات، لوحة المراقبة):
CREATE ROLE reader WITH LOGIN PASSWORD '...';
GRANT CONNECT ON DATABASE shop TO reader;
GRANT USAGE ON SCHEMA public TO reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO reader;
السطر الأخير إلزامي: فبدونه لن يرى الدور الجداول المنشأة بعد منح الصلاحيات، وبعد شهر ستتعطل التقارير على البيانات الجديدة.
تحقق:
\du
\l
\dp
ما يجب إغلاقه
- لا يوجد دور تطبيق بصلاحيات superuser.
- لكل مشروع قاعدة بياناته ومستخدمه الخاص.
- كلمات المرور طويلة وعشوائية، ومختلفة بين المشاريع.
- تسجيل الدخول الخارجي مسموح فقط للعناوين التي تحتاجه — الوصول عن بُعد.
- لا يوجد في MySQL مستخدمون مجهولون ولا قاعدة بيانات اختبار:
mariadb-secure-installationيتولى ذلك.
أخطاء شائعة
| العَرَض | السبب |
|---|---|
Access denied مع كلمة مرور صحيحة | طابقت قاعدة مضيف أخرى، مثل ''@'localhost' |
مُنحت الصلاحيات، لكن SELECT لا يعمل | ينقص PostgreSQL صلاحية USAGE ON SCHEMA |
| الجدول الجديد غير مرئي للدور | لم تُضبط DEFAULT PRIVILEGES |
| حذف التطبيق كل شيء أثناء ترحيل فاشل | كان لدور التطبيق صلاحية DROP |
| كلمة المرور ظاهرة في سجل الأوامر | عيّن كلمات المرور من ملف، ونظّف ~/.mysql_history |
خزّن كلمات مرور قواعد البيانات في ملف بيئة الخدمة بصلاحيات
600، لا في الشيفرة. عند الاختراق تغيّر سطرًا واحدًا وتعيد التشغيل، بدل إعادة بناء المشروع كله.