시스템 계정과 일반 계정
MySQL 8.0부터, 계정은 SYSTEM_USER 권한을 가지고 있느냐에 따라 시스템 계정, 일반 계정으로 구분된다.
- 시스템 계정: 데이터베이스 서버 관리자를 위한 계정으로, 시스템 계정과 일반 계정을 관리할 수 있다.(SYSTEM_USER 권한을 가짐)
- 데이터베이스 서버 관리와 중요 작업은 시스템 계정으로만 수행 가능하다.
- 주요 기능
- 계정 관리
- 다른 세션 또는 그 세션에서 실행 중인 쿼리를 강제 종료
- 스토어드 프로그램 생성 시 Definer를 타 사용자로 설정
- 일반 계정: 응용 프로그램이나, 개발자를 위한 계정이다.(SYSTEM_USER 권한이 없음)
MySQL에 내장된 계정 같은 경우는 'root'@'localhost'를 제외한 계정은 각 다른 목적으로 사용되니 삭제하지 말자
- 'mysql.sys'@'localhost': MySQL 8.0부터 기본으로 내장된 sys 스키마의 객체들의 DEFINER로 사용되는 계정
- 'mysql.session'@'localhost': MySQL 플러그인이 서버로 접근할 때 사용되는 계정
- 'mysql.infoschema'@'localhost': information_schema에 정의된 뷰의 DEFINER로 사용되는 계정
계정 생성
create user 'user'@'%'
IDENTIFIED with 'mysql_native_password' by 'test1234'
require none
password expire interval 30 day
account unlock
password history default
password reuse interval default
password require current default;
MySQL 5.7 버전까지는 GRANT 명령으로 권한 부여와 계정 생성이 가능했지만 MySQL 8.0부터는 계정 생성은 CREATE USER 명령으로, 권한 부여는 GRANT 명령으로 구분해서 실행해야 한다.
계정 생성 시, 설정할 수 있는 옵션
- 계정의 인증 방식과 비밀번호
- 비밀번호 관련 옵션
- 기본 역할
- SSL 옵션
- 계정 잠금 여부
IDENTIFIED WITH
사용자의 인증 방식과 비밀 번호를 설정한다.
set global default_authentication_plugin="mysql_native_password" -- 기본 인증 방식 변경
- IDENTIFIED WITH 뒤에는 반드시 인증 방식을 명시해야 하며, MySQL 기본 인증 방식을 사용하려면 IDENTIFIED BY 'password' 형식으로 명시해야 한다.
- 대표 방식
- Native Pluggable Authentication: MySQL 5.7버전까지 기본으로 사용되는 방식으로 단순 비밀번호에 대한 해시 값을 저장해 두고 클라이언트가 보낸 해시값과 일치하는지 비교하는 방식이다.
- Caching SHA-2 Pluggable Authentication: MySQL 5.6에 도입되었고, 암호화 해시값 생성을 위해 SHA-2 알고리즘을 사용한다.(해당 인증 방식을 사용하려면 SSL/TLS 또는 RSA 키페어를 사용해야 하므로, 클라이언트에서 접속 시 SSL 옵션을 활성화해야 한다.) -> MySQL 8.0 기본 방식
- PAM Pluggable Authentication: 유닉스와 리눅스 패스워드 또는 LSAP 같은 외부 인증을 사용할 수 있게 해주는 인증 방식(엔터프라이즈 에디션만 가능)
- LDAP Pluggable Authentication: LDAP을 이용한 외부 인증을 사용할 수 있게 해주는 인증 방식(엔터프라이즈 에디션만 가능)
REQUIRE
MySQL 서버에 접속할 때 암호화된 SSL/TLS 채널을 사용할 지 여부를 설정한다.
- 설정하지 않으면 비암호화 채널로 연결하게 된다.
- Caching SHA-2 Pluggable Authentication 인증 방식을 사용하면 암호화된 채널만으로 MySQL 서버 접근이 가능하다.
PASSWORD EXPIRE
비밀번호의 유효 기간을 설정하는 옵션이다.
- 별도로 명시하지 않으면 default_password_lifetime 시스템 변수에 저장된 기간으로 유효 기간이 설정된다.
- 개발자나 데이터베이스 관리자의 비밀번호는 유효 기간 설정하는게 좋으나, 응용 프로그램 접속용 계정에 유효 기간을 설정하는 것은 위험할 수 있다
- 옵션
- PASSWORD EXPIRE: 계정 생성과 동시에 비밀번호 만료 처리
- PASSWORD EXPIRE NEVER: 계정 비밀번호의 만료 기간 없음
- PASSWORD EXPIRE DEFAULT: default_password_lifetime 시스템 변수에 저장된 기간으로 비밀번호의 유효 기간을 설정
- PASSWORD EXPIRE INTERVAL n DAY: 비밀번호의 유효 기간을 오늘부터 n일자로 설정
PASSWORD HISTORY
한번 사용했던 비밀번호를 재사용 못하게 설정하는 옵션(mysql DB의 password_history 테이블을 사용한다)
- PASSWORD HISTORY DEFAULT: password_history 시스템 변수에 저장된 개수만큼 비밀번호의 이력을 저장하며, 저장된 이력에 남아있는 비밀번호는 재사용할 수 없다.
- PASSWORD HISTORY n: 비밀번호의 이력을 최근 n개까지만 저장하며 저장된 이력에 남아있는 비밀번호는 재사용할 수 없다.
PASSWORD REUSE INTERVAL
한번 사용했던 비밀번호의 재사용 금지 기간을 설정하는 옵션이다.
- 별도로 설정하지 않으면, password_reuse_interval 시스템 변수에 저장된 기간으로 설정한다.
- PASSWORD REUSE INTERVAL DEFAULT: password_reuse_interval 변수에 저장된 기간으로 설정
- PASSWORD REUSE INTERVAL N DAY: N일자 이후에 비밀번호를 재사용할 수 있게 설정
PASSWORD REQUIRE
비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호를 필요로 할지 말지를 결정하는 옵션
- 별도로 설정하지 않으면, password_reuse_current 시스템 변수의 값으로 설정된다.
- PASSWORD REQUIRE CURRENT: 비밀번호를 변경할 때 현재 비밀번호를 먼저 입력하도록 설정
- PASSWORD REQUIRE OPTIONAL: 비밀번호를 변경할 때 현재 비밀번호를 입력하지 않아도 되도록 설정
- PASSWORD REQUIRE DEFAULT:password_reuse_current 시스템 변수의 값으로 설정
ACCOUNT LOCK/UNLOCK
계정 생성 시 ALTER USER 명령을 사용해 계정 정보를 변경할 때 계정을 사용하지 못하게 잠글지 여부를 결정
- ACCOUNT LOCK: 계정을 사용하지 못하게 잠금
- ACCOUNT UNLOCK: 잠긴 계정을 다시 사용 가능 상태로 잠금 해제