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';"

데이터베이스 보안은 한 번 설정하고 끝나는 것이 아닙니다. 정기적으로 계정과 권한을 점검하는 습관이 중요합니다.