মাইএসকিউএল: কেন mysql.db "পরীক্ষা" এন্ট্রি আছে?


37

সম্প্রতি, আমি mysql.db সম্পর্কে একটি প্রশ্নের উত্তর পোস্ট করেছি

তারপরে, আমি ভাবছিলাম আমার প্রত্যেককে এই প্রশ্ন করা উচিত:

আমি কয়েক বছর ধরে লক্ষ্য করেছি যে মাইএসকিউএল 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 ইডিটি

আজ সকালে কেউ আমার প্রশ্নটিকে কমিয়ে দিয়েছে, যা আমি সত্যিই বুঝতে পারি না। এই ইভেন্টের আলোকে, এখানে কেন আমি প্রত্যাখ্যান করার জন্য সময় নিলাম:

আমি এই সপ্তাহে তাদের স্টেজিং ক্লাস্টারে ক্লায়েন্টের জন্য মাইএসকিউএল 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

দয়া করে নোট করুন মাইএসকিউএল 5.0 শংসাপত্রের স্টাডি গাইড

এখানে চিত্র বর্ণনা লিখুন

পৃষ্ঠা 498 অনুচ্ছেদে 6 এর বুলেটপয়েন্টগুলিতে বলুন:

ইউনিক্সে, মাইএসকিউএলটি একটি মাইএসকিউএল_সিকিউর_ইনস্টলেশন স্ক্রিপ্ট নিয়ে আসে যা আপনার ইনস্টলেশনতে সুরক্ষা সম্পর্কিত বেশ কয়েকটি সহায়ক কাজ করতে পারে। স্ক্রিপ্টের নিম্নলিখিত ক্ষমতা রয়েছে:

  • মূল অ্যাকাউন্টগুলির জন্য একটি পাসওয়ার্ড সেট করুন
  • যে কোনও দূরবর্তী অ্যাক্সেসযোগ্য মূল অ্যাকাউন্টগুলি সরান।
  • বেনামে ব্যবহারকারীর অ্যাকাউন্টগুলি সরান। এটি সুরক্ষার উন্নতি করে কারণ এটি মাইএসকিউএল সার্ভারের সাথে প্রত্যন্ত হোস্ট থেকে রুট হিসাবে সংযুক্ত হওয়ার সম্ভাবনা রোধ করে। ফলাফলগুলি হ'ল যে কেউ রুট হিসাবে সংযোগ করতে চায় তাদের অবশ্যই প্রথমে সার্ভার হোস্টে লগ ইন করতে সক্ষম হতে হবে, যা আক্রমণ বিরুদ্ধে অতিরিক্ত বাধা সরবরাহ করে।
  • পরীক্ষার ডাটাবেসটি সরান (যদি আপনি বেনামে থাকা অ্যাকাউন্টগুলি সরিয়ে দেন তবে আপনি যে পরীক্ষামূলক ডাটাবেসে তাদের অ্যাক্সেস রয়েছে তা সরাতেও পারেন)।

এই খারাপ এন্ট্রি থেকে মুক্তি পেতে, দয়া করে এটি চালান:

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

@DTest প্রশ্নের তার মন্তব্যে উল্লেখ হিসাবে, আপনি চালাতে পারেন mysql_secure_installation এই আপনার জন্য।

যদি কোনও অনামী ব্যবহারকারী দূর থেকে মাইএসকিউএলে লগইন করতে পারে তবে মাইএসকিএল ইনস্টলেশনটি ক্ষতিগ্রস্থ করতে একটি সাধারণ ডিস্ক আক্রমণ শুরু করা যেতে পারে। এখানে একটি উদাহরণ:

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 জিবি টেবিল পাবেন

  • পরীক্ষার ডাটাবেসে এই টেবিলগুলির কয়েকটি তৈরি করার বিষয়টি কল্পনা করুন
  • পরীক্ষা ডাটাবেসে একটি সঞ্চিত পদ্ধতি তৈরি করার কল্পনা করুন
  • পরীক্ষাগুলি এবং পরীক্ষার_% যতক্ষণ বিদ্যমান রয়েছে ততক্ষণ সম্ভাবনাগুলি অফুরন্ত mysql.db

মাইএসকিএল ইনস্টলেশনটি সুরক্ষার গুরুতরতা মাইএসকিউএল এবি দ্বারা পুরোপুরি নথিভুক্ত করা হয়নি, এবং আমি মনে করি না ওরাকল আজ এটি করতে আগ্রহী।

আপডেট 2012-02-18 16:45 ইডিটি

@ Atxdba এর মন্তব্য দ্বারা এটি প্রস্তাবিত হয়েছিল যে কেবল 'ড্রপ ডেটাবেস পরীক্ষা চালানো হচ্ছে;' 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
  • test_data

যদিও অজ্ঞাত ব্যবহারকারীদের দ্বারা নিম্নলিখিত ডাটাবেসগুলি সম্পূর্ণ অ্যাক্সেস করা যায় না:

  • testdb
  • বর্তমানে test1 ফাইল
  • testdata
  • টেস্ট ( Testথেকে ভিন্ন testLinux- ভিত্তিক সিস্টেমের মধ্যে, কিন্তু এটা উইন্ডোজ চলমান মাইএসকিউএল জন্য সমস্যা এখনও আছে)

mysql.dbটেবিলের উপর ভিত্তি করে আপনাকে এই সূক্ষ্ম নিয়মটি মনে রাখতে হবে । আপনি যদি এটি মনে না রাখেন, নামের একটি পরীক্ষামূলক ডাটাবেস তৈরি করুন testবা একটি ডাটাবেস নাম যার প্রথম 5 টি অক্ষর test_সেই একই ধরণের সুরক্ষা গর্তটি আবার খুলবে।

এই জিনিসগুলি মনে রাখার সবচেয়ে নিরাপদ উপায় হল প্রাথমিক ইনস্টলেশনগুলির পরে এই লাইনগুলি চালানো:

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

তারপরে যে কোনও নামের ডাটাবেসের একটি সঠিক প্রমাণীকরণ সেটআপ থাকতে পারে। আপনি এখনও এই দুটি লাইন যে কোনও সময় চালাতে পারেন।

আপডেট 2012-02-24 15:20 ইডিটি

অনামী ব্যবহারকারীদের মধ্যে থাকা বিপদটি প্রকাশ্যে প্রদর্শন করা To mysql.db , আমি এমন একটি ব্যবহারকারী তৈরি করতে চাই যাতে কেবল ব্যবহারের সুযোগ থাকবে।

আমি আমার ডেস্কটপে মাইএসকিউএল 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>

এর পরে, ডস কমান্ড লাইন থেকে, আসুন মাইএসকিএল স্কিমে সংযোগ করি

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 ইডিটি

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';প্রকৃতপক্ষে কাজ করে তা প্রমাণ করার জন্য , আমি আজ এটি মাইএসকিউএল 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;

অথবা কেবল মাইএসকিএল-সুরক্ষিত-ইনস্টলেশন চালান এবং এই সম্ভাব্য বিপদটি বিছানায় রাখুন।


ডাটাবেস পরীক্ষা ড্রপ হয় না; mysqldb এর সাথে সরাসরি ফিডেজিংয়ের চেয়ে বেশি পছন্দ? ডিবি টেবিল থেকে এন্ট্রি মোছা প্রকৃত পরীক্ষা ডিবি ডিরেক্টরি সরিয়ে ফেলবে না। আর কিছু না হলে কেবল বাড়ির রাখার মতো মনে হয়
atxdba

1
আমি কি ছিল DELETE from mysql.db WHERE Db LIKE 'test%';লক্ষ্য করুন NAME ফিল্ড ক্যাপিটালাইজেশন গুরুত্বপূর্ণ। সুতরাং আপনার ক্ষেত্রের নামটি যদি না হয় Dbএবং না হয় db তবে উপরের ক্যোয়ারীটি কাজ করবে না।
এভেরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.