DBAtlas · 데이터베이스 운영 아틀라스

MySQL 보안 강화(상태 점검, 네트워크, TLS, 인증, 권한, audit, 암호화)

MySQL난이도: 중급소요 시간: 5분(점검) – 3시간(전체 강화)

설치 가이드가 아닙니다. 운영 중인 MySQL 8.4 / 8.0 서버의 취약점을 찾아 해소합니다. 먼저 읽기 전용 상태 점검이 취약점을 심각도 순으로 나열하고 각 발견 사항이 어느 카드로 이어지는지 알려 줍니다. 이후 영역을 하나씩 또는 전체를 순서대로 조치합니다: bind_address, firewall, 계정의 host 제한; TLS, require_secure_transport, 클라이언트의 VERIFY_IDENTITY; caching_sha2_password, 비밀번호 정책, 원격 root와 익명 계정; 롤과 DDL 권한 없는 애플리케이션 계정; audit; InnoDB tablespace encryption(keyring component); 암호화된 백업; 운영 체제; 버전 추적. Audit은 Community에 없으며 MySQL Enterprise(유료 구독) 또는 Percona Server(무료)가 필요합니다. TDE는 Community에도 있습니다. 마지막에 점검을 다시 실행합니다.

구성: MySQL 서버 1대 + 애플리케이션 서버(클라이언트 검증); replica/InnoDB Cluster는 참고 사항에

시나리오

  • 상태 점검: 어떤 취약점이 있는가?(읽기 전용) — 가장 먼저 실행할 점검입니다. 익명/비밀번호 없는/원격 root 계정, 모든 곳(%)에서의 접근, 취약한 인증 플러그인, 전역 권한, TLS, audit, 암호화, 파일 권한, firewall을 확인하며 아무것도 변경하지 않습니다.
  • 전체 강화(모두 순서대로) — 새로 설치했거나 한 번도 강화하지 않은 서버: 모든 영역을 안전한 순서로 적용합니다. MySQL을 여러 번 재시작하므로 유지보수 창이 필요합니다.
  • 네트워크와 연결: 누가 어디서 접속할 수 있는가?(bind_address, firewall, host 제한) — MySQL이 모든 인터페이스에서 수신 대기하고, 계정 host가 '%'이며, 포트가 모두에게 열려 있습니다. bind_address를 바꾸면 재시작이 필요합니다.
  • 연결 암호화(TLS, require_secure_transport, VERIFY_IDENTITY) — 자동 생성된 자체 서명 인증서를 사용하거나, 암호화되지 않은 연결을 허용하거나, 클라이언트가 인증서를 검증하지 않습니다. ALTER INSTANCE RELOAD TLS로 중단 없이 적용합니다.
  • 인증과 비밀번호(caching_sha2, 비밀번호 정책, root) — mysql_native_password 계정, 비밀번호 정책 없음, 원격 root, 익명 계정, test 데이터베이스. 중단 없음.
  • 최소 권한: 롤과 DDL 권한 없는 애플리케이션 계정 — 애플리케이션 계정의 CREATE/ALTER/DROP 또는 . 권한, FILE/SUPER 권한을 가진 계정; 읽기/쓰기/DDL 롤과 권한 보고서. 중단 없음.
  • Audit: 누가 무엇을 했는가? — 감사 담당자가 세션과 쿼리 기록을 요구합니다. MySQL Community에는 내장 audit이 없습니다: Enterprise Audit, Percona Server Audit Log Filter, 또는 Community용 제한적 대안. 라이선스: Enterprise Audit은 MySQL Enterprise 구독에만 포함되며, Percona Audit Log Filter는 무료입니다.
  • 디스크의 데이터 암호화(InnoDB tablespace encryption, keyring) — 디스크나 백업 복사본 도난에 대비한 테이블, redo, undo, binlog 암호화. keyring component 설치에 재시작 1회, 큰 테이블은 ALTER 시간이 걸립니다. Community에서도 라이선스 없이 사용할 수 있으며, 암호화/KMS keyring은 Enterprise 기능입니다.
  • 백업 보안(암호화된 백업, login-path, 권한) — 백업이 암호화되지 않았거나 누구나 읽을 수 있는 디렉터리에 있고, 스크립트에 평문 비밀번호가 있습니다. mysqldump + GPG 또는 XtraBackup --encrypt, 백업 계정과 login-path.
  • 운영 체제 측면(서비스 계정, 권한, core dump, SELinux) — 데이터 디렉터리나 인증서 파일이 다른 사용자에게 열려 있고, secure_file_priv가 비어 있으며, local_infile이 켜져 있고, SELinux가 꺼져 있습니다. 일부 설정은 재시작 시 적용됩니다.
  • 패치와 버전: 지원되는 버전인가? — 버전, 지원 종료(8.0은 2026년 4월 종료), 대기 중인 업데이트를 확인하고 적용은 업그레이드 가이드로 연결합니다. 읽기 전용.

시작하기 전에

  • MySQL …이(가) 실행 중이며, 서버에서 root로 mysql 명령이 비밀번호 없이 로그인됩니다(root@localhost auth_socket 또는 mysql_config_editor의 client login-path). MySQL 설치 가이드로 설치했다면 이미 준비되어 있습니다. 단계의 SQL은 root로 mysql -t를 통해 실행됩니다.
  • 서버에 SSH 세션 두 개를 열어 두고, 한쪽에는 mysql 클라이언트를 열어 둡니다. 계정 host, require_secure_transport, firewall을 변경한 뒤에는 별도 세션에서 새 연결을 시험하고, 성공을 확인하기 전까지 기존 세션을 닫지 마십시오. root@localhost 소켓 로그인은 이 가이드에서 전혀 바뀌지 않으므로 항상 복구 경로로 남습니다.
  • 유지보수 창: 선택한 영역에서 MySQL을 재시작합니다(bind_address, keyring component, audit 플러그인, core dump 제한). replica가 있는 환경에서는 replica에 먼저 적용하십시오.
  • MySQL에 접속하는 모든 애플리케이션 목록(서버 IP, 계정, 드라이버 버전). 점검 단계에서 현재 연결을 보여 줍니다. 목록에 없는 클라이언트는 제한 후 접속할 수 없습니다.
  • 최신이며 복구까지 검증된 백업이 있습니다(논리 백업 또는 XtraBackup). 암호화(TDE) 단계는 keyring 파일을 잃으면 데이터를 읽을 수 없게 만듭니다. 백업은 keyring 설정 전에 받으십시오.

가이드 단계

  • 상태 점검(읽기 전용) — 데이터베이스 내부 발견 사항 나열 · 운영 체제 측면 점검
  • 시작 전: 복구 지점 — 현재 설정, 계정, 권한 사본 확보 · 추가 구성 디렉터리 활성화
  • 권한 — 1. 진단 — 계정 권한 조회
  • 권한 — 3. 적용 — 롤 생성 및 권한 부여 · 계정 생성 및 롤 연결 · 애플리케이션 계정의 직접 권한 회수 · 권한 보고서
  • 권한 — 4. 검증 — 유효 권한에 DDL이 없는지 검증 · 애플리케이션 서버에서 DDL 시도
  • 권한 — 5. 후속 조치 — migration 계정은 사용하지 않을 때 잠가 두기
  • 인증 — 1. 진단 — 인증 플러그인, 비밀번호 설정, 기본 계정 조회
  • 인증 — 2. 안전장치 — 드라이버 호환성 확인
  • 인증 — 3. 적용 — 익명 계정, 원격 root, test 데이터베이스 제거 · 비밀번호 정책 설정(validate_password, 이력) · mysql_native_password 계정을 caching_sha2_password로 전환 · 개인 DBA 계정 생성
  • 인증 — 4. 검증 — 계정 상태 검증 · 애플리케이션 서버에서 root 로그인 시도
  • TLS — 1. 진단 — 현재 TLS 설정과 암호화되지 않은 클라이언트 조회
  • TLS — 3. 적용 — 테스트 CA와 서버 인증서 생성 · 키와 서명 요청(CSR) 생성 · 서명된 인증서 배치 · 인증서와 키 검증 · SELinux 레이블 지정 · 서버를 새 인증서로 전환(중단 없음) …
  • TLS — 4. 검증 — 암호화되지 않은 연결 거부 확인
  • TLS — 5. 후속 조치: 인증서 갱신 — 인증서 갱신 절차
  • 네트워크 — 1. 진단: 누가 어디서 접속하는가? — 수신 대기 주소, 계정 host, 활성 클라이언트 조회
  • 네트워크 — 3. 적용 — '%' host 계정을 애플리케이션 네트워크로 제한 · 수신 대기 주소 제한(재시작 시 적용) · firewall에서 포트를 허용된 네트워크에만 개방 · 수신 대기 주소 적용을 위한 MySQL 재시작
  • 네트워크 — 4. 검증 — 애플리케이션 서버에서 연결 시험(새 세션)
  • Audit — 1. 진단 — Audit 플러그인과 로그 설정 조회
  • Audit — 3. 적용 — Community: 로그인 실패와 DML 쿼리 텍스트 기록 · Enterprise Audit 플러그인 설치 · Enterprise Audit 필터 정의 · Percona Audit Log Filter 컴포넌트 설치 · Percona audit 필터 정의 · Audit 로그를 중앙 서버로 전송(rsyslog imfile) …
  • Audit — 4. 검증 — 변경을 하나 하고 기록 확인
  • 백업 — 1. 진단 — 백업 암호화 상태와 비밀번호 파일 조회
  • 백업 — 3. 적용 — 최소 권한 백업 계정 생성 · 비밀번호를 login-path에 저장 · GPG 공개 키 가져오기 · 암호화 백업 스크립트 · XtraBackup 암호화 백업 스크립트 · 키 파일, 백업 디렉터리, 수동 테스트 …
  • 백업 — 4. 검증 — 암호화 백업 복호화 시험
  • 운영 체제 — 1. 진단 — 서비스 계정, 권한, 파일 권한, SELinux
  • 운영 체제 — 3. 적용 — 파일 가져오기/내보내기 제한 · 데이터 디렉터리와 키 파일 권한 수정 · core dump 비활성화 · systemd 다시 로드 및 MySQL 재시작 · 명령 이력에 비밀번호가 남지 않게 하기 · SELinux를 Enforcing으로 유지
  • 운영 체제 — 4. 검증 — 변경 사항 검증
  • 암호화 — 1. 진단 — keyring과 암호화 상태 조회
  • 암호화 — 2. 안전장치 — 암호화 전 전체 백업
  • 암호화 — 3. 적용 — keyring component manifest 작성 · keyring 디렉터리와 구성 준비 · keyring 로드를 위한 재시작 · redo, undo, binlog, 새 테이블 암호화 활성화 · 애플리케이션 데이터베이스의 테이블 암호화 · keyring 파일 백업
  • 암호화 — 4. 검증 — 암호화와 keyring 검증
내 환경에 맞춘 단계별 계획 열기 →