MySQL은 웹 서비스에서 가장 많이 사용되는 데이터베이스입니다. 기본 설치 상태로 운영하면 여러 보안 위험에 노출될 수 있습니다. 이 글에서는 운영 서버에 적용해야 할 MySQL 보안 설정을 정리합니다.
1. 보안 초기화 스크립트 실행
MySQL 설치 후 가장 먼저 실행해야 할 명령입니다:
sudo mysql_secure_installation
이 스크립트는 다음을 설정합니다:
- root 비밀번호 설정
- 익명 사용자 제거
- 원격 root 로그인 비활성화
- test 데이터베이스 제거
- 권한 테이블 갱신
2. root 계정 원격 접속 차단
-- MySQL 접속
sudo mysql -u root -p
-- root 계정의 호스트 확인
SELECT user, host FROM mysql.user WHERE user = 'root';
-- 원격 root 접속 제거 (localhost만 허용)
DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;
3. 데이터베이스별 전용 계정 생성
서비스마다 최소 권한의 전용 계정을 사용합니다:
-- 데이터베이스 생성
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 전용 계정 생성 (로컬호스트만 허용)
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password_here';
-- 해당 DB에만 권한 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
-- 권한 확인
SHOW GRANTS FOR 'myapp_user'@'localhost';
4. MySQL 포트 원격 노출 차단
/etc/mysql/mysql.conf.d/mysqld.cnf 파일을 편집합니다:
[mysqld]
# 로컬호스트에서만 수신
bind-address = 127.0.0.1
웹 서버와 DB가 같은 서버에 있다면 원격 접속 자체를 차단하는 것이 가장 안전합니다.
sudo systemctl restart mysql
5. 비밀번호 정책 강화
-- 현재 비밀번호 정책 확인
SHOW VARIABLES LIKE 'validate_password%';
-- 정책 설정
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
/etc/mysql/mysql.conf.d/mysqld.cnf에 영구 설정:
[mysqld]
validate_password.policy = MEDIUM
validate_password.length = 12
6. 일반 쿼리 로그 비활성화
운영 환경에서 일반 쿼리 로그는 디스크를 빠르게 소모하며 민감한 정보(비밀번호 등)가 기록될 수 있습니다:
[mysqld]
# 일반 로그 비활성화 (기본값)
general_log = 0
# 슬로우 쿼리 로그는 성능 분석에 유용
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
7. 정기 보안 점검
# 계정 목록 확인
sudo mysql -e "SELECT user, host, authentication_string FROM mysql.user;"
# 익명 계정 확인
sudo mysql -e "SELECT user, host FROM mysql.user WHERE user='';"
# 불필요한 계정 제거
sudo mysql -e "DROP USER ''@'localhost';"
데이터베이스 보안은 한 번 설정하고 끝나는 것이 아닙니다. 정기적으로 계정과 권한을 점검하는 습관이 중요합니다.