MySQL:なぜmysql.dbに「テスト」エントリがあるのですか?


37

最近、mysql.dbに関する質問への回答を投稿しました

それから、私は皆にこの質問をするべきだと考えました:

何年もの間、MySQL 5.0+のインストール時にmysql.db、匿名ユーザーがテストデータベースにアクセスできるようにする2つのエントリが存在することに気づきました。

次のクエリを実行して確認できます。

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 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の箇条書きで次のように述べます。

Unixでは、MySQLにmysql_secure_installationスクリプトが付属しており、インストールでいくつかの有用なセキュリティ関連の操作を実行できます。このスクリプトには次の機能があります。

  • ルートアカウントのパスワードを設定する
  • リモートアクセス可能なルートアカウントを削除します。
  • 匿名ユーザーアカウントを削除します。これにより、リモートホストからrootとしてMySQLサーバーに接続する可能性がなくなるため、セキュリティが向上します。その結果、rootとして接続したい人は誰でも最初にサーバーホストにログインできる必要があり、これは攻撃に対する追加の障壁を提供します。
  • テストデータベースを削除します(匿名アカウントを削除する場合は、アクセスできるテストデータベースも削除することをお勧めします)。

これらの不正なエントリを取り除くには、これを実行してください:

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とtest_%が存在する限り、可能性は無限です。 mysql.db

mysqlインストールを保護することの深刻さについては、MySQL ABによって完全に文書化されておらず、Oracleが今日そうすることに関心があるとは思わない。

更新2012-02-18 16:45 EDT

@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
  • テストデータ

匿名ユーザーは次のデータベースに完全にアクセスすることはできません。

  • testdb
  • test1
  • テストデータ
  • テスト(LinuxベースのシステムTestとは異なりtestますが、Windowsで実行されているMySQLにとっては依然として問題です)

mysql.dbテーブルに基づいてこの微妙なルールを覚えておく必要があります。これを覚えていない場合test、最初の5文字が名前のテストデータベースまたはデータベース名を作成するtest_と、同じタイプのセキュリティホールが再び開きます。

これらのことを覚えておく必要がある最も安全な方法は、最初のインストール後にこれらの行を実行することです。

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

その後、任意の名前のデータベースに適切な認証セットアップを設定できます。この2行はいつでも実行できます。

更新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 @ localhost(パスワードなし)という単純なバニラユーザーを作成しましょう。

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>

次に、DOSコマンドラインから、mysqlスキーマに接続しましょう

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

C:\>

OK それは私が期待したことです。

次に、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;

更新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-secure-installationを実行して、この潜在的な危険をベッドに置きます。


データベーステストを削除しません。mysqldbを直接調整するよりも好ましいですか?dbテーブルからエントリを削除しても、実際のテストdbディレクトリは削除されません。良いハウスキーピングのように思える他に何もない場合
-atxdba

1
DELETE from mysql.db WHERE Db LIKE 'test%';フィールド名の大文字化が重要であることに注意してください。したがって、フィールド名がでDbあり、でない db場合、上記のクエリは機能しません。
エイブリィ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.