MySQL هو نظام قاعدة بيانات علائقية متعدد المنصات ومتصل بالشبكة بالكامل ونظام إدارة قواعد بيانات موزع مع بنية العميل/الخادم. MySQL هو نظام قاعدة بيانات علائقية متعدد المنصات ومتصل بالشبكة بالكامل ونظام إدارة قواعد بيانات موزع مع بنية العميل/الخادم. يتمتع بمزايا الوظائف القوية، وسهولة الاستخدام، والإدارة المريحة، وسرعة التشغيل السريعة، والأمان القوي والموثوقية. يمكن للمستخدمين استخدام العديد من اللغات لكتابة البرامج للوصول إلى قاعدة بيانات MySQL، خاصة عند دمجها مع PHP تركيبة ذهبية وتستخدم على نطاق واسع.
نظرًا لأن MySQL هي قاعدة بيانات متعددة المنصات، فيجب اعتبار تكوينها الافتراضي قابلاً للتطبيق في مواقف مختلفة، لذلك يجب إجراء المزيد من التعزيز الأمني في بيئة الاستخدام الخاصة بنا. باعتبارنا مسؤول نظام MySQL، فإننا مسؤولون عن الحفاظ على أمان البيانات وتكاملها في نظام قاعدة بيانات MySQL.
يجب أن يبدأ التكوين الأمني لقاعدة بيانات MySQL من جانبين، أمان النظام الداخلي وأمن الشبكة الخارجية، بالإضافة إلى ذلك، سنقدم أيضًا بإيجاز بعض المشكلات والنصائح التي يجب الانتباه إليها عند البرمجة.
الأمن الداخلي للنظام
أولاً، دعونا نقدم بإيجاز بنية دليل قاعدة بيانات MySQL. بعد تثبيت MySQL، ستتم تهيئة دليل البيانات وقاعدة البيانات بعد تشغيل البرنامج النصي mysql_db_install. إذا استخدمنا حزمة التعليمات البرمجية المصدر MySQL للتثبيت، وكان دليل التثبيت هو /usr/local/mysql، فسيكون دليل البيانات بشكل عام /usr/local/mysql/var. يتكون نظام قاعدة البيانات من سلسلة من قواعد البيانات، تحتوي كل منها على سلسلة من جداول قاعدة البيانات. يستخدم MySQL اسم قاعدة البيانات لإنشاء دليل قاعدة بيانات في دليل البيانات. يستخدم كل جدول قاعدة بيانات اسم جدول قاعدة البيانات كاسم ملف، ويتم وضع ثلاثة ملفات ذات الامتدادات MYD وMYI وfrm في دليل قاعدة البيانات.
يوفر جدول تفويض MySQL تحكمًا مرنًا في أذونات الوصول إلى قاعدة البيانات، ولكن إذا كان المستخدم المحلي لديه أذونات قراءة لملف المكتبة، فسيحتاج المهاجم فقط إلى حزم دليل قاعدة البيانات ونسخه، ثم نسخه إلى دليل البيانات الخاص به للوصول إلى الدليل المسروق قواعد البيانات. لذلك، فإن أمان المضيف حيث يوجد MySQL هو القضية الأكثر أهمية. إذا لم يكن المضيف آمنًا ولا يتحكم فيه المهاجمون، فلا يمكن مناقشة أمان MySQL. والثاني هو أمن دليل البيانات وملفات البيانات، وهي مسألة إعدادات الأذونات.
انطلاقًا من بعض الإصدارات الثنائية القديمة لموقع MySQL الرئيسي، فإن سمة دليل البيانات في الإصدار 3.21.xx هي 775، وهو أمر خطير جدًا يمكن لأي مستخدم محلي قراءة دليل البيانات، لذا فإن ملف قاعدة البيانات غير آمن للغاية. سمة دليل البيانات في الإصدار 3.22.xx هي 770. هذه السمة أيضًا خطيرة إلى حد ما ويمكن للمستخدمين المحليين في نفس المجموعة القراءة والكتابة، وبالتالي فإن ملفات البيانات ليست آمنة. سمة دليل البيانات في الإصدار 3.23.xx هي 700، وهو أفضل، ويمكن فقط للمستخدم الذي يبدأ قاعدة البيانات قراءة ملف قاعدة البيانات وكتابته، مما يضمن أمان ملفات البيانات المحلية.
إذا كان المستخدم الذي يبدأ قاعدة بيانات MySQL هو mysql، فإن الأدلة والملفات التالية آمنة. يرجى الانتباه إلى دليل البيانات والسمات التالية:
Shell>ls -l /usr/local/mysql
المجموع 40
drwxrwxr-x 2 جذر الجذر 4096 27 فبراير 20:07 بن
drwxrwxr-x 3 جذر الجذر 4096 27 فبراير 20:07 يشمل
drwxrwxr-x 2 جذر الجذر 4096 27 فبراير 20:07 معلومات
drwxrwxr-x 3 جذر الجذر 4096 27 فبراير 20:07 ليب
drwxrwxr-x 2 جذر الجذر 4096 27 فبراير 20:07 libexec
drwxrwxr-x 3 جذر الجذر 4096 27 فبراير 20:07 رجل
drwxrwxr-x 6 جذر الجذر 4096 27 فبراير 20:07 اختبار mysql
drwxrwxr-x 3 جذر الجذر 4096 27 فبراير 20:07
drwxrwxr-x 7 جذر الجذر 4096 27 فبراير 20:07 sql-bench
drwx------ 4 mysql mysql 4096 27 فبراير 20:07 فار
Shell>ls -l /usr/local/mysql/var
المجموع 8
drwx------ 2 mysql mysql 4096 27 فبراير 20:08 mysql
drwx------ 2 mysql mysql 4096 27 فبراير 20:08 اختبار
Shell>ls -l /usr/local/mysql/var/mysql
المجموع 104
-rw------- 1 mysql mysql 0 27 فبراير 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 27 فبراير 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 27 فبراير 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 27 فبراير 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27 فبراير 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27 فبراير 20:08 db.frm
-rw------- 1 mysql mysql 0 27 فبراير 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27 فبراير 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27 فبراير 20:08 func.frm
-rw------- 1 mysql mysql 0 27 فبراير 20:08 host.MYD
-rw------- 1 mysql mysql 1024 27 فبراير 20:08 host.MYI
-rw------- 1 mysql mysql 8958 27 فبراير 20:08 host.frm
-rw------- 1 mysql mysql 0 27 فبراير 20:08 table_priv.MYD
-rw------- 1 mysql mysql 1024 27 فبراير 20:08 table_priv.MYI
-rw------- 1 mysql mysql 8877 27 فبراير 20:08 table_priv.frm
-rw------- 1 mysql mysql 428 27 فبراير 20:08 user.MYD
-rw------- 1 mysql mysql 2048 27 فبراير 20:08 user.MYI
-rw------- 1 mysql mysql 9148 27 فبراير 20:08 user.frm
إذا لم يكن مالكو وسمات هذه الملفات على هذا النحو، فيرجى استخدام الأمرين التاليين لتصحيح ذلك:
شل>تشون -R mysql.mysql /usr/local/mysql/var
Shell>chmod -R go-rwx /usr/local/mysql/var
لقد كان استخدام المستخدم الجذر لبدء الخدمات عن بعد دائمًا من المحرمات الأمنية، لأنه إذا كانت هناك مشكلة في برنامج الخدمة، فمن المرجح جدًا أن يتمكن المهاجم عن بعد من التحكم الكامل في المضيف. قامت MySQL بإجراء تغييرات طفيفة منذ الإصدار 3.23.15 بشكل افتراضي، يجب أن يبدأ مستخدم mysql الخدمة بعد التثبيت، ولا يُسمح للمستخدم الجذر بالبدء. إذا كان يجب عليك استخدام المستخدم الجذر للبدء، فيجب عليك إضافة المعلمة --user=root (./safe_mysqld --user=root &). نظرًا لوجود عبارات SQL الخاصة بـ LOAD DATA INFILE و SELECT... INTO OUTFILE في MySQL، إذا قام المستخدم الجذر بتشغيل خادم MySQL، فإن مستخدم قاعدة البيانات لديه إذن الكتابة للمستخدم الجذر. ومع ذلك، لا يزال لدى MySQL بعض القيود، على سبيل المثال، يمكن لـ LOAD DATA INFILE قراءة الملفات القابلة للقراءة عالميًا فقط، ولا يمكن لـ SELECT... INTO OUTFILE الكتابة فوق الملفات الموجودة.
لا يمكن تجاهل ملفات السجل المحلية، بما في ذلك سجلات Shell وسجلات MySQL الخاصة. لتسهيل الأمر عند تسجيل الدخول محليًا أو عمل نسخة احتياطية من قاعدة البيانات، يقوم بعض المستخدمين أحيانًا بتضمين كلمة مرور قاعدة البيانات مباشرةً في معلمات سطر الأوامر، مثل:
شل>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
Shell>/usr/local/mysql/bin/mysql -uroot -ptest
سيتم تسجيل هذه الأوامر في ملف السجل بواسطة الصدفة، على سبيل المثال، سيكتب bash ملف .bash_history في دليل المستخدم. إذا تمت قراءة هذه الملفات عن طريق الخطأ، فسيتم تسريب كلمة مرور قاعدة البيانات. سيتم أيضًا تسجيل أوامر SQL التي يتم تنفيذها بعد تسجيل دخول المستخدم إلى قاعدة البيانات بواسطة MySQL في ملف .mysql_history في دليل المستخدم. إذا قام مستخدم قاعدة البيانات بتغيير كلمة مرور قاعدة البيانات باستخدام عبارات SQL، فسيتم تسريبها أيضًا من خلال ملف .mysql_history. لذلك، لا ينبغي لنا إضافة كلمة المرور مباشرة بعد -p أثناء تسجيل الدخول إلى Shell والنسخ الاحتياطي، ولكن أدخل كلمة مرور قاعدة البيانات بعد المطالبة.
بالإضافة إلى ذلك، لا ينبغي لنا أن نسمح لهذين الملفين بتسجيل عملياتنا، فقط في حالة حدوث ذلك.
شل>rm .bash_history .mysql_history
Shell>ln -s /dev/null .bash_history
Shell>ln -s /dev/null .mysql_history
يربط هذان الأمران هذين الملفين بـ /dev/null، لذلك لن يتم تسجيل عملياتنا في هذين الملفين.
أمن الشبكات الخارجية
بعد تثبيت قاعدة بيانات MySQL، يبدو جدول المستخدم على منصة Unix كما يلي:
الخلية> استخدم الخلية؛
تم تغيير قاعدة البيانات
mysql> حدد المضيف، المستخدم، كلمة المرور، Select_priv، Grant_priv من المستخدم؛
+----------+-----------------------------+------------------- -------+
|. المستخدم |. كلمة المرور |
+----------+-----------------------------+------------------- -------+
|. الجذر |
|.جذر |
|. ن |
|.ن |
+----------+-----------------------------+------------------- -------+
4 صفوف في المجموعة (0.00 ثانية)
يبدو جدول المستخدم على نظام Windows الأساسي كما يلي:
الخلية> استخدم الخلية؛
تم تغيير قاعدة البيانات
mysql> حدد المضيف، المستخدم، كلمة المرور، Select_priv، Grant_priv من المستخدم؛
+----------+-----------------------------+------------------- -------+
|. المستخدم |. كلمة المرور |
+----------+-----------------------------+------------------- -------+
|. الجذر |
|.٪ |
|. |. |
|
+----------+-----------------------------+------------------- -------+
4 صفوف في المجموعة (0.00 ثانية)
دعونا نلقي نظرة أولاً على جدول المستخدم على منصة Unix. من بينها، redhat هو مجرد اسم الجهاز لجهاز الاختبار الخاص بي، لذا في الواقع، MySQL على منصة Unix تسمح فقط لهذا الجهاز بالاتصال بقاعدة البيانات بشكل افتراضي. ومع ذلك، كلمة مرور المستخدم الجذر الافتراضية فارغة، لذا فإن الأولوية القصوى هي إضافة كلمة مرور للمستخدم الجذر. هناك ثلاث طرق لإضافة كلمة مرور لمستخدم قاعدة البيانات:
1) استخدم الأمر mysqladmin في موجه الصدفة لتغيير كلمة مرور المستخدم الجذر:
شل> mysqladmin - اختبار كلمة المرور uroot
بهذه الطريقة، يتم تغيير كلمة المرور للمستخدم الجذر لقاعدة بيانات MySQL للاختبار. (الاختبار مجرد مثال، كلمة المرور التي نستخدمها فعليًا يجب ألا تستخدم كلمة مرور ضعيفة يسهل تخمينها)
2) استخدم تعيين كلمة المرور لتعديل كلمة المرور:
mysql> قم بتعيين كلمة المرور لـ root@localhost=password('test' );
في هذا الوقت، يتم تغيير كلمة مرور المستخدم الجذر للاختبار.
3) قم بتعديل كلمة مرور المستخدم الجذر لجدول المستخدم مباشرة:
الخلية> استخدم الخلية؛
mysql> قم بتحديث كلمة مرور المستخدم = كلمة المرور ('اختبار') حيث المستخدم = 'الجذر'؛
MySQL> امتيازات التدفق؛
بهذه الطريقة، تم أيضًا تغيير كلمة مرور المستخدم الجذر لقاعدة بيانات MySQL للاختبار. الأمر الأخير، امتيازات التدفق، يعني تحديث جدول ترخيص الذاكرة بالقوة. وإلا، ستظل كلمة المرور الموجودة في ذاكرة التخزين المؤقت مستخدمة في هذا الوقت، ويمكن للمستخدمين غير القانونيين أيضًا تسجيل الدخول باستخدام المستخدم الجذر وكلمة مرور فارغة حتى خادم MySQL يتم إعادة تشغيله.
نرى أيضًا المستخدم المجهول الذي يكون مستخدمه فارغًا، على الرغم من عدم وجود أذونات له ضمن نظام Unix، إلا أنه يجب علينا حذفه لأسباب أمنية:
mysql> حذف من المستخدم حيث user='';