MySQL은 완전히 네트워크화된 크로스 플랫폼 관계형 데이터베이스 시스템이자 클라이언트/서버 아키텍처를 갖춘 분산 데이터베이스 관리 시스템입니다. MySQL은 완전히 네트워크화된 크로스 플랫폼 관계형 데이터베이스 시스템이자 클라이언트/서버 아키텍처를 갖춘 분산 데이터베이스 관리 시스템입니다. 강력한 기능, 쉬운 사용, 편리한 관리, 빠른 실행 속도, 강력한 보안 및 안정성이라는 장점이 있습니다. 사용자는 특히 PHP와 결합할 때 다양한 언어를 사용하여 MySQL 데이터베이스에 액세스하는 프로그램을 작성할 수 있습니다. 황금색 조합으로 널리 사용됩니다.
MySQL은 멀티 플랫폼 데이터베이스이므로 기본 구성을 다양한 상황에 적용할 수 있도록 고려해야 하므로, 자체 사용 환경에서 추가적인 보안 강화가 이루어져야 합니다. MySQL 시스템 관리자로서 우리는 MySQL 데이터베이스 시스템의 데이터 보안과 무결성을 유지할 책임이 있습니다.
MySQL 데이터베이스의 보안 구성은 내부 시스템 보안과 외부 네트워크 보안이라는 두 가지 측면에서 시작되어야 합니다. 또한 프로그래밍 시 주의해야 할 몇 가지 문제와 팁도 간략하게 소개하겠습니다.
시스템 내부 보안
먼저 MySQL 데이터베이스 디렉터리 구조를 간략하게 소개하겠습니다. MySQL을 설치한 후 mysql_db_install 스크립트를 실행하면 데이터 디렉터리와 데이터베이스가 초기화됩니다. MySQL 소스 코드 패키지를 사용하여 설치하고 설치 디렉터리가 /usr/local/mysql이라면 데이터 디렉터리는 일반적으로 /usr/local/mysql/var입니다. 데이터베이스 시스템은 일련의 데이터베이스로 구성되며 각 데이터베이스에는 일련의 데이터베이스 테이블이 포함됩니다. MySQL은 데이터베이스 이름을 사용하여 데이터 디렉터리에 데이터베이스 디렉터리를 생성합니다. 각 데이터베이스 테이블은 데이터베이스 테이블 이름을 파일 이름으로 사용하며, 확장자가 MYD, MYI, frm인 3개의 파일이 데이터베이스 디렉터리에 배치됩니다.
MySQL의 권한 부여 테이블은 데이터베이스 액세스에 대한 유연한 권한 제어를 제공하지만, 로컬 사용자가 라이브러리 파일에 대한 읽기 권한을 가지고 있는 경우 공격자는 데이터베이스 디렉터리를 패키징하고 복사한 다음 이를 자신의 데이터 디렉터리에 복사하기만 하면 됩니다. 데이터베이스. 따라서 MySQL이 위치한 호스트의 보안은 가장 중요한 문제이다. 호스트가 안전하지 않고 공격자에 의해 통제되지 않는다면 MySQL의 보안은 논할 수 없다. 두 번째는 권한 설정의 문제인 데이터 디렉터리 및 데이터 파일의 보안입니다.
MySQL 메인 사이트의 일부 오래된 바이너리 릴리스로 판단하면 버전 3.21.xx의 데이터 디렉터리 속성은 775로 매우 위험합니다. 모든 로컬 사용자가 데이터 디렉터리를 읽을 수 있으므로 데이터베이스 파일은 매우 안전하지 않습니다. 3.22.xx 버전의 데이터 디렉터리 속성은 770입니다. 이 속성도 다소 위험합니다. 동일한 그룹의 로컬 사용자는 읽기 및 쓰기가 모두 가능하므로 데이터 파일이 안전하지 않습니다. 버전 3.23.xx의 데이터 디렉터리 속성은 700으로, 데이터베이스를 시작한 사용자만 데이터베이스 파일을 읽고 쓸 수 있어 로컬 데이터 파일의 보안이 보장됩니다.
MySQL 데이터베이스를 시작하는 사용자가 mysql이라면 다음 디렉터리와 파일은 안전합니다. 데이터 디렉터리와 다음 속성에 주의하세요.
쉘>ls -l /usr/local/mysql
총 40개
drwxrwxr-x 2 루트 루트 4096 2월 27일 20:07 bin
drwxrwxr-x 3 루트 루트 4096 2월 27일 20:07 포함
drwxrwxr-x 2 루트 루트 4096 2월 27일 20:07 정보
drwxrwxr-x 3 루트 루트 4096 2월 27일 20:07 lib
drwxrwxr-x 2 루트 루트 4096 2월 27일 20:07 libexec
drwxrwxr-x 3 루트 루트 4096 2월 27일 20:07 남자
drwxrwxr-x 6 루트 루트 4096 2월 27일 20:07 mysql-test
drwxrwxr-x 3 루트 루트 4096 2월 27일 20:07 공유
drwxrwxr-x 7 루트 루트 4096 2월 27일 20:07 sql-bench
drwx------ 4 mysql mysql 4096 2월 27일 20:07 var
쉘>ls -l /usr/local/mysql/var
총 8개
drwx------ 2 mysql mysql 4096 2월 27일 20:08 mysql
drwx------ 2 mysql mysql 4096 2월 27일 20:08 테스트
쉘>ls -l /usr/local/mysql/var/mysql
총 104개
-rw------- 1 mysql mysql 0 2월 27일 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 2월 27일 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 2월 27일 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 2월 27일 20:08 db.MYD
-rw------- 1 mysql mysql 3072 2월 27일 20:08 db.MYI
-rw------- 1 mysql mysql 8982 2월 27일 20:08 db.frm
-rw------- 1 mysql mysql 0 2월 27일 20:08 func.MYD
-rw------- 1 mysql mysql 1024 2월 27일 20:08 func.MYI
-rw------- 1 mysql mysql 8641 2월 27일 20:08 func.frm
-rw------- 1 mysql mysql 0 2월 27일 20:08 호스트.MYD
-rw------- 1 mysql mysql 1024 2월 27일 20:08 호스트.MYI
-rw------- 1 mysql mysql 8958 2월 27일 20:08 host.frm
-rw------- 1 mysql mysql 0 2월 27일 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 2월 27일 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 2월 27일 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 2월 27일 20:08 user.MYD
-rw------- 1 mysql mysql 2048 2월 27일 20:08 user.MYI
-rw------- 1 mysql mysql 9148 2월 27일 20:08 user.frm
해당 파일의 소유자와 속성이 이와 같지 않은 경우 다음 두 명령을 사용하여 수정하십시오.
쉘> chown -R mysql.mysql /usr/local/mysql/var
쉘> chmod -R go-rwx /usr/local/mysql/var
루트 사용자를 사용하여 원격 서비스를 시작하는 것은 항상 보안상 금기시되어 왔습니다. 서비스 프로그램에 문제가 있는 경우 원격 공격자가 호스트를 완전히 제어할 가능성이 매우 높기 때문입니다. MySQL은 버전 3.23.15부터 약간의 변경이 있었습니다. 기본적으로 설치 후 mysql 사용자가 서비스를 시작해야 하며 루트 사용자는 시작할 수 없습니다. 시작하기 위해 루트 사용자를 사용해야 하는 경우 --user=root 매개변수(./safe_mysqld --user=root &)를 추가해야 합니다. MySQL에는 LOAD DATA INFILE 및 SELECT... INTO OUTFILE의 SQL 문이 있으므로 루트 사용자가 MySQL 서버를 시작하면 데이터베이스 사용자는 루트 사용자의 쓰기 권한을 갖게 됩니다. 그러나 MySQL에는 여전히 몇 가지 제한 사항이 있습니다. 예를 들어 LOAD DATA INFILE은 전역적으로 읽을 수 있는 파일만 읽을 수 있고 SELECT... INTO OUTFILE은 기존 파일을 덮어쓸 수 없습니다.
쉘 로그 및 MySQL 자체 로그를 포함한 로컬 로그 파일은 무시할 수 없습니다. 로컬로 로그인하거나 데이터베이스를 백업할 때 편의를 위해 일부 사용자는 때때로 다음과 같이 명령줄 매개변수에 데이터베이스 비밀번호를 직접 포함합니다.
쉘>/usr/local/mysql/bin/mysqldump -uroot -ptest 테스트>test.sql
쉘>/usr/local/mysql/bin/mysql -uroot -ptest
이러한 명령은 셸에 의해 기록 파일에 기록됩니다. 예를 들어 bash는 사용자 디렉터리에 .bash_history 파일을 기록합니다. 이 파일을 실수로 읽으면 데이터베이스의 비밀번호가 유출됩니다. 사용자가 데이터베이스에 로그인한 후 실행된 SQL 명령은 MySQL에 의해 사용자 디렉터리의 .mysql_history 파일에도 기록됩니다. 데이터베이스 사용자가 SQL 문을 사용하여 데이터베이스 비밀번호를 변경하면 .mysql_history 파일을 통해서도 유출됩니다. 따라서 쉘 로그인 및 백업 시 -p 바로 뒤에 비밀번호를 추가하면 안 되며, 프롬프트 후에 데이터베이스 비밀번호를 입력해야 합니다.
또한 만일의 경우를 대비해 이 두 파일에 작업을 기록하도록 해서는 안 됩니다.
쉘>rm .bash_history .mysql_history
쉘>ln -s /dev/null .bash_history
쉘>ln -s /dev/null .mysql_history
이 두 명령은 이 두 파일을 /dev/null에 연결하므로 작업이 이 두 파일에 기록되지 않습니다.
외부 네트워크 보안
MySQL 데이터베이스가 설치된 후 Unix 플랫폼의 사용자 테이블은 다음과 같습니다.
mysql> mysql을 사용한다;
데이터베이스가 변경됨
mysql> 사용자로부터 Host,User,Password,Select_priv,Grant_priv를 선택합니다.
+------------+------+----------+-------------+---- -------+
| 호스트 | 비밀번호 |
+------------+------+----------+-------------+---- -------+
| 로컬 호스트 | 예 |
| 레드햇 |
N |
N |
+------------+------+----------+-------------+---- -------+
4줄 세트(0.00초)
Windows 플랫폼의 사용자 테이블은 다음과 같습니다.
mysql> mysql을 사용한다;
데이터베이스가 변경됨
mysql> 사용자로부터 Host,User,Password,Select_priv,Grant_priv를 선택합니다.
+------------+------+----------+-------------+---- -------+
| 호스트 | 비밀번호 |
+------------+------+----------+-------------+---- -------+
| 로컬 호스트 | 예 |
| 예 |
|
|
+------------+------+----------+-------------+---- -------+
4줄 세트(0.00초)
먼저 Unix 플랫폼의 사용자 테이블을 살펴보겠습니다. 그 중 redhat은 제 테스트 머신의 머신 이름일 뿐입니다. 그래서 사실 유닉스 플랫폼의 MySQL은 기본적으로 이 머신만이 데이터베이스에 접속하도록 허용하고 있습니다. 그러나 기본 루트 사용자 비밀번호는 비어 있으므로 루트 사용자에게 비밀번호를 추가하는 것이 최우선입니다. 데이터베이스 사용자에게 비밀번호를 추가하는 방법에는 세 가지가 있습니다.
1) 루트 사용자 비밀번호를 변경하려면 쉘 프롬프트에서 mysqladmin 명령을 사용하십시오.
쉘>mysqladmin -uroot 비밀번호 테스트
이런 방식으로 MySQL 데이터베이스 루트 사용자의 비밀번호가 test로 변경됩니다. (테스트는 예시일 뿐, 실제 사용하는 비밀번호는 이렇게 추측하기 쉬운 취약한 비밀번호를 사용해서는 안 됩니다)
2) 비밀번호를 수정하려면 설정된 비밀번호를 사용하세요.
mysql> root@localhost=password('test' )에 대한 비밀번호 설정;
이때 루트 사용자의 비밀번호는 test로 변경됩니다.
3) 사용자 테이블의 루트 사용자 비밀번호를 직접 수정합니다.
mysql> mysql을 사용한다;
mysql> 사용자 세트 업데이트 비밀번호=password('test') 여기서 user='root';
mysql> 플러시 권한;
이런 방식으로 MySQL 데이터베이스 루트 사용자의 비밀번호도 테스트용으로 변경되었습니다. 마지막 명령인 플러시 권한은 메모리 인증 테이블을 강제로 새로 고치는 것을 의미합니다. 그렇지 않으면 캐시에 있는 비밀번호가 계속 사용됩니다. 이때 불법 사용자도 MySQL 서버까지 빈 비밀번호로 로그인할 수 있습니다. 다시 시작됩니다.
사용자가 비어 있는 익명 사용자도 표시됩니다. Unix 플랫폼에서는 권한이 없지만 보안상의 이유로 삭제해야 합니다.
mysql> user=''인 사용자에서 삭제;