Jiniya

WEB

MySQL 설치 후 최소한의 보안 설정 방법

MySQL 보안 설정 방법입니다. 최적의 보안 방법이 아닌 최소한으로 노출을 막고 공격에 대비하여 안전하게 MySQL을 운영할수 있는 체크 리스트라고 보시면 됩니다.MySQL 을 기본적으로 설정 했을때 놓치고 설정 못한 부분이 있나 확인하시면 조금더 안전하게 운영할 수 있습니다.아래 체크 리스트에는 MySQL을 기본적으로 설치 했을때 놓치기 쉬운 부분을 정리해 놓았습니다. 지금 운영중인 서버가 있다면 한번더 체크를 해보시기 바랍니다.


1. 최소한의 접근만 허용합니다.

MySQL에서 외부 접근을 허용 하면 부적절한 접근 및 취약점에 노출될 일이 많습니다. 내부적으로만 사용할 경우에는 외부 접근을 차단 하는것이 최고의 방법입니다. 내부에서만 사용하는 MySQL서버를 불필요하게 외부에 노출시킬 필요는 없습니다. 또 외부에서 접근을 해야 하거나 , 1~2대의 클라이언트에서 접근을 한다고 하면 TCP Wrappers, IP Table 또는 그외 방화벽 장치로 정해진 클라이언트만 허용을 하는 것이 좋습니다.


MySQL 에서 외부 네트워킹 기능을 제한을 하려 한다면 my.ini 에 [mysqld] 색션에서 skip-networking 을 추가 하여 네트워킹 기능을 차단을 합니다. 이때는 로컬에서만 접속(UNIX DOMAIN SOCKET : ex /tmp/mysql.sock)이 가능합니다. 

[mysqld]

skip-networking


또는 MySQL 에서 특정 호스트만 허용을 하기 위해서는 [mysqld] 색션에 bind-address 옵션을 통해 차단이 가능합니다. 

[mysqld]

bind-address = 192.168.0.1


2. 데이터 베이스 포트를 변경하세요 

MySQL 의 기본 포트 3306을 변경하여 무분별한 공격시도에 대해서 차단해 주세요

[mysqld]

port = 3306


사용자 권한에 대해서는 모든 호스트에서 접속이 가능하지 않도록 사용자 권한 의 호스트를 지정해주세요. 예를 들어 localhost에서만 접근하는 사용자에 대해서 모든 호스트에 대한 접속이 가능하도록 접속 호스트 명에 와일드 카드 '%'를 넣어줄 필요는 없습니다. 



1GRANT SELECT, INSERT, UPDATE ON userdb.* TO 'username'@'localhost';

3. LOCAL INFILE 을 사용을 못하도록 비활성화 합니다. 

사용자들이 "LOAD DATA LOCAL INFILE" 을 이용해서 내부 설정 파일 및 기타 파일에 대한 정보를 얻지 못하도록 내부 파일을 읽어들이지 못하도록 합니다. 예를 들어 /etc/my.ini 파일에 접근을 한다고 하면 서버내부 설정을 볼수 있습니다. 또는 /etc/password 파일에 접근하여 정보를 읽어 들일수 있는 점을 차단하는 방법입니다. 물론 mysql데몬의 권한에 따라 또는 최신 보안 패치에 따라 막힐수는 있으나 소중한 서버 정보를 노출한다는 점은 막는게 좋습니다. 

mysql> select load_file('/etc/my.ini');


차단 방법은 my.ini 파일의 [mysqld] 색션에서 set-variable=local-infile=0 으로 설정을 해주십시오

[mysqld]

set-variable=local-infile=0


4. ROOT 계정 이름을 변경하고 비밀번호를 변경해주십시오 

MySQL 데몬의 기본 관리 계정인 root 계정의 이름을 변경하세요 root 계정 이름의 변경으로 많은 노출을 피할 수 있습니다. 



1RENAME USER root TO new_user


MySQL 5.0.2 이상에서는 위 구문으로 사용자 명을 변경 할 수 있습니다. 만약 그 이하 버전의 mysql을 사용하신다면 아래와 같이 하시면 됩니다. 


1USE mysql;

2UPDATE `user` SET `user`='new_user' WHERE `user` = 'root';

3FLUSH PRIVILEGES;


위 처럼 작업을 하시면 불필요한 root접근을 제한 할 수 있습니다. 

그리고 주기적으로 관리계정(root)비밀번호를 변경하여 주세요 


1SET PASSWORD FOR '관리계정'@'hostname' = PASSWORD('new_password');


또는 

mysqladmin -u '관리계정' -p password newpassowrd

위 구문은 관리 권한으로 수행을 하세요


5. test 데이터 베이스를 삭제 합니다. 

MySQL 설치 후 생성이 되는 test데이터 베이스는 누구나 접근 가능한 데이터 베이스 임으로 삭제를 해줍니다.


6. 익명 계정이나 사용하지 않는 계정은 삭제합니다.

MySQL 을 설치하게 되면 익명계정이 생성이 되어 있습니다. 보안을 위해 익명계정을 삭제를 합니다. 익명 계정의 확인 방법은 아래와 같습니다. 



1SELECT * FROM `mysql`.`user` WHERE `user` = '';


위 쿼리를 수행 하면 익명계정에 대한 정보가 나옵니다. 


1SHOW GRANTS FOR ''@'localhost';


를 수행하면 사용자의 권한은 USAGE 입니다. 사용자의 권한을 확인 해 볼 수 있습니다. 또 직접 접속이 가능 한지 테스트를 해보세요 

mysql -u testuser

만약 접속이 가능하다면 어떠한 계정명이라도 접속이 됩니다. 위와 같은 익명 접속 계정을 삭제 하여 주세요 삭제 방법은 DROP USER ""; 구문으로 삭제가 가능합니다. 이 구문은 MySQL 5.0 이상에서 가능합니다. 그 이하 버전을 사용하고

계신다면 아래와 같이 수행해 주세요 



1USE mysql;

2DELETE FROM `user` WHERE `user` = '';

3FLUSH PRIVILEGES;

7. 데이터 베이스 권한을 조정하세요 

일반 적인 사용자들은 모든 권한이 필요하지 않습니다. 실행 권한인 SELECT/UPDATE/INSERT/DELETE 등의 권한을 추가 해주시요 그외 권한들은 관리자에게 요청시 처리를 해주거나 일시적으로 권한을 부여하여 처리토록 합니다. 불필요하게 많은 권한을 사용자에게 부여하여 보안적으로 취약하게 할 필요는 없습니다.


그리고 SUPER/PROCESS/FILE 등의 권한은 관리 계정(root)만 가질수 있도록 설정해 주세요. MySQL 의 계정을 추가할때 모든 권한을 추가 하는 실수를 할 수 있으니 다시한번 계정에 대한 권한을 검사 해보세요.


1개의 데이터베이스를 가지고 사용하는 사용자가 SHOW DATABASE 등으로 모든 데이터베이스를 보지 못하도록 my.ini 파일에 설정해주세요 

[mysqld]

--skip-show-database

또 SHOW DATABASES 권한을 선택한 사용자에게만 권한을 부여해줍니다.


8. 로그를 활성화 하세요 

데이터 베이스의 로그를 남겨 추후 조취를 취하거나 원인을 분석할 수 있도록 해줍니다. 

[mysqld]

log = /var/log/mysql.log


9. MySQL 관리 계정의 사용 히스토리를 제거하세요 

cat /dev/null > ~/.mysql_history


10. MySQL의 최신 보안 패치를 적용하거나 5.0 이하의 MySQL 버전을 사용하신다면 최신 안정 빌드를 사용하셔서 보안패치 및 MySQL버그에 대한 취약점을 보안해주세요.

물론 OS의 최신 패치 및 기타 보안 취약부분에 대한 점검도 필수겠죠~ ^^