في هذا الدرس 6تصفّح المواضيع
ينص مبدأ أقل الصلاحيات (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 |
+-----------------+--------------------+-------------------------------+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لإجراء مخزن أو دالة محددة.
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)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.%` |
+------------------------------------------------------------------+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`@`%` |
+--------------------+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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
- مدير قواعد البيانات المسؤول عن سياسات الأمان ومراجعة الصلاحيات والنسخ الاحتياطي.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ جمل SQL الواردة في قسم مبدأ أقل الصلاحيات الأمني داخل بيئة MySQL 8 المحلية وتحقق من المخرجات.
-
جرّب الحالات الثلاث داخل محاكي إدارة الصلاحيات والأدوار (GRANT / REVOKE / Roles) في MySQL 8 في قسم نطاقات الصلاحيات من الخادم للعمود وقارن سلوك المحرك.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي6 أسئلة تنتظرك +
ماذا يقتضي مبدأ أقل الصلاحيات (Principle of Least Privilege) عند إعداد حساب MySQL خاص بتطبيق ويب؟
منح الحساب الحد الأدنى فقط من الصلاحيات اللازمة لعمله على قاعدة بيانات التطبيق المحددة دون صلاحيات شاملة على الخادم.
أي صيغة في أمر GRANT تقيد المستخدم بقراءة أعمدة محددة فقط (مثل id و order_status) داخل جدول واحد؟
تحديد أسماء الأعمدة بين قوسين بعد اسم الصلاحية يطبق الرقابة على مستوى العمود (Column Scope).
أي أمر SQL يعرض قائمة دقيقة بجميع الصلاحيات والأدوار الممنوحة حالياً للحساب 'shop_app'@'10.0.1.%'؟
يعرض الأمر SHOW GRANTS FOR 'user'@'host' كافة الصلاحيات المسندة للحساب.
أي أمر SQL يسحب صلاحية UPDATE على قاعدة البيانات shop_db.* من الحساب 'shop_app'@'10.0.1.%' دون حذف الحساب؟
يسحب الأمر REVOKE UPDATE ON shop_db.* FROM ... صلاحية التحديث فقط مع بقاء الحساب نشطاً.
بعد إسناد دور وظيفي (Role) إلى مستخدم في MySQL 8، أي أمر يجعل هذا الدور يتفعل تلقائياً عند كل تسجيل دخول للمستخدم؟
يضبط الأمر SET DEFAULT ROLE الأدوار الممنوحة لتصبح نشطة تلقائياً فور تسجيل دخول المستخدم.
في خادم MySQL 8، يؤدي تنفيذ أوامر GRANT أو REVOKE القياسية إلى تحديث الصلاحيات في ذاكرة الخادم فوراً دون الحاجة لإعادة تشغيل الخادم.
صواب؛ تحدّث أوامر GRANT و REVOKE القياسية جداول الصلاحيات في الذاكرة لحظياً.