it-swarm.asia

الخلية: لماذا توجد إدخالات "اختبار" في mysql.db؟

في الآونة الأخيرة ، لقد نشرت إجابة على سؤال حول mysql.db .

ثم ، فكرت في أن أسأل الجميع هذا السؤال:

لقد لاحظت منذ سنوات أنه عند تثبيت MySQL 5.0+ ، mysql.db يملأ بإدخلين يسمحان لوصول قواعد بيانات الاختبار من قبل مستخدمين مجهولين.

يمكنك رؤيته عن طريق تشغيل هذا الاستعلام:

mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
                 Host: %
                   Db: test
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
*************************** 2. row ***************************
                 Host: %
                   Db: test\_%
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
2 rows in set (0.00 sec)

هل هذه الإدخالات في mysql.db مخاطرة أمنية ، وإذا كان الأمر كذلك ، فلماذا تتم إضافتها افتراضيًا إلى تثبيت جديد؟

تحديث 2013-06-14 10:13 بتوقيت شرق الولايات المتحدة

هذا الصباح رفض أحدهم سؤالي ، وهو ما لا أفهمه حقًا. في ضوء هذا الحدث ، هذا هو السبب في أنني خصصت بعض الوقت لإجراء رد:

لقد قمت بتثبيت MySQL 5.6.12 لعميل هذا الأسبوع في مجموعة التدريج الخاصة بهم. قررت التحقق لمعرفة ما إذا كانت هذه المشكلة لا تزال مستمرة:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)

mysql> select db,user,Host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db      | user | Host |
+---------+------+------+
| test    |      | %    |
| test\_% |      | %    |
+---------+------+------+
2 rows in set (0.10 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)

mysql>

خمن ماذا؟ لا تزال هذه مشكلة حتى يومنا هذا !!!

معنويات القصة: يرجى التحقق من mysql.db فورًا بعد التثبيت وإزالة عمليات تسجيل الدخول المجهولة ومحو إدخالات الاختبار هذه من mysql.db بدون تأخير.

37
RolandoMySQLDBA

يرجى ملاحظة ما دليل دراسة شهادة MySQL 5.0

enter image description here

نقول في نقاطه في الصفحة 498 الفقرة 6:

في Unix ، يأتي MySQL مع نص برمجي mysql_secure_installation يمكنه تنفيذ العديد من العمليات المفيدة المتعلقة بالأمان على التثبيت. يحتوي البرنامج النصي على القدرات التالية:

  • قم بتعيين كلمة مرور للحسابات الجذر
  • قم بإزالة أي حسابات جذر يمكن الوصول إليها عن بعد.
  • إزالة حسابات المستخدمين المجهولين. يؤدي ذلك إلى تحسين الأمان لأنه يمنع إمكانية اتصال أي شخص بخادم MySQL كجذر من مضيف بعيد. النتائج هي أنه يجب على أي شخص يريد الاتصال كجذر أولاً أن يكون قادرًا على تسجيل الدخول على الخادم المضيف ، مما يوفر حاجزًا إضافيًا ضد الهجوم.
  • إزالة قاعدة بيانات الاختبار (إذا قمت بإزالة الحسابات المجهولة ، فقد ترغب أيضًا في إزالة قاعدة بيانات الاختبار التي يمكنهم الوصول إليها).

للتخلص من تلك الإدخالات السيئة ، قم بتشغيل هذا من فضلك:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
FLUSH PRIVILEGES;

كما ذكرDTest في تعليقه على السؤال ، يمكنك أيضًا تشغيل mysql_secure_installation لك.

إذا كان بإمكان مستخدم مجهول تسجيل الدخول إلى MySQL عن بُعد ، فيمكن إطلاق هجوم قرص ببساطة لإلحاق الضرر بتثبيت الخلية. هنا مثال:

USE test
CREATE TABLE rolando_tb (a int);
INSERT INTO rolando_tb VALUES (1);
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;

قم بتشغيل الإدخال 30 مرة وتحصل على طاولة بسعة 7 جيجابايت

  • تخيل إنشاء العديد من هذه الجداول في قاعدة بيانات الاختبار
  • تخيل إنشاء إجراء مخزّن في قاعدة بيانات الاختبار
  • الاحتمالات لا حصر لها طالما أن الاختبار و test_٪ موجودان في mysql.db

لم يتم توثيق جدية تأمين تثبيت mysql بالكامل بواسطة MySQL AB ، ولا أعتقد أن أوراكل مهتمة بذلك اليوم.

تحديث 2012-02-18 16:45 بتوقيت شرق الولايات المتحدة

اقترح تعليق @ atxdba أن تشغيل "DROP DATABASE test؛" يجب أن تكون الطريقة المفضلة على لمس mysql.db. يؤدي إسقاط قاعدة البيانات المسماة test إلى إزالة قاعدة البيانات التي تفتح قناة إلى ثقب أمان محتمل.

يرجى ملاحظة هذا الاستعلام:

mysql> select user,Host,db from mysql.db;
+------+------+---------+
| user | Host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.09 sec)

بناءً على ذلك ، يمكن أن تكون قواعد البيانات التالية يمكن الوصول إليها بالكامل من قبل مستخدمين مجهولين:

  • اختبار
  • test_db
  • test_001
  • test_1
  • بيانات الاختبار

بينما لا يمكن الوصول إلى قواعد البيانات التالية بشكل كامل من قبل مستخدمين مجهولين:

  • اختبار
  • اختبار 1
  • اختبار البيانات
  • اختبار (Test يختلف عن test في الأنظمة المستندة إلى Linux ، ولكن لا يزال يمثل مشكلة في MySQL قيد التشغيل في Windows)

سيتعين عليك تذكر هذه القاعدة الدقيقة بناءً على جدول mysql.db. إذا لم تتذكر هذا ، فسيؤدي إنشاء قاعدة بيانات تجريبية باسم test أو اسم قاعدة بيانات يكون أول 5 أحرف فيها test_ إلى إعادة فتح نفس نوع فتحة الأمان.

الطريقة الأكثر أمانًا لتذكر هذه الأشياء هي تشغيل هذه الخطوط بعد التثبيت الأولي:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

ثم أي قاعدة بيانات بأي اسم يمكن أن يكون لها إعداد المصادقة المناسب. لا يزال بإمكانك تشغيل هذين الخطين في أي وقت.

تحديث 2012-02-24 15:20 EDT

للتدليل علناً على خطر وجود مستخدمين مجهولين في mysql.db ، أود إنشاء مستخدم لديه امتياز الاستخدام فقط.

سأستخدم MySQL 5.5.12 على سطح المكتب

أولاً ، انظر إلى mysql.db

mysql> select user,Host,db from mysql.db;
+------+------+---------+
| user | Host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.05 sec)


mysql>

وفقا لهذا ، يمكن لأي جو مجهول الوصول إلى قواعد البيانات هذه.

سأقوم بإنشاء test_mysqldb قاعدة بيانات

mysql> create database test_mysqldb;
Query OK, 1 row affected (0.00 sec)

mysql> use test_mysqldb
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql>

دعنا ننشئ مستخدم Vanilla عادي يسمى Vanilla @ localhost (بدون كلمة مرور)

mysql> CREATE USER [email protected];
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------+
| Grants for [email protected]                |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'Vanilla'@'localhost' |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

بعد ذلك ، من سطر أوامر DOS ، دعنا نتصل بمخطط الخلية

C:\>mysql -uvanilla -Dmysql
ERROR 1044 (42000): Access denied for user 'Vanilla'@'localhost' to database 'mysql'

C:\>

حسنا عظيم. هذا ما توقعته.

بعد ذلك ، من سطر أوامر DOS ، دعنا نتصل بمخطط test_mysqldb ، وننشئ جدولًا ، ونحمله بالأرقام

C:\>mysql -uvanilla -Dtest_mysqldb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE TABLE rolando_tb (a bigint unsigned);
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO rolando_tb VALUES (1);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 4 rows affected (0.06 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 8 rows affected (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM rolando_tb;
+------+
| a    |
+------+
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
+------+
16 rows in set (0.00 sec)

mysql> SELECT database();
+--------------+
| database()   |
+--------------+
| test_mysqldb |
+--------------+
1 row in set (0.00 sec)

mysql>

هل رأيت ذلك؟ مستخدم لديه امتياز USAGE يمكنه إنشاء جدول في قاعدة بيانات اختبار واملأها بالبيانات. هذا خطر واضح وحاضر . لهذا السبب أوصي بشدة بحذف إدخالات الاختبار هذه من mysql.db لمنع المستخدمين المجهولين من الوصول إلى قواعد بيانات الاختبار أو الوصول إلى قواعد بيانات الاختبار التي تم إنشاؤها حديثًا (من خلال إنشاء مجلد فرعي تحت datadir).

للتذكير ، هذه هي الطريقة التي تقوم بها:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

UPDATE 2013-09-14 20:05 بتوقيت شرق الولايات المتحدة

لإثبات أن DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user=''; تعمل بالفعل ، قمت بتشغيل هذا على MySQL 5.6.13 اليوم:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select db,user,Host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db      | user | Host |
+---------+------+------+
| test    |      | %    |
| test\_% |      | %    |
+---------+------+------+
2 rows in set (0.43 sec)

mysql> delete from mysql.db where LEFT(db,4)='test';
Query OK, 2 rows affected (0.04 sec)

mysql> select db,user,Host from mysql.db2 where LEFT(db,4)='test';
Empty set (0.00 sec)

mysql>

فقط كإعلان خدمة عامة ، يرجى تشغيل

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

أو مجرد تشغيل mysql-secure-installation ووضع هذا الخطر المحتمل على السرير.

30
RolandoMySQLDBA