MySQL: mysql.db में "परीक्षण" प्रविष्टियाँ क्यों हैं?


37

हाल ही में, मैंने 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सुरक्षा जोखिम में हैं, और यदि हैं, तो उन्हें डिफ़ॉल्ट रूप से एक नई स्थापना में क्यों जोड़ा जाता है?

UPDATE 2013-06-14 10:13 EDT

आज सुबह किसी ने मेरे प्रश्न को अस्वीकार कर दिया, जिसे मैं वास्तव में नहीं समझता। इस घटना के प्रकाश में, यहाँ है कि मुझे खंडन करने में समय क्यों लगा:

मैंने इस सप्ताह एक क्लाइंट के लिए 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बिना देरी के इन परीक्षण प्रविष्टियों को मिटा दें ।


8
इस मुद्दे को प्रकाश में लाने के लिए +1। मैंने पहले कभी इस पर ध्यान नहीं दिया, लेकिन मैं हमेशा mysql_secure_installationएक ताजा इंस्टॉल पर चलता हूं , जो गुमनाम उपयोगकर्ताओं को हटा देता है।
डेरेक डाउनी

जवाबों:


30

कृपया ध्यान दें कि MySQL 5.0 प्रमाणन अध्ययन गाइड क्या है

यहाँ छवि विवरण दर्ज करें

पृष्ठ 498 पैराग्राफ 6 पर इसके बुलेटपॉइंट्स में कहें:

यूनिक्स पर, MySQL एक mysql_secure_installation स्क्रिप्ट के साथ आता है जो आपके इंस्टॉलेशन से संबंधित कई सुरक्षा-संबंधी सुरक्षा कार्य कर सकती है। स्क्रिप्ट में निम्नलिखित क्षमताएं हैं:

  • रूट खातों के लिए एक पासवर्ड सेट करें
  • किसी भी दूरस्थ पहुँच योग्य रूट खाते को निकालें।
  • अनाम उपयोगकर्ता खाते निकालें। यह सुरक्षा में सुधार करता है क्योंकि यह किसी दूरस्थ होस्ट से रूट के रूप में MySQL सर्वर से कनेक्ट होने की संभावना को रोकता है। परिणाम यह है कि जो कोई भी रूट के रूप में कनेक्ट करना चाहता है, उसे पहले सर्वर होस्ट पर लॉग इन करने में सक्षम होना चाहिए, जो हमले के खिलाफ एक अतिरिक्त बाधा प्रदान करता है।
  • परीक्षण डेटाबेस निकालें (यदि आप अनाम खातों को हटाते हैं, तो आप उस परीक्षण डेटाबेस को भी निकालना चाह सकते हैं जिसमें उनकी पहुँच है)।

उन खराब प्रविष्टियों से छुटकारा पाने के लिए, कृपया इसे चलाएं:

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

जैसा कि @DTest ने इस प्रश्न के लिए अपनी टिप्पणी में उल्लेख किया है, आप इसके लिए mysql_secure_installation भी चला सकते हैं।

यदि कोई अनाम उपयोगकर्ता MySQL से दूरस्थ रूप से लॉग इन कर सकता है, तो 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 बार चलाएं और आपको 7GB टेबल मिल जाए

  • परीक्षण डेटाबेस में इनमें से कई तालिकाएँ बनाने की कल्पना करें
  • परीक्षण डेटाबेस में एक संग्रहीत प्रक्रिया बनाने की कल्पना करें
  • संभावनाएं अनंत हैं जब तक परीक्षण और test_% में मौजूद हैं mysql.db

MySQL एबी को सुरक्षित करने की गंभीरता को MySQL AB द्वारा पूरी तरह से प्रलेखित नहीं किया गया है, और मुझे नहीं लगता कि Oracle आज ऐसा करने में रुचि रखता है।

अद्यतन 2012-02-18 16:45 EDT

@ Atxdba की टिप्पणी से यह सुझाव दिया गया था कि अभी 'DROP DATABASE परीक्षण' चल रहा है; 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
  • परीक्षण डेटा

हालांकि निम्नलिखित डेटाबेस को अनाम उपयोगकर्ताओं द्वारा पूरी तरह से एक्सेस नहीं किया जा सकता है:

  • testdb
  • test1
  • परीक्षण डेटा
  • टेस्ट ( लिनक्स-आधारित सिस्टम Testसे अलग है test, लेकिन यह अभी भी विंडोज में चलने वाले MySQL के लिए समस्या है)

आपको 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>

आइए वनीला @ लोकलहोस्ट (कोई पासवर्ड नहीं) नामक एक साधारण वेनिला उपयोगकर्ता बनाएँ

mysql> CREATE USER vanilla@localhost;
Query OK, 0 rows affected (0.00 sec)

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

mysql>

अगला, डॉस कमांड लाइन से, आइए mysql स्कीमा से कनेक्ट करें

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

C:\>

ठीक है अच्छा है। यही मुझे उम्मीद थी।

इसके बाद, डॉस कमांड लाइन से, 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;

2013-09-14 20:05 EDT

यह प्रदर्शित करने के लिए कि 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-safe-installation चलाएं और इस संभावित खतरे को बिस्तर पर डाल दें।


डेटाबेस परीक्षण ड्रॉप नहीं है; सीधे mysqldb के साथ फ़िडगेटिंग पर पसंदीदा? Db तालिका से प्रविष्टि हटाने से वास्तविक परीक्षण db निर्देशिका नहीं निकलेगी। अगर और कुछ नहीं है कि सिर्फ बेहतर घर रखने की तरह लगता है
atxdba

1
मुझे एक DELETE from mysql.db WHERE Db LIKE 'test%';नोट करना था कि क्षेत्र के नाम का पूंजीकरण मायने रखता है। इसलिए यदि आपके क्षेत्र का नाम है Dbऔर नहीं है db , तो ऊपर दिए गए प्रश्न काम नहीं करेंगे।
एवरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.