6.1.3 공격자에 대한 MySQL의 안전한 상태 유지
MySQL 서버에 접속할 때 암호를 사용하도록하십시오. 연결시 암호는 평문으로 전송되지 않습니다. 클라이언트 연결 시퀀스에서 암호 처리는 매우 안전한 상태를 유지하도록 MySQL 4.1.1에서 업그레이드되었습니다. 4.1.1 이전 형식의 패스워드를 아직 사용하고 있다면, 암호화 알고리즘은 새로운 알고리즘만큼 강하지 않습니다. 클라이언트와 서버 사이의 트래픽을 가로 챌 수있는 똑똑한 공격자는 약간의 노력을 걸면 암호를 해독 할 수 있습니다. (다양한 암호 처리 방법에 대한 설명은 섹션 6.1.2.4 "MySQL에서 암호 해시" 를 참조하십시오.)
다른 모든 정보는 텍스트로 전송됩니다 연결을 관찰 할 수있는 모든 사용자가 읽을 수 있습니다. 클라이언트와 서버 사이의 연결이 신뢰할 수없는 네트워크를 통해 이루어지고 그 수에 불안이있는 경우 압축 된 프로토콜을 사용하여 트래픽의 해독을 더욱 어렵게 할 수 있습니다. 또한 MySQL 내부 SSL 지원을 사용하여 연결을 더 안전한 상태로 할 수 있습니다. 섹션 6.3.10 "안전한 연결을위한 SSL 사용" 을 참조하십시오. 또는 SSH를 사용하여 MySQL 서버와 MySQL 클라이언트 사이에 암호화 된 TCP / IP 연결을 제공합니다. 오픈 소스 SSH 클라이언트는 http://www.openssh.org/ 에서 찾을 수 있으며, 오픈 소스와 상용 SSH 클라이언트의 비교는 http://en.wikipedia.org/wiki/Comparison_of_SSH_clients 에 있습니다.
MySQL 시스템을 안전한 상태로하려면 다음 권장 사항을 잘 검토하도록하십시오.
모든 MySQL 계정이 암호를 요구합니다. 클라이언트 프로그램은 그것을 실행하는 사람의 ID를 반드시 인식하고있는 것은 아닙니다. 클라이언트 / 서버 응용 프로그램은 사용자가 클라이언트 프로그램에 임의의 사용자 이름을 지정할 수있는 것이 일반적입니다. 예를 들어,
other_user
에 암호가없는 경우, mysql 프로그램을mysql -u
으로 호출하여 모든 사용자가이 프로그램을 사용하여 다른 사용자와 연결할 수 있습니다. 모든 계정에 암호가있는 경우 다른 사용자 계정을 사용하여 연결은 더 어려워집니다.other_user
db_name
암호 설정 방법에 대한 설명은 섹션 6.3.5 "계정 암호 할당" 을 참조하십시오.
데이터베이스 디렉토리의 읽기 및 쓰기 권한을 가진 Unix 사용자 계정 만 mysqld 실행에 사용되는 계정에있게하십시오.
MySQL 서버를 유닉스
root
사용자로 절대로 실행하지 마십시오. 이렇게하면FILE
권한을 가진 모든 사용자가root
로 서버에 파일을 생성시킬 수 있기 때문에 (~root/.bashrc
등) 매우 위험합니다. 이를 방지하기 위해 mysqld는--user=root
옵션을 사용하여 명시 적으로 지정된 경우를 제외하고root
로 실행하는 것을 거부합니다.mysqld는 권한이없는 일반 사용자로 실행할 수 있습니다 (또한 그렇게 실행해야합니다).
mysql
이라는 다른 Unix 계정을 만들어 모두 더 안전한 상태로 할 수 있습니다. 이 계정은 MySQL의 관리에만 사용하십시오. mysqld를 다른 Unix 사용자로 시작하려면 서버 옵션을 지정한my.cnf
옵션 파일의[mysqld]
그룹에서 사용자 이름을 지정하는user
옵션을 추가합니다. 예 :[mysqld] user = mysql
이렇게하면 서버를 수동으로 시작하는 경우도 mysqld_safe 또는 mysql.server를 사용하여 부팅 한 경우에도 지정된 사용자로 서버를 시작합니다. 자세한 내용은 섹션 6.1.5 "MySQL을 일반 사용자로 실행하는 방법" 을 참조하십시오.
root
이외의 Unix 사용자로 mysqld를 실행해도user
테이블에서root
사용자 이름을 변경할 필요가 있다는 것을 의미하는 것은 아닙니다. MySQL 계정의 사용자 이름은 Unix 계정의 사용자 이름과는 아무 상관도 없습니다.관리자가 아닌 사용자에
FILE
권한을 부여하지 마십시오. 이 권한을 가진 모든 사용자는 mysqld 데몬의 권한으로 파일 시스템의 모든 위치에서 파일에 쓸 수 있습니다. 이것은 권한 테이블을 구현하는 파일을 저장하는 서버의 데이터 디렉토리를 포함합니다.FILE
권한의 작업을 좀 더 안전하게하기 위해SELECT ... INTO OUTFILE
로 생성 된 파일은 기존 파일을 덮어 쓰지 않고 모든 사용자가 쓸 수있게합니다.FILE
권한은 모든 사용자가 읽기 가능한지 서버를 실행하는 Unix 사용자가 액세스 할 수있는 모든 파일을 읽는 경우에도 사용할 수 있습니다. 이 권한을 사용하여 모든 파일을 데이터베이스 테이블에 읽을 수 있습니다. 이것은 부정 사용 될 수 있으며, 예를 들어LOAD DATA
를 사용하여/etc/passwd
를 테이블에로드하고SELECT
를 사용하여이를 표시 할 수 있습니다.파일을 읽고 쓸 수있는 장소를 제한하려면
secure_file_priv
시스템을 특정 디렉토리로 설정합니다. 섹션 5.1 "서버 시스템 변수" 를 참조하십시오.관리자가 아닌 사용자에게
PROCESS
또는SUPER
권한을 부여하지 마십시오. mysqladmin processlist와SHOW PROCESSLIST
의 출력은 현재 실행되고있는 모든 문 텍스트가 표시되므로 서버 프로세스 목록을 표시 할 수있는 모든 사용자가 다른 사용자에 의해 발행 된UPDATE user SET password=PASSWORD('not_secure')
등의 문을 표시 할 수 있습니다.mysqld는
SUPER
권한을 가진 사용자를 위해 특별히 연결을 보장하고 있기 때문에 정상적인 연결이 사용중인 경우에도 MySQLroot
사용자는 로그인 서버의 활동을 검사 할 수 있습니다.SUPER
권한은 클라이언트 접속을 종료하거나 시스템 변수의 값을 변경하여 서버 작업을 변경하거나 복제 서버를 제어 할 데 사용할 수 있습니다.테이블에 대한 심볼릭 링크를 허용하지 마십시오. (이 기능은
--skip-symbolic-links
옵션에서 비활성화 할 수 있습니다.) 이것은 mysqld를root
로 실행하는 경우에 특히 중요합니다. 이것은 서버의 데이터 디렉토리에 대한 쓰기 액세스 권한이있는 모든 사용자는 시스템의 모든 파일을 삭제 할 수있게되기 때문입니다. 섹션 8.11.3.1.2 "Unix 기반 MyISAM에 대한 심볼릭 링크 사용" 을 참조하십시오.저장 프로그램 및보기는 섹션 20.6 "저장 프로그램 및 뷰의 액세스 제어" 에 기재되어있는 보안 지침을 사용하여 설명하도록하십시오.
DNS를 신뢰하지 않는 경우, 부여 테이블에서 호스트 이름 대신 IP 주소를 사용하도록하십시오. 두 경우 모두 와일드 카드를 포함한 호스트 이름 값을 사용하여 부여 테이블 항목을 작성하는 것에 대해서는 충분히주의하도록하십시오.
단일 계정에 허용되는 연결 수를 제한하려면 mysqld의
max_user_connections
변수를 설정하여이를 수행 할 수 있습니다.GRANT
문은 계정에 허용되는 서버 사용의 범위를 제한하는 자원 제어 옵션을 지원합니다. 섹션 13.7.1.4 "GRANT 구문" 을 참조하십시오.플러그인 디렉토리 서버가 쓰기 가능한 경우 사용자는
SELECT ... INTO DUMPFILE
를 사용하여 디렉토리의 파일에 실행 코드를 작성할 수 있습니다. 이를 방지하기 위해plugin_dir
을 서버에 읽기 전용으로하거나SELECT
쓰기가 안전하게 실행할 수있는 디렉토리에--secure-file-priv
를 설정할 수 있습니다.