انتقل إلى محتوى الدرس
الدرس 63
دورة MySQL

إدارة الصلاحيات والأدوار عبر GRANT و REVOKE ومبدأ أقل الصلاحيات في MySQLMySQL Privileges Roles GRANT REVOKE and Least Privilege

تعلّم إدارة الصلاحيات والأدوار عبر GRANT و REVOKE وتطبيق مبدأ أقل الصلاحيات في MySQL 8 مع أمثلة SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع
مخطط توضيحي لدرس إدارة الصلاحيات والأدوار عبر GRANT و REVOKE ومبدأ أقل الصلاحيات في MySQL
مخطط توضيحي لدرس إدارة الصلاحيات والأدوار عبر GRANT و REVOKE ومبدأ أقل الصلاحيات في MySQL

ينص مبدأ أقل الصلاحيات (Principle of Least Privilege — PoLP) على منح كل مستخدم أو خدمة خلفية أو أداة تقارير الحد الأدنى فقط من الصلاحيات، وعلى أضيق نطاق ممكن من قواعد البيانات والجداول لأداء وظيفته المحددة دون أي صلاحية إضافية:

  • خطورة منح ALL PRIVILEGES ON *.* لتطبيقات الويب: إذا اتصل تطبيق الويب بحساب يملك صلاحيات شاملة أو صلاحية DROP، فإن أي خطأ برمجي أو ثغرة في التطبيق قد تؤدي إلى مسح الجداول بالكامل أو قراءة قواعد بيانات أخرى على نفس الخادم.
  • فصل الصلاحيات حسب طبيعة العمل (Separation of Duties):
    • حساب تطبيق الويب ('shop_app'): يُمنح فقط صلاحيات SELECT, INSERT, UPDATE على قاعدة بيانات المتجر shop_db.* دون صلاحيات تعديل الهيكل (DDL).
    • حساب التحديثات الهندسية ('schema_migrator'): يُستخدم فقط أثناء نشر التحديثات لتنفيذ CREATE, ALTER, INDEX.
    • حساب التقارير والتحليلات ('report_reader'): يُقيد بصلاحية القراءة فقط SELECT على الجداول أو العروض المخصصة.
+-----------------+--------------------+-------------------------------+
| Account         | Target Scope       | Allowed Privileges            |
+-----------------+--------------------+-------------------------------+
| shop_app        | shop_db.*          | SELECT, INSERT, UPDATE        |
| report_reader   | shop_db.orders     | SELECT                        |
+-----------------+--------------------+-------------------------------+
SQL
SHOW GRANTS FOR CURRENT_USER();

SELECT GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE
FROM information_schema.USER_PRIVILEGES
WHERE GRANTEE LIKE '%shop_app%';

يطبق خادم MySQL 8 الرقابة على الصلاحيات عبر تسلسل هرمي يتكون من خمسة مستويات (Scopes) تُحدد بواسطة جملة ON داخل أمر المنح:

  • 1. النطاق الشامل للخادم (ON *.*): يُحفظ في جدول mysql.user وmysql.global_grants، ويسري على جميع قواعد البيانات والجداول في الخادم (يُقتصر على مديري قواعد البيانات فقط).
  • 2. نطاق قاعدة البيانات (ON shop_db.*): يُحفظ في جدول mysql.db، ويسري على كافة الجداول والعروض داخل قاعدة البيانات shop_db وحدها.
  • 3. نطاق الجدول المحدد (ON shop_db.orders): يُحفظ في جدول mysql.tables_priv، ويقصر الصلاحية على جدول واحد بعينه.
  • 4. نطاق العمود (SELECT (order_id, status) ON shop_db.orders): يُحفظ في جدول mysql.columns_priv، ويسمح بقراءة أو تعديل أعمدة محددة فقط مع حجب الأعمدة الحساسة كالرواتب أو رموز الدفع.
  • 5. نطاق البرامج المخزنة (ON PROCEDURE shop_db.calc_tax): يُحفظ في جدول mysql.procs_priv، ويمنح صلاحية التنفيذ EXECUTE لإجراء مخزن أو دالة محددة.
SQL
GRANT SELECT (id, customer_name, order_status)
ON shop_db.orders
TO 'report_reader'@'localhost';

SELECT Grantee, Db, Table_name, Column_name, Column_priv
FROM mysql.columns_priv
WHERE Db = 'shop_db';

محاكي إدارة الصلاحيات والأدوار (GRANT / REVOKE / Roles) في MySQL 8

بعد إنشاء الحساب بأمر CREATE USER، نستخدم الأمر القياسي GRANT لمنحه الصلاحيات الدقيقة التي يحتاجها على قاعدة البيانات أو الجدول المستهدف:

  • GRANT SELECT, INSERT, UPDATE ON shop_db.* TO 'shop_app'@'10.0.1.%';: يمنح حساب التطبيق صلاحيات القراءة والإدراج والتحديث على جميع جداول قاعدة البيانات shop_db.
  • GRANT SELECT ON shop_db.products TO 'report_reader'@'localhost';: يمنح صلاحية القراءة فقط على جدول المنتجات وحده.
  • تجنب منح WITH GRANT OPTION لحسابات التطبيقات: تسمح هذه الإضافة للمستخدم بمنح صلاحياته لحسابات أخرى؛ لذا يجب قصرها على مديري النظام فقط.
  • فصل الإنشاء عن المنح في MySQL 8: لم يعد خادم MySQL 8 يقبل كتابة IDENTIFIED BY داخل أمر GRANT؛ بل يجب إنشاء المستخدم أولاً بـ CREATE USER ثم منحه الصلاحيات بـ GRANT.
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
SQL
GRANT SELECT, INSERT, UPDATE
ON shop_db.*
TO 'shop_app'@'10.0.1.%';

GRANT SELECT
ON shop_db.products
TO 'report_reader'@'localhost';

تتطلب المراجعة الأمنية الدورية فحص الصلاحيات الفعلية الممنوحة لكل حساب عبر SHOW GRANTS، وسحب أي صلاحية زائدة فوراً عبر الأمر القياسي REVOKE:

  • SHOW GRANTS FOR 'shop_app'@'10.0.1.%';: يعرض قائمة دقيقة بجميع جمل GRANT المطبقة حالياً على هذا الحساب.
  • REVOKE UPDATE ON shop_db.* FROM 'shop_app'@'10.0.1.%';: يسحب صلاحية التحديث فوراً من الحساب مع الإبقاء على صلاحيتي SELECT وINSERT دون تأثر.
  • قاعدة تطابق النطاق عند السحب: لسحب صلاحية مُنحت على مستوى قاعدة البيانات (ON shop_db.*)، يجب تحديد نفس النطاق تماماً (ON shop_db.*) داخل جملة REVOKE.
  • REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host';: يجرد الحساب من كافة الصلاحيات في جميع المستويات ويعيده إلى حالة USAGE الأساسية دون حذف الحساب نفسه.
+------------------------------------------------------------------+
| Grants for [email protected].%                                     |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `shop_app`@`10.0.1.%`                      |
| GRANT SELECT, INSERT ON `shop_db`.* TO `shop_app`@`10.0.1.%`     |
+------------------------------------------------------------------+
SQL
SHOW GRANTS FOR 'shop_app'@'10.0.1.%';

REVOKE UPDATE
ON shop_db.*
FROM 'shop_app'@'10.0.1.%';

SHOW GRANTS FOR 'shop_app'@'10.0.1.%';

بدلاً من تكرار أوامر المنح الفردية لعشرات المطورين أو الخدمات، يوفر خادم MySQL 8 نظام التحكم بالوصول المبني على الأدوار (Role-Based Access Control — RBAC)، حيث يمثل الدور حزمة صلاحيات مسماة قابلة لإعادة الاستخدام:

  • CREATE ROLE IF NOT EXISTS 'app_read_only', 'app_writer';: ينشئ أدواراً وظيفية معيارية على مستوى الخادم.
  • GRANT SELECT ON shop_db.* TO 'app_read_only';: يمنح الصلاحيات للدور الوظيفي نفسه.
  • GRANT 'app_read_only' TO 'report_reader'@'localhost';: يُسند الدور الوظيفي إلى حساب المستخدم (أو عدة حسابات معاً).
  • SET DEFAULT ROLE ALL TO 'report_reader'@'localhost';: خطوة جوهرية؛ لأن الأدوار الممنوحة في MySQL 8 تكون غير مفعلة افتراضياً عند تسجيل الدخول ما لم يتم تفعيلها تلقائياً عبر SET DEFAULT ROLE أو داخل الجلسة عبر SET ROLE ALL.
  • SELECT CURRENT_ROLE();: يتحقق من الدور الوظيفي النشط حالياً في الجلسة.
+--------------------+
| CURRENT_ROLE()     |
+--------------------+
| `app_read_only`@`%` |
+--------------------+
SQL
CREATE ROLE IF NOT EXISTS 'app_read_only', 'app_writer';

GRANT SELECT ON shop_db.* TO 'app_read_only';
GRANT INSERT, UPDATE ON shop_db.* TO 'app_writer';

GRANT 'app_read_only' TO 'report_reader'@'localhost';
SET DEFAULT ROLE ALL TO 'report_reader'@'localhost';

SELECT CURRENT_ROLE();
DROP ROLE IF EXISTS 'app_writer';

يلخص الجدول المرجعي التالي أهم الصلاحيات ونطاقاتها وأوامر الأدوار الوظيفية (RBAC) في خادم MySQL 8:

الصلاحية / الأمرالنطاق المستهدف (Scope)الحساب الموصى به أمنياً
SELECTقاعدة بيانات أو جدول أو عمودحسابات التقارير والتحليلات وتطبيقات القراءة
INSERT, UPDATE, DELETEقاعدة بيانات أو جدول (shop_db.*)حسابات تطبيقات الويب والخدمات الخلفية
CREATE, ALTER, INDEX, DROPقاعدة بيانات (shop_db.*)حسابات نشر التحديثات الهيكيلة (Migrations) فقط
EXECUTEالبرامج المخزنة (PROCEDURE)الخدمات التي تستدعي الإجراءات والدوال المخزنة
CREATE ROLE / GRANT roleسجل الأدوار العام في الخادمتجميع الصلاحيات القياسية وإسنادها للمستخدمين
SET DEFAULT ROLE ALL TO ...حالة تسجيل دخول المستخدمتفعيل الأدوار الممنوحة تلقائياً فور اتصال الحساب

ملخص الدرس: أتقنت في هذا الدرس تصميم الصلاحيات وفق مبدأ أقل الصلاحيات (PoLP)، والمستويات الخمسة لنطاقات الصلاحيات، وأوامر GRANT وREVOKE وSHOW GRANTS، وإدارة الأدوار الوظيفية (RBAC) في MySQL 8.
الخطوة التالية والدرس القادم: انتقل إلى الدرس التالي لتعلّم النسخ الاحتياطي واستعادة قواعد البيانات عبر أداة mysqldump والسجل الثنائي.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

يضمن تطبيق مبدأ أقل الصلاحيات عبر أوامر GRANT وREVOKE والأدوار الوظيفية (CREATE ROLE وSET DEFAULT ROLE) عزل كل خدمة ضمن حدودها الأمنية الدقيقة. الخطوة التالية: انتقل الآن إلى درس «النسخ الاحتياطي واستعادة قواعد البيانات عبر أداة mysqldump في MySQL».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 User Privileges صلاحيات المستخدمين
تعلّم إدارة الصلاحيات والأدوار عبر GRANT و REVOKE وتطبيق مبدأ أقل الصلاحيات في MySQL 8 مع أمثلة SQL وتطبيقات تفاعلية.
للمراجعة
02 Principle of Least Privilege Design مبدأ أقل الصلاحيات الأمني
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم مبدأ أقل الصلاحيات الأمني في خادم MySQL 8.4.
للمراجعة
03 Privilege Scopes Global to Column نطاقات الصلاحيات من الخادم للعمود
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم نطاقات الصلاحيات من الخادم للعمود في خادم MySQL 8.4.
للمراجعة
04 Granting Permissions with GRANT منح الصلاحيات بأمر GRANT
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم منح الصلاحيات بأمر GRANT في خادم MySQL 8.4.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PoLP PoLP
Principle of Least Privilege
مبدأ أقل الصلاحيات الأمني الذي يقتضي منح كل حساب أو خدمة الحد الأدنى فقط من الصلاحيات اللازمة لأداء عمله.
للمراجعة
02 RBAC RBAC
Role-Based Access Control
نموذج التحكم بالوصول المبني على الأدوار عبر تجميع الصلاحيات في أدوار مسماة وإسنادها للمستخدمين.
للمراجعة
03 DCL DCL
Data Control Language
لغة التحكم بالبيانات في SQL وتشمل أوامر منح وسحب الصلاحيات مثل GRANT و REVOKE.
للمراجعة
04 DBA DBA
Database Administrator
مدير قواعد البيانات المسؤول عن سياسات الأمان ومراجعة الصلاحيات والنسخ الاحتياطي.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ جمل SQL الواردة في قسم مبدأ أقل الصلاحيات الأمني داخل بيئة MySQL 8 المحلية وتحقق من المخرجات.

  2. جرّب الحالات الثلاث داخل محاكي إدارة الصلاحيات والأدوار (GRANT / REVOKE / Roles) في MySQL 8 في قسم نطاقات الصلاحيات من الخادم للعمود وقارن سلوك المحرك.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

6أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي6 أسئلة تنتظرك
01

ماذا يقتضي مبدأ أقل الصلاحيات (Principle of Least Privilege) عند إعداد حساب MySQL خاص بتطبيق ويب؟

منح الحساب الحد الأدنى فقط من الصلاحيات اللازمة لعمله على قاعدة بيانات التطبيق المحددة دون صلاحيات شاملة على الخادم.

02

أي صيغة في أمر GRANT تقيد المستخدم بقراءة أعمدة محددة فقط (مثل id و order_status) داخل جدول واحد؟

تحديد أسماء الأعمدة بين قوسين بعد اسم الصلاحية يطبق الرقابة على مستوى العمود (Column Scope).

03

أي أمر SQL يعرض قائمة دقيقة بجميع الصلاحيات والأدوار الممنوحة حالياً للحساب 'shop_app'@'10.0.1.%'؟

يعرض الأمر SHOW GRANTS FOR 'user'@'host' كافة الصلاحيات المسندة للحساب.

04

أي أمر SQL يسحب صلاحية UPDATE على قاعدة البيانات shop_db.* من الحساب 'shop_app'@'10.0.1.%' دون حذف الحساب؟

يسحب الأمر REVOKE UPDATE ON shop_db.* FROM ... صلاحية التحديث فقط مع بقاء الحساب نشطاً.

05

بعد إسناد دور وظيفي (Role) إلى مستخدم في MySQL 8، أي أمر يجعل هذا الدور يتفعل تلقائياً عند كل تسجيل دخول للمستخدم؟

يضبط الأمر SET DEFAULT ROLE الأدوار الممنوحة لتصبح نشطة تلقائياً فور تسجيل دخول المستخدم.

06

في خادم MySQL 8، يؤدي تنفيذ أوامر GRANT أو REVOKE القياسية إلى تحديث الصلاحيات في ذاكرة الخادم فوراً دون الحاجة لإعادة تشغيل الخادم.

صواب؛ تحدّث أوامر GRANT و REVOKE القياسية جداول الصلاحيات في الذاكرة لحظياً.