- MySQL을 사용할 때 일반적으로 취해야 하는 보안설정
1. MySQL은 시스템의 root 계정으로 구동하지 않는다.
- MySQL(3306/tcp), Oracle(1521/tcp), mssql(1114/tcp), MS-SQL(1433/tcp) 등 대부분의 데이터베이스는 시스템 관리자인 root와는 별개의 계정으로 작동해야 한다.
- MySQL을 root로 구동할 경우의 위험들..
- buffer overflow등 MySQL 자체의 취약성이 발생할 경우 MySQL을 구동하는 user가 시스템의 root권한을 빼앗길 수 있다.
- file 권한을 가진 유저의 경우 root권한으로 /root/.bashrc 와 같은 파일을 생성할 수 있다.
- 자동으로 mysql 계정으로 작동하도록 하려면
- su mysql -c "/usr/local/mysql/bin/mysql.server start" 부분을 rc.local 파일로 정의해 주면 된다.
- 또는 /etc/my.cnf 에 다음과 같이 추가하면 root가 아닌 다른 유저로 작동하게 된다.
[mysqld]
user=mysql
2. 쉬운 암호를 사용하지 않는다.
- 관리자가 변경되었거나 퇴사하였을 경우 root 암호를 변경하는 것이 좋은데, 변경하려면 다음과 같다
$ mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('xxxxxxxxx')
WHERE user='root';
mysql> FLUSH PRIVILEGES;
3. 방화벽을 사용하여 MySQL port를 제한한다.
- MySQL은 기본적으로 3306/tcp를 사용하는데, 외부에서 이 포트로의 직접 접근을 차단해야 한다.
이를 위해 앞단에 방화벽을 설치하는 것이 좋은데, 외부에서 MySQL에 직접 접근 가능한지를 확인한다.
1) 외부에서 nmap으로 스캔(scan)해 본다.
2) 외부에서 telnet hostname 3306으로 접속해본다.
3) 외부에서 mysql -h hostname으로 접속 해본다.
4. 인터넷을 통해 평문 데이터를 전송하지 않도록 한다.
- 원격지의 웹-DB 연동시 Database에 접속 하기 위해서는 아이디/암호로 인증하게 되는데, 이러한 경우 평문으로 전송된다면 아이디/암호가 그대로 유출 되는 문제가 발생할 수 있기 때문에 인터넷을 통해 전송할 때는 SSL 또는 SSH를 통해 암호화 하도록 한다.
- 실제, 스니핑을 통해 아이디/암호등이 노출되는지 확인
# tcpdump -l -i eh0 -w - src or dst port 3306 | strings
5. 접근 권한을 엄격히 제한한다.
- MySQL 관리자가 아닌 일반 유저에게 process 권한을 주지 않도록 한다. 만약 이 권한이 주어질 경우 "show processlist;"를 실행하면 현재 실행되는 query를 모니터링 할 수 있으며 이중에는 "UPDATE user SET password=PASSWORD('xxxxx')"과 같은 query도 직접 볼 수있으며 결국 암호도 쉽게 유출될 수 있게 된다.
- MySQL 관리자가 아닌 일반유저에게 SUPER 권한을 부여하지 않도록 한다. 만약 이 권한이 주어질 경우 client의 connection을 종료하거나 서버의 시스템 변수를 변경할 수 있게 된다.
- 각 유저당 허용되는 동시 접속자수를 제한하려면 mysqld 가동시 "max_user_connnections 옵션을 사용
- 만약 mysqld를 mysql 권한으로 실행할 경우 mysql 디렉토리 이하에 대한 읽고 쓰기 권한은 mysql로 제한한다.
출처 : 리눅스 서버보안관리 실무 -수퍼유저코리아