何に注意してください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を実行して、この潜在的な危険をベッドに置きます。
mysql_secure_installation
新規インストールを実行し、匿名ユーザーを削除します。