MySQL 사용자 및 권한 설정¶
운영 서버(Production Server) 에서 MySQL 사용자 계정과 권한을
안전하게 구성하기 위한 표준 운영 절차(runbook) 를 정의함.
단순한 명령어 나열이 아니라,
왜 root와 사용자 계정을 분리해야 하는지,
어떤 작업을 어떤 권한으로 수행해야 하는지를 명확히 함.
1. 계정 분리의 기본 원칙¶
운영 환경에서 MySQL 계정은 반드시 역할별로 분리함.
1.1 root 계정의 역할¶
- MySQL 내부 최고 관리자
- 계정 생성, 권한 변경, 스키마 관리 전용
- 운영 트래픽 처리 ❌
- 애플리케이션 접속 ❌
root 계정은 관리 작업을 위한 도구이지 서비스 계정이 아님
1.2 애플리케이션 계정의 역할¶
- 애플리케이션이 DB에 접근하기 위한 전용 계정
- 필요한 DB와 권한만 보유
- root 권한 절대 부여하지 않음
계정을 분리하는 이유는 다음과 같음.
- 사고 범위 최소화
- 최소 권한 원칙 적용
- 보안 사고 발생 시 즉각적인 차단 가능
- 운영 책임과 애플리케이션 책임 분리
운영 환경에서 애플리케이션이 root로 접속하는 구조는 설계 단계에서 실패한 구조임.
2. 작업 권한 기준 (중요)¶
2.1 OS 레벨 권한¶
- 사용자 생성 ❌
- 권한 부여 ❌
MySQL 사용자/권한 작업은 OS 권한이 아니라 DB 권한임.
따라서 dnf, systemctl 과 달리
이 문서의 대부분 작업은 sudo가 필요하지 않음.
2.2 DB 레벨 권한¶
다음 작업은 MySQL 내부 관리자 권한이 필요함.
CREATE USERGRANTREVOKESHOW GRANTS
초기 상태에서는 root 계정만 해당 권한을 가짐.
3. MySQL root 계정으로 접속¶
운영 서버에서는 OS 접근과 DB 접근을 분리함.
권장 방식 (sudo 사용)¶
sudo mysql -u root -p
- OS 접근은 sudo 정책으로 통제
- DB 접근은 MySQL 인증으로 통제
- root 직접 로그인 최소화 가능
이 방식이 운영 서버 기준 표준임.
4. 기존 사용자 확인¶
현재 등록된 사용자와 Host 범위를 확인함.
USE mysql;
SELECT HOST, USER FROM user;
- 불필요한 계정 존재 여부 확인
%Host 계정은 특별히 주의해서 검토함
5. 애플리케이션 사용자 생성¶
애플리케이션 전용 계정을 생성함.
CREATE USER '[User]'@'[Host]' IDENTIFIED BY '[Password]';
ex)
CREATE USER 'testuser'@'192.168.0.1' IDENTIFIED BY 'testuserpassword';
설계 기준은 다음과 같음.
- 사용자명은 서비스 역할 기준으로 명확히 지정
- Host는 가능한 한 명시적으로 지정
%사용은 운영 환경에서 지양함
6. 권한 부여 원칙¶
6.1 최소 권한 원칙¶
권한은 반드시 필요한 범위만 부여함.
GRANT [Privileges] ON [Database].* TO '[User]'@'[Host]';
또는
GRANT [Privileges] ON [Database].[Table] TO '[User]'@'[Host]';
ex)
GRANT SELECT, INSERT, UPDATE, DELETE ON testdatabase.* TO 'testuser'@'192.168.0.1';
또는
GRANT SELECT, INSERT, UPDATE, DELETE ON testdatabase.testdatabase_table TO 'testuser'@'192.168.0.1';
ALL PRIVILEGES사용하지 않음- DB 단위 이상 권한 최소화
- 테이블 단위 권한은 필요 시에만 사용함
- 애플리케이션 계정에는
WITH GRANT OPTION부여하지 않음
WITH GRANT OPTION은 관리자 또는 위임 관리 계정에만 예외적으로 검토함.
일반 애플리케이션 계정에 부여하면 권한 위임 범위가 확대되어 운영 사고 시 영향 범위가 커짐.
6.2 권한 적용 및 확인¶
FLUSH PRIVILEGES;
SHOW GRANTS FOR '[User]'@'[Host]';
- 권한 적용 여부 반드시 확인
- 문서화되지 않은 권한 부여 금지
7. 금지 패턴 (운영 환경)¶
운영 환경에서 다음 패턴은 금지함.
GRANT ALL PRIVILEGES ON *.* TO '[User]'@'%';
금지 이유는 다음과 같음.
- 침해 발생 시 전체 DB 즉시 노출
- 사고 범위 통제 불가
- 감사 및 추적 불가능
편의성을 이유로 한 과도한 권한 부여는 운영 사고의 직접 원인임.
8. 권한 회수 및 계정 정리¶
불필요한 권한은 즉시 회수함.
REVOKE SELECT, DELETE ON [Database].* FROM '[User]'@'[Host]';
또는
REVOKE SELECT, DELETE ON [Database].[Table] FROM '[User]'@'[Host]';
ex)
REVOKE SELECT, DELETE ON testdatabase.* FROM 'testuser'@'192.168.0.1';
또는
REVOKE SELECT, DELETE ON testdatabase.testdatabase_table FROM 'testuser'@'192.168.0.1';
계정 제거가 필요한 경우 다음과 같이 처리함.
DROP USER '[User]'@'[Host]';
- 미사용 계정 방치 금지
- 권한 변경 이력은 반드시 기록함
9. 작업 완료 기준¶
다음 조건을 만족해야 사용자 및 권한 설정이 완료된 것으로 간주함.
- root 계정은 관리 작업에만 사용됨
- 애플리케이션 전용 계정 존재
- 최소 권한만 부여됨
%기반 접근 제거 또는 제한됨