03. 사용자 및 권한

03. 사용자 및 권한

MySQL 사용자 계정 = 사용자 ID, 호스트(사용자 IP) 구성

MySQL 8.0 부터는 Role(역할) 개념이 도입되었다. Role 을 부여함으로써, 미리 준비된 권한들을 부여할 수 있다.


3.1 사용자 식별 #

사용자 계정

  • 사용자 ID
  • 호스트(사용자 IP, 도메인)

아래와 같이 동일한 두 계정이 있다면, 로그인 시 좁은 범위의 계정이 선택된다.

`test`@`127.0.0.1` (pw : 123)
`test`@`%` (pw : abc)

(로컬호스트 환경에서) test 계정으로 로그인 시, test@127.0.01 계정으로 로그인을 시도 한다.


3.2 사용자 계정 관리 #

Mysql 8.0 부터는 SYSTEM_USER 권한을 가지고 있느냐에 따라, ‘시스템 계정(System Account)’, ‘일반 계정(Regular Account)’ 로 구분된다.

  • 시스템 계정 : DB 서버 관리자
    • 시스템 계정 / 일반 계정 관리 O
    • DB 서버 관리 등의 중요 작업 수행 O
      • 계정 관리
      • 세션 / 쿼리 종료 등
  • 일반 계정 : DB 일반 사용자 (개발자 등)

Mysql 5.7 까지는 GRANT 명령어를 통해 ‘계정 생성’ + ‘권한 부여’가 한번에 가능했다.

Mysql 8.0 부터는 계정 생성(CREATE USER), 권한 부여(GRANT) 명령어를 구분하여 실행한다.

CREATE USER `user`@`%`
    IDENTIFIED WITH `mysql_native_password` BY `password` # 인증 방식 ( 비밀번호 설정)
    REQUIRE NONE                            # (서버 접속 ) 암호화된 SSL/TLS 채널 사용 여부 결정
    PASSWORD EXPIRE INTERVAL 30 DAY         # 비밀번호 만료 기간 설정
    ACCOUNT UNLOCK                          # 계정 잠금 / 해제 설정
    PASSWORD HISTORY DEFAULT                # 비밀번호 이력 설정
    PASSWORD REUSE INTERVAL DEFAULT         # 비밀번호 재사용 이력 설정
    PASSWORD REQUIRE CURRENT DEFAULT;       # 비밀번호 변경  현재 비밀번호 입력 여부 설정

인증 방식에 대해서는 여러 종류가 있다고 하니, 상세한 내용은 별도로 확인해볼 것.

3.3 비밀번호 관리 #

validate_password

다음과 같은 관리를 할 수 있다.

  • 비밀번호 유효기간 설정
  • (이력 관리를 통한) 재사용 금지 기능
  • 금칙어 설정 기능
    • validate_password 컴포넌트 설치/적용 (Mysql 5.7 : validate_password 플러그인)
      • LOW : 비밀번호 길이만 검증
      • MEDIUM : LOW + 숫자, 대소문자, 특수문자 조합 검증
      • STRONG : MEDIUM + 금칙어 포함 여부 검증

Dual Password

하나의 계정에 2개의 비밀번호(Primary, Secondary) 사용 가능

* 보통 실무에서 사용 중인 비밀번호는 못바꾸는 경우가 많다. (바꾸려면 잠깐 서비스를 중단해야 한다.) 이런 경우 dual password 를 사용할 수 있다.


3.4 권한 (Privilege) #

* Mysql 5.7 까지, ‘글로벌 권한’, ‘객체 권한’으로 구분했다. (‘정적 권한’ 이라고도 한다.)
* Mysql 8.0 에서는, ‘동적 권한’ 이 추가되었다.

  • 정적 권한 : Mysql 소스코드에 (고정적으로)명시되어 있는 권한
  • 동적 권한 : (Mysql 서버가 시작되면서) 동적으로 생성하는 권한
    • 예시 : 컴포넌트, 플러그인이 설치되었을 때 등록되는 권한

  • 글로벌 권한 : 글로벌에 적용하는 권한 (DB, 테이블에 적용하는 것 X)
  • 객체 권한 : DB, Table 에 적용하는 권한

* 객체 권한을 (테이블의) 컬럼에 적용할 수 있다. 다만, 컬럼 단위의 권한이 하나라도 설정되면 나머지 모든 테이블의 모든 컬럼에 대해서도 권한 체크를 진행한다. 따라서 전체적인 성능에 영향을 미칠 수 있다.


3.5 역할 (Role) #

* Mysql 8.0 부터 생긴 개념이다.

내부적으로 ‘계정’과 동일하다.


# '역할' 생성
CREATE ROLE
    role_emp_read,
    role_emp_write;


# '역할' 권한 부여
GRANT SELECT ON employees.* TO role_emp_read;
GRANT INSERT, UPDATE, DELETE ON employees.* TO role_emp_write;


# '계정' 생성
CREATE USER `reader`@`127.0.0.1` IDENTIFIED BY 'qwerty';
CREATE USER `writer`@`127.0.0.1` IDENTIFIED BY 'qwerty';


# '계정' '역할' 부여
GRANT role_emp_reader TO `reader`@`127.0.0.1`;
GRANT role_emp_writer TO `writer`@`127.0.0.1`;


# '역할(권한)' 활성화
SET ROLE 'role_emp_read';
SET ROLE 'role_emp_writer';

아래의 쿼리 시 ‘계정’, ‘역할’ 모두 보여진다.

select user, host, account_locked from mysql.user;

* ‘계정’, ‘역할’을 어떻게 구별하나?

구별할 필요가 없다. 하나의 계정의 권한을 다른 계정의 권한에 병합하는 개념이다.
기본적으로 ‘역할’에는 account_locked (Y) 값을 통해 직접 로그인하지 못하도록 한다.
실제로 ‘역할’은 ‘계정’처럼 사용될 수도 있다.
그럼에도 역할과 계정을 나눈 이유는 책임을 분리하여 보안을 강화하고자 하는 용도라고 한다.