MySQL : mysql.db에“테스트”항목이있는 이유는 무엇입니까?


36

최근 에 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이 보안 상 위험합니까? 그렇다면 이 항목 이 기본적으로 새 설치에 추가되는 이유는 무엇입니까?

업데이트 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 Certification Study Guide에 유의하십시오.

여기에 이미지 설명을 입력하십시오

단락 6의 글 머리표에서 말하기 :

Unix의 경우 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와 test_ %가 존재하는 한 가능성은 무한합니다 mysql.db

mysql 설치 보안의 심각성은 MySQL AB에 의해 완전히 문서화되지 않았으며, 오라클이 오늘 그렇게하는 데 관심이 없다고 생각합니다.

업데이트 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
  • test_data

익명 사용자는 다음 데이터베이스에 완전히 액세스 할 수 없습니다.

  • testdb
  • test1
  • testdata
  • 테스트 ( 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>

이에 따르면, 익명의 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 (비밀번호)라는 일반 바닐라 사용자를 만들어 봅시다

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;

업데이트 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 , 쿼리 위에서 작동하지 않습니다.
Avery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.