مستخدمي MySQL والصلاحيات
إدارة المستخدمين والصلاحيات جانب حاسم من أمان قاعدة البيانات. في هذا الدرس، ستتعلم كيفية إنشاء المستخدمين، ومنح الأذونات المناسبة، وتطبيق التحكم في الوصول القائم على الأدوار، واتباع أفضل الممارسات لإدارة المستخدمين في MySQL.
فهم نظام مستخدمي MySQL
تستخدم MySQL نظام امتيازات قوي للتحكم في من يمكنه الوصول إلى قواعد البيانات والعمليات التي يمكنهم تنفيذها. يتم تحديد كل مستخدم من خلال مزيج من اسم المستخدم والمضيف:
تنسيق المستخدم:
'username'@'host'
أمثلة:
'admin'@'localhost' -- وصول محلي فقط
'john'@'192.168.1.100' -- عنوان IP محدد
'mary'@'%.example.com' -- أي مضيف في النطاق
'app_user'@'%' -- أي مضيف (استخدم بحذر!)
تحذير أمني: تجنب استخدام '@'%' (أي مضيف) للحسابات الحساسة. قم دائماً بتقييد الوصول إلى مضيفين محددين أو نطاقات IP لتقليل المخاطر الأمنية.
إنشاء مستخدمي MySQL
إنشاء المستخدمين هو الخطوة الأولى في تنفيذ أمان قاعدة البيانات. استخدم دائماً كلمات مرور قوية وقيد وصول المضيف:
-- إنشاء مستخدم بكلمة مرور
CREATE USER 'john'@'localhost' IDENTIFIED BY 'SecureP@ssw0rd';
-- إنشاء مستخدم مع مكون مصادقة محدد
CREATE USER 'admin'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
-- إنشاء مستخدم مع انتهاء صلاحية كلمة المرور
CREATE USER 'temp_user'@'localhost'
IDENTIFIED BY 'TempPass2024'
PASSWORD EXPIRE INTERVAL 30 DAY;
-- إنشاء مستخدم مع حساب مقفل
CREATE USER 'maintenance'@'localhost'
IDENTIFIED BY 'MaintenancePass'
ACCOUNT LOCK;
أفضل ممارسة: استخدم سياسات كلمات مرور قوية: 12 حرفاً كحد أدنى، مزيج من الأحرف الكبيرة والصغيرة والأرقام والأحرف الخاصة. فكر في استخدام مكون التحقق من كلمة المرور في MySQL.
مستويات الصلاحيات
تعمل امتيازات MySQL على مستويات مختلفة، مما يسمح بالتحكم الدقيق في الوصول:
1. صلاحيات GLOBAL:
تنطبق على جميع قواعد البيانات على الخادم
مثال: GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
2. صلاحيات DATABASE:
تنطبق على قاعدة بيانات محددة
مثال: GRANT ALL ON shop_db.* TO 'app_user'@'localhost';
3. صلاحيات TABLE:
تنطبق على جدول محدد
مثال: GRANT SELECT ON shop_db.products TO 'analyst'@'localhost';
4. صلاحيات COLUMN:
تنطبق على أعمدة محددة
مثال: GRANT SELECT (id, name) ON shop_db.users TO 'viewer'@'localhost';
منح الصلاحيات
استخدم جملة GRANT لتعيين الامتيازات للمستخدمين. إليك سيناريوهات الامتيازات الشائعة:
-- منح جميع الصلاحيات على جميع قواعد البيانات (مسؤول كامل)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- منح صلاحيات على مستوى قاعدة البيانات
GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'app_user'@'localhost';
-- منح وصول للقراءة فقط لقاعدة البيانات
GRANT SELECT ON shop_db.* TO 'readonly_user'@'localhost';
-- منح صلاحيات جدول محددة
GRANT SELECT, INSERT ON shop_db.orders TO 'order_clerk'@'localhost';
-- منح صلاحيات على مستوى العمود
GRANT SELECT (id, email, name), UPDATE (name)
ON shop_db.users TO 'profile_editor'@'localhost';
-- منح صلاحية إنشاء الإجراءات المخزنة
GRANT CREATE ROUTINE, ALTER ROUTINE, EXECUTE
ON shop_db.* TO 'developer'@'localhost';
-- تطبيق التغييرات فوراً
FLUSH PRIVILEGES;
ملاحظة: WITH GRANT OPTION يسمح للمستخدم بمنح امتيازاته للمستخدمين الآخرين. امنح هذا فقط للمسؤولين الموثوقين.
أنواع الصلاحيات الشائعة
فهم الامتيازات المتاحة يساعدك على تطبيق مبدأ الامتياز الأدنى:
صلاحيات البيانات:
SELECT -- قراءة البيانات
INSERT -- إضافة سجلات جديدة
UPDATE -- تعديل السجلات الموجودة
DELETE -- إزالة السجلات
صلاحيات البنية:
CREATE -- إنشاء قواعد بيانات/جداول
ALTER -- تعديل بنية الجدول
DROP -- حذف قواعد بيانات/جداول
INDEX -- إنشاء/حذف الفهارس
صلاحيات إدارية:
CREATE USER -- إنشاء مستخدمين جدد
GRANT OPTION -- منح صلاحيات للآخرين
RELOAD -- إعادة تحميل جداول الامتيازات
SHUTDOWN -- إيقاف الخادم
SUPER -- عمليات إدارية
صلاحيات البرامج المخزنة:
CREATE ROUTINE -- إنشاء إجراءات/دوال مخزنة
ALTER ROUTINE -- تعديل البرامج المخزنة
EXECUTE -- تشغيل الإجراءات المخزنة/الدوال
إلغاء الصلاحيات
عندما لا يحتاج المستخدمون إلى الوصول أو يغيرون الأدوار، ألغِ امتيازاتهم:
-- إلغاء صلاحيات محددة
REVOKE INSERT, UPDATE, DELETE ON shop_db.* FROM 'readonly_user'@'localhost';
-- إلغاء جميع الصلاحيات على قاعدة البيانات
REVOKE ALL PRIVILEGES ON shop_db.* FROM 'old_employee'@'localhost';
-- إلغاء خيار المنح
REVOKE GRANT OPTION ON *.* FROM 'former_admin'@'localhost';
-- تطبيق التغييرات
FLUSH PRIVILEGES;
التحكم في الوصول القائم على الأدوار (MySQL 8.0+)
الأدوار تبسط إدارة الامتيازات من خلال تجميع الأذونات. أنشئ الأدوار مرة واحدة وعيّنها لعدة مستخدمين:
-- إنشاء أدوار
CREATE ROLE 'app_developer', 'app_read', 'app_write';
-- منح صلاحيات للأدوار
GRANT SELECT ON shop_db.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON shop_db.* TO 'app_write';
GRANT ALL PRIVILEGES ON shop_db.* TO 'app_developer';
-- تعيين الأدوار للمستخدمين
CREATE USER 'alice'@'localhost' IDENTIFIED BY 'AlicePass123';
GRANT 'app_developer' TO 'alice'@'localhost';
CREATE USER 'bob'@'localhost' IDENTIFIED BY 'BobPass456';
GRANT 'app_read', 'app_write' TO 'bob'@'localhost';
-- تعيين الدور الافتراضي للمستخدم
SET DEFAULT ROLE 'app_developer' TO 'alice'@'localhost';
-- تفعيل الدور في الجلسة
SET ROLE 'app_developer';
ميزة: تجعل الأدوار من السهل إدارة الأذونات لمجموعات من المستخدمين. غيّر امتيازات الدور مرة واحدة، وسيتم تحديث جميع المستخدمين بهذا الدور تلقائياً.
عرض صلاحيات المستخدم
راجع بانتظام امتيازات المستخدم للحفاظ على الأمان:
-- عرض صلاحيات المستخدم الحالي
SHOW GRANTS;
-- عرض صلاحيات مستخدم محدد
SHOW GRANTS FOR 'john'@'localhost';
-- عرض جميع المستخدمين
SELECT User, Host FROM mysql.user;
-- عرض معلومات تفصيلية عن المستخدم
SELECT User, Host, account_locked, password_expired
FROM mysql.user;
-- عرض جميع الأدوار
SELECT * FROM mysql.role_edges;
-- عرض إعدادات انتهاء صلاحية كلمة المرور
SELECT User, Host, password_lifetime
FROM mysql.user;
سياسات كلمات المرور
نفّذ سياسات كلمات مرور قوية لتعزيز الأمان:
-- طلب تغيير كلمة المرور في أول تسجيل دخول
CREATE USER 'new_employee'@'localhost'
IDENTIFIED BY 'TempPass2024'
PASSWORD EXPIRE;
-- تعيين فترة انتهاء صلاحية كلمة المرور
ALTER USER 'john'@'localhost'
PASSWORD EXPIRE INTERVAL 90 DAY;
-- عدم انتهاء صلاحية كلمة المرور أبداً (غير موصى به)
ALTER USER 'service_account'@'localhost'
PASSWORD EXPIRE NEVER;
-- استخدام انتهاء صلاحية كلمة المرور الافتراضية
ALTER USER 'mary'@'localhost'
PASSWORD EXPIRE DEFAULT;
-- طلب سجل كلمات المرور (MySQL 8.0+)
ALTER USER 'john'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;
إدارة حسابات المستخدمين
عمليات إدارة المستخدم الإضافية:
-- تغيير كلمة مرور المستخدم
ALTER USER 'john'@'localhost' IDENTIFIED BY 'NewSecurePass123';
-- تغيير كلمة المرور الخاصة
SET PASSWORD = 'MyNewPassword456';
-- قفل حساب المستخدم
ALTER USER 'suspended_user'@'localhost' ACCOUNT LOCK;
-- فتح حساب المستخدم
ALTER USER 'suspended_user'@'localhost' ACCOUNT UNLOCK;
-- إعادة تسمية المستخدم
RENAME USER 'old_name'@'localhost' TO 'new_name'@'localhost';
-- حذف المستخدم
DROP USER 'former_employee'@'localhost';
-- حذف عدة مستخدمين
DROP USER 'user1'@'localhost', 'user2'@'localhost';
مهم: وثّق دائماً تغييرات المستخدم. احتفظ بسجل لمن لديه وصول، ومتى تم إنشاء الحسابات، ومتى تم تعديل الامتيازات.
مثال عملي: إعداد مستخدمي التطبيق
لننشئ إعداد مستخدم كاملاً لتطبيق ويب:
-- 1. إنشاء قاعدة البيانات
CREATE DATABASE ecommerce_db;
-- 2. إنشاء مستخدم مسؤول (تحكم كامل)
CREATE USER 'ecom_admin'@'localhost'
IDENTIFIED BY 'AdminSecure2024!';
GRANT ALL PRIVILEGES ON ecommerce_db.* TO 'ecom_admin'@'localhost';
-- 3. إنشاء مستخدم التطبيق (قراءة/كتابة)
CREATE USER 'ecom_app'@'192.168.1.%'
IDENTIFIED BY 'AppPass2024!'
PASSWORD EXPIRE INTERVAL 90 DAY;
GRANT SELECT, INSERT, UPDATE, DELETE ON ecommerce_db.*
TO 'ecom_app'@'192.168.1.%';
-- 4. إنشاء مستخدم التقارير (قراءة فقط)
CREATE USER 'ecom_reports'@'localhost'
IDENTIFIED BY 'ReportsPass2024!';
GRANT SELECT ON ecommerce_db.* TO 'ecom_reports'@'localhost';
-- 5. إنشاء مستخدم النسخ الاحتياطي
CREATE USER 'ecom_backup'@'localhost'
IDENTIFIED BY 'BackupPass2024!';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER
ON ecommerce_db.* TO 'ecom_backup'@'localhost';
-- 6. تطبيق جميع التغييرات
FLUSH PRIVILEGES;
-- 7. التحقق من المنح
SHOW GRANTS FOR 'ecom_app'@'192.168.1.%';
أفضل ممارسات إدارة المستخدمين
✓ مبدأ الامتياز الأدنى:
امنح فقط الأذونات الضرورية للمهمة
✓ استخدم مضيفين محددين:
تجنب '@'%' - قيّد على عناوين IP محددة أو شبكات
✓ كلمات مرور قوية:
12 حرفاً كحد أدنى، متطلبات معقدة
✓ مراجعات منتظمة:
راجع امتيازات المستخدم كل ثلاثة أشهر
✓ انتهاء صلاحية كلمة المرور:
فرض تغيير كلمات المرور كل 90 يوماً
✓ إزالة الحسابات غير المستخدمة:
احذف حسابات الموظفين المغادرين فوراً
✓ استخدم الأدوار (MySQL 8.0+):
مجموعة الأذونات لإدارة أسهل
✓ وثّق كل شيء:
احتفظ بسجلات لجميع تغييرات المستخدم
✓ حسابات منفصلة:
حسابات مختلفة لأغراض مختلفة
✓ راقب الوصول:
مكّن تسجيل التدقيق لقواعد البيانات الحساسة
تمرين عملي:
السيناريو: قم بإعداد مستخدمين لتطبيق مدونة بهذه المتطلبات:
- مستخدم مسؤول: تحكم كامل في قاعدة البيانات
- مستخدم تطبيق الويب: قراءة/كتابة إلى جداول posts, comments, users
- مستخدم التحليلات: وصول للقراءة فقط لجميع الجداول
- مستخدم النسخ الاحتياطي: صلاحيات النسخ الاحتياطي المناسبة
الحل:
-- إنشاء قاعدة البيانات
CREATE DATABASE blog_db;
-- مستخدم المسؤول
CREATE USER 'blog_admin'@'localhost' IDENTIFIED BY 'AdminPass2024!';
GRANT ALL PRIVILEGES ON blog_db.* TO 'blog_admin'@'localhost';
-- مستخدم التطبيق
CREATE USER 'blog_app'@'localhost' IDENTIFIED BY 'AppPass2024!';
GRANT SELECT, INSERT, UPDATE, DELETE
ON blog_db.posts TO 'blog_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE
ON blog_db.comments TO 'blog_app'@'localhost';
GRANT SELECT, INSERT, UPDATE
ON blog_db.users TO 'blog_app'@'localhost';
-- مستخدم التحليلات
CREATE USER 'blog_analytics'@'localhost' IDENTIFIED BY 'AnalyticsPass!';
GRANT SELECT ON blog_db.* TO 'blog_analytics'@'localhost';
-- مستخدم النسخ الاحتياطي
CREATE USER 'blog_backup'@'localhost' IDENTIFIED BY 'BackupPass2024!';
GRANT SELECT, LOCK TABLES, SHOW VIEW
ON blog_db.* TO 'blog_backup'@'localhost';
FLUSH PRIVILEGES;
الملخص
في هذا الدرس، تعلمت:
- نظام مستخدمي MySQL بتنسيق username@host
- إنشاء المستخدمين بسياسات كلمات مرور قوية
- أربعة مستويات من الصلاحيات: GLOBAL, DATABASE, TABLE, COLUMN
- منح وإلغاء الصلاحيات باستخدام GRANT/REVOKE
- التحكم في الوصول القائم على الأدوار في MySQL 8.0+
- عرض ومراجعة صلاحيات المستخدم
- إدارة الحسابات: القفل، الفتح، إعادة التسمية، الحذف
- أفضل الممارسات لإدارة المستخدمين والأمان
التالي: في الدرس التالي، سنستكشف أفضل ممارسات أمان قاعدة البيانات بما في ذلك منع حقن SQL، وتقوية الخادم، واتصالات SSL، وتسجيل التدقيق.