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의 최신 패치 및 기타 보안 취약부분에 대한 점검도 필수겠죠~ ^^