Skip to content
VDS · قواعد البيانات

المستخدمون والصلاحيات في قاعدة البيانات

كيفية إنشاء مستخدم منفصل لكل تطبيق في 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، لا في الشيفرة. عند الاختراق تغيّر سطرًا واحدًا وتعيد التشغيل، بدل إعادة بناء المشروع كله.