最近 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
にセキュリティリスクがありますか?その場合、デフォルトで新しいインストールに追加されるのはなぜですか?
今朝、誰かが私の質問に反対票を投じましたが、それは本当にわかりません。この出来事に照らして、私が反論をするのに時間をかけた理由はここにあります:
今週、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
から消去せずにディレイ。
何に注意してください MySQL 5.0 Certification Study Guide
498ページのパラグラフ6の箇条書きでこう言っています:
Unixの場合、MySQLにはmysql_secure_installationスクリプトが付属しており、インストール時にセキュリティ関連のいくつかの便利な操作を実行できます。スクリプトには次の機能があります。
- Rootアカウントのパスワードを設定する
- リモートからアクセス可能なルートアカウントを削除します。
- 匿名ユーザーアカウントを削除します。これにより、リモートホストからMySQLサーバーにrootとして接続する可能性がなくなるため、セキュリティが向上します。その結果、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;
_
Insertを30回実行すると、7GBのテーブルが作成されます
mysql.db
_にtestとtest_%が存在する限り、可能性は無限です。Mysqlのインストールを保護することの深刻さは、MySQL ABによって完全には文書化されていません。今日、Oracleがそうすることに関心があるとは思いません。
@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
はLinuxベースのシステムのtest
とは異なりますが、Windowsで実行されているMySQLの場合は問題です)_mysql.db
_テーブルに基づくこの微妙なルールを覚えておく必要があります。これを覚えていない場合は、test
という名前のテストデータベースまたは最初の5文字が_test_
_のデータベース名を作成すると、同じタイプのセキュリティホールが再び開かれます。
これらのことを覚えておかなければならない最も安全な方法は、初期インストール後にこれらの行を実行することです。
_DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;
_
そうすれば、どの名前のデータベースでも適切な認証設定を行うことができます。これらの2行はいつでも実行できます。
_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>
_
これによると、匿名のJoeはこれらのデータベースにアクセスできます。
データベース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という名前のプレーンなVanillaユーザーを作成しましょう(パスワードなし)
_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:\>
_
わかりました。それは私が期待したことです。
次に、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;
_
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 を実行して、この潜在的な危険を回避します。