VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
배포 환경별 강화
모든 강화 단계가 같은 위험/마찰 트레이드오프를 갖는 것은 아닙니다. 이 표를 사용해 우선순위를 정하세요:
인터넷 노출은 로드 밸런서 뒤에 있더라도 포트 3306에 사설 네트워크 밖에서 접근할 수 있다는 뜻입니다. 모든 “필수” 행을 예외 없이 적용하세요.
내부/사설 네트워크는 VPC, 사설 서브넷, 사무실 네트워크 안에서만 접근할 수 있는 서버를 말합니다. 일부 완화 조치(CA 서명 인증서, 모든 계정에 SSL 강제)는 미미한 이득에 비해 운영 부담을 더합니다 — 하지만 강력한 비밀번호, 최소 권한, bind-address 제한은 여전히 타협할 수 없습니다.
개발/스테이징 머신은 자격 증명 유출의 가장 흔한 원인입니다. 비밀번호 복잡성을 생략하거나
'%' 호스트 권한을 그대로 두는 것은 인스턴스에 노트북이나 CI 환경 밖에서 접근할 수 없을 때만 허용됩니다. 스테이징이 프로덕션 데이터와 네트워크를 공유한다면 최소한 내부/사설로 취급하세요.
mysql_secure_installation
로컬 개발 머신이 아닌 모든 서버에서는 MySQL을 설치한 직후 이것을 실행하세요:- root 비밀번호 설정(아직 설정하지 않았다면)
- 익명 사용자 제거
- 원격 root 로그인 금지
- test 데이터베이스 제거
- 권한 테이블 다시 로드
root 계정 제한
root는localhost에서만 연결해야 합니다. 이를 확인하고 강제하세요:
'%' 호스트 항목이 있으면 제거하세요:
익명 사용자와 test 데이터베이스 제거
비밀번호 정책
MySQL 8.0+에는 비밀번호 복잡성 규칙을 강제하는validate_password 컴포넌트가 포함되어 있습니다. 사용하기 전에 설치해야 합니다 — mysql_secure_installation이 자동 설치를 제안합니다. 수동으로 설치하려면:
LOW(길이만), MEDIUM(길이 + 문자 종류), STRONG(+ 사전 검사).
잊힐 수 있는 계정에는 비밀번호 만료를 설정하세요:
최소 권한 사용자 계정
애플리케이션 계정은 필요한 최소한의 권한만 가져야 합니다. 전체 GRANT 구문은 MySQL 사용자 관리를 참조하세요. 흔한 패턴:'%'가 아니라 서브넷 표기나 특정 IP를 사용하세요.
기존 권한 감사
모든 계정과 그 권한을 검토하세요:SSL/TLS 연결
MySQL 8.0은 기본적으로 SSL/TLS를 활성화하고 시작 시 인증서를 자동 생성합니다. 활성화되었는지 확인하세요:네트워크 접근
MySQL이 필요한 인터페이스에서만 수신하도록 제한하세요.my.cnf에서:
127.0.0.1에 바인딩하고 포트 3306을 외부에 절대 노출하지 마세요. 방화벽 규칙은 두 번째 방어 계층이지, bind address 제한의 대체물이 아닙니다.
위험한 기능 비활성화
애플리케이션이 사용하지 않는 기능을 끄세요:my.cnf에서:
자주 묻는 질문
기본 MySQL 8.4 설치는 안전한가요?
이전 MySQL 기본값보다는 낫지만, 여전히 프로덕션용으로 강화되어 있지는 않습니다. MySQL 8.4는 무작위 root 비밀번호를 생성하고 기본적으로 SSL을 활성화합니다. 그래도 여전히 다음이 필요합니다: root 비밀번호가 강력한지 확인, 익명 사용자 제거, 호스트 접근 제한,validate_password 컴포넌트 설정.
MySQL을 root로 실행해야 하나요?
절대 안 됩니다. MySQL은 전용 저권한 시스템 사용자(일반적으로mysql)로 실행해야 합니다. 서버 프로세스를 root로 실행하면 MySQL 취약점 공격이 전체 시스템 장악으로 이어질 수 있습니다.
문제 해결
함께 보기
- MySQL 사용자 관리 — 사용자 생성과 최소 권한 부여
- MySQL의 비밀번호 해싱 — MySQL에 저장된 애플리케이션 수준 자격 증명 보호
- MySQL의 JWT 인증 — 자격 증명 발급과 교체를 ID 공급자로 옮기기