콘텐츠로 이동

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 USER
  • GRANT
  • REVOKE
  • SHOW 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 계정은 관리 작업에만 사용됨
  • 애플리케이션 전용 계정 존재
  • 최소 권한만 부여됨
  • % 기반 접근 제거 또는 제한됨