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 을 실행하여이 잠재적 위험을 해결하십시오.
mysql_secure_installation
새로 설치하여 익명 사용자를 제거합니다.