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 + 금칙어 포함 여부 검증
- validate_password 컴포넌트 설치/적용 (Mysql 5.7 : validate_password 플러그인)
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) 값을 통해 직접 로그인하지 못하도록 한다.
실제로 ‘역할’은 ‘계정’처럼 사용될 수도 있다.
그럼에도 역할과 계정을 나눈 이유는 책임을 분리하여 보안을 강화하고자 하는 용도라고 한다.