강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

MySQL 보안 설정 이렇게 한다.

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

MySQL 보안 설정 이렇게 한다.



 

 

MySQL은 리눅스 서버에서 가장 많이 사용되는 데이터베이스이고 그 사용자수도 꾸준히 늘고 있다.

 

 

 

 

특히 MySQL은 아래의 내용 외에도 많은 장점을 가지고 있는데, MySQL의 가장 큰 장점은 다음과 같다.

 

 

 

 

 

- 동시 사용자 수가 무제한적인 처리 능력


- 50,000,000+ record를 처리할 수 있는 용량


- 매우 빠른 명령 수행 능력


- 쉽고 능률적인 사용자 특권 시스템


- 자유롭게 사용이 가능하며 수시로 업그레이드가 제공된다.

 

 

 

 

 

 

MySQL 역시 많은 버전에서 적지 않은 취약성이 발견되고 있으므로 설치 시에는 아래의 URL을 참고로 취약성이 없는 버전인지 여부를 꼭 확인해 보기 바란다.

 

 

 

 

 

 

http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=mysql

 

여기에서는 데이터베이스로서 MySQL을 사용할 때 일반적으로 취해야 하는 보안설정에 대해 알아보자.



 

 

MySQL은 시스템의 root 계정으로 구동하지 않는다.

 

 

 

 

 

 

여기에서 설명하는 MySQL(3306/tcp) 뿐만 아니라 Oracle(1521/tcp)이나 msql(1114/tcp), MS-SQL(1433/tcp)등 대부분의 DataBase는 시스템 관리자인 root와는 별개의 계정으로 작동하도록 하여야 한다.

 

 

 

 

이와 같은 이유에서 모두 기본적으로 1024 이후의 비 특권 포트를 사용하고 있다.

 

 

 

 

 

 

만약 MySQLroot로 구동할 경우 다음과 같은 위험이 있다.

 

 

 

 

 

 

- buffer overflowMySQL 자체의 취약성이 발생할 경우 MySQL을 구동하는 유저 즉, 시스템의 root 권한을 빼앗길 수 있다.

 

 

 

 

 

- FILE 권한을 가진 유저의 경우 root 권한으로 /root/.bashrc와 같은 파일을 생성할 수 있다.

 

 

 

 

 

 

따라서 일부 DATABASE의 경우 root로 구동하면 에러를 내며 아예 실행되지 않도록 설계된 경우도 있다.

 

 

 

 

MySQL의 경우에는 일반적으로 mysql이라는 특정계정으로만 구동해야만 정상적인 실행이 되도록 되어있다.

 

 

 

 

 

 

또한 자동으로 mysql 계정으로 작동하도록 하려면

su mysql -c "/usr/local/mysql/share/mysql/mysql.server start" 부분을 rc.local 파일에 정의해 주면 된다.

 

 

 

 

또는 /etc/my.cnf에 다음과 같이 추가하면 root가 아닌 다른 유저(아래의 경우 mysql)로 작동하게 된다.

 

[mysqld]

user=mysql

 



 

쉬운 암호를 사용하지 않는다.

 

 

 

 

 

다른 응용 프로그램과 마찬가지로 쉬운 암호를 사용하지 않는 것은 보안의 가장 기본이라 할 수 있다.

 

 

 

 

특히 MySQL의 경우 "mysql -u root"로 실행할 경우 암호만 알고 있다면 누구나 MySQLroot 권한으로 접근할 수 있으므로 반드시 root 암호는 추측하기 어려운 암호로 설정하고 정기적으로 변경하도록 하여야 한다.

 

 

 

 

brute force(무작위 입력) 방식으로 MySQLroot 암호를 해독할 수 있는 방법이 있으므로 각별히 신경 써야 한다.

 

 

 

 

특히 사전에 나오는 단어를 사용하지 말고 영문 자판으로 한글을 입력하는 방식의 암호를 사용하는 것도 좋은 방법이다.

 

 

 

 

아울러 관리자가 변경되었거나 퇴사하였을 경우 root 암호를 변경하는 것이 좋은데, 암호를 변경하려면 아래와 같이 실행하면 된다.

 

 

 

 

 

 

$ mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD('xxxxxxx')

WHERE user='root';

mysql> FLUSH PRIVILEGES;

 




또한 설치 시 기본적으로 설치되는 test DataBase는 삭제하도록 하고, root이외 모든 MySQL 사용자 정보도 삭제하도록 한다.

 

 

 

 

이는 MySQL 서비스를 시작하기 전에 실행하도록 한다.



mysql> drop database test;

mysql> use mysql;

mysql> delete from db;

mysql> delete from user where not (host="localhost" and user="root");

mysql> flush privileges;

 

 




방화벽을 사용하여 MySQL port를 엄격히 제한한다.

 

 

 

 

 

MySQL은 기본적으로 3306/tcp를 사용하는데, 외부에서 이 포트로의 직접 접근을 차단하여야 한다.

 

 

 

 

이를 위해 MySQL 앞단에 방화벽을 설치하는 것이 좋은데, 외부에서 MySQL에 직접 접근 가능한지는 다음과 같이 확인해 보도록 한다.

 

- 외부에서 nmap으로 스캔(scan)해 본다.


- 외부에서 telnet hostname 3306으로 접속해 본다.


- 외부에서 mysql -h hostname으로 접속해 본다.


 

 

 

 

 

 

또한, local에서만 MySQL을 구동한다면 3306/tcp에서 구동하지 않고 유닉스 도메인 소켓을 통해 서비스하도록 하는 것이 보안적인 측면에서 그리고 성능적인 측면에서 더 좋다.

 

 

 

 

이러한 경우 3306/tcp를 통하지 않으므로 굳이 방화벽을 설치하지 않아도 될 것이다.

 

 

 

 

이를 위해서는 두 가지 방법이 있는데, 첫 번째로 /etc/my.cnf 파일에서 아래와 같이 설정 후 MySQL을 재구동하는 방법이 있다.

 

 

 

 

 

[mysqld]

skip-networking

 




두 번째는 MySQL 구동 시 “--skip-networking”을 추가하면 된다.

 

 

 

 

참고로 이는 3.23.27 이하 버전에서는 작동하지 않는다.

 

 

 

 

 

 

인터넷을 통해 평문 데이터를 전송하지 않도록 한다.

 

 

 

 

 

 

원격지의 웹-DB 연동 시 DataBase에 접속하기 위해서는 아이디/암호로 인증을 하게 되는데, 이러한 경우 평문(plain text)으로 전송된다면 아이디/암호가 그대로 유출 되는 문제가 발생할 수 있으므로 인터넷을 통해 전송할 때에는 SSL 또는 SSH를 통해 암호화 하도록 한다.

 

 

 

 

특히 SSH port forwarding을 이용할 경우 암호화뿐만 아니라 패킷의 터널링(tunneling)을 통해 패킷 압축 효과도 기대할 수 있다.

 

 

 

 

그리고 MySQL 4.0 이상에서는 자체적으로 OpenSSL을 지원하므로 MySQL을 업그레이드하는 것도 고려할 수 있다.

 

 

 

 

물론 뒤에서 살펴볼 VPN으로 상호 연동하는 것도 좋은 방법이다.

 

 

 

 

 

실제, 스니핑을 통해 아이디/암호 등이 노출되는지는 다음과 같이 확인해 볼 수 있다.

 

 

 

 

 

# tcpdump -l -i eth0 -w - src or dst port 3306 | strings

 




접근 권한을 엄격하게 제한한다.


 

- MySQL 관리자가 아닌 일반 유저에게 process 권한을 주지 않도록 한다.

 

 

 

 

만약 이 권한 이 주어질 경우 “show processlist;”를 실행하면 현재 실행되는 query를 모니터링 할 수 있으며 이 중에는 “UPDATE user SET password=PASSWORD('xxxxx')”과 같은 query도 직접 볼 수 있으며 결국 암호도 쉽게 유출될 수 있게 된다.

 

 

 

 

 

 

- MySQL 관리자가 아닌 일반 유저에게 SUPER 권한을 부여하지 않도록 한다.

 

 

 

 

만약 이 권한이 주어질 경우 clientconnection을 종료하거나 서버의 시스템 변수를 변경할 수 있게 된다.

 

 

 

 

 

- MySQL 관리자가 아닌 일반 유저에게 FILE 권한을 부여하지 않도록 한다.

 

 

 

 

만약 이 권한이 주어질 경우 mysqld가 실행되는 권한으로 파일을 생성할 수 있게 될 것이다.

 

 

 

 

 

 

- 각 유저 당 허용되는 동시 접속자수를 제한하려면 mysqld 가동 시

“max_user_connections” 옵션을 사용하도록 한다.

 

 

 

 

 

 

- 만약 mysqldmysql 권한으로 실행할 경우 mysql 디렉토리 이하에 대한 읽고 쓰기 권한은 mysql로 제한한다.

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,810 개
  • 현재 접속자 :  100 명