MySql은 사용자 아이디뿐 아니라 해당 사용자가 어느 IP에서 접속하고 있는지도 확인한다
MySql 8.0 버전부터는 권한을 묶어서 관리하는 역할 개념이 도입
사용자의 개정뿐 아니라 사용자의 접속 지점도 계정의 일부가 되기에 계정을 언급할 때는 항상 아이디와 호스트를 함께 명시해야 한다
// 로컬에서만 접근 가능
'svv_id'@'127.0.0.1'
// 모든 외부에서 접근하는 계정
'svc_id'@'%'
동일한 계정에 접근 범위가 적은것이 있다면 접근범위 중 가장 작은 것을 항상 먼저 선택하여 접근
어떤 SYSTEM_USER 권한을 가지고 있느냐에 따라 시스템 계정과 일반 계정으로 구분
시스템 계정에서만 가능한 것
MySql 서버에 내정된 계정들
MySql 8.0 버전부터는 계정의 생성은 CREATE USER 명령으로, 권한 부여는 GRANT 명령으로 구분해서 실행하도록 변경
GRANT로 설정할 수 있는 옵션
가장 많이 사용되는 옵션을 가진 CREATE USER 명령어
CREATE USER 'user'@'%'
IDENTIFIED WITH 'mysql_native_password' BY 'password'
REQUIRE NONE
PASSWORD EXPIRE INTERVAL 30 DAY
ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT;
IDENTIFIED WITH
REQUIRE
PASSWORD EXPIRE
PASSWORD HISTORY
PASSWORD REUSE INTERVAL
PASSWORD REQUIRE
ACCOUNT LOCK / UNLOCK
비밀번호를 쉽게 유추할 수 있는 단어들이 사용되지 않게 글자의 조합을 강제하거나 금칙어 사용하는 기능도 존재
비밀번호의 유효성 체크 규칙을 적용하려면 validate_password 컴포넌트를 이용하는데 이를 설치해야 사용 가능
INSTALL COMPONENT 'file://component_validate_password';
비밀번호 정책(default: MEDIUM)
금칙어 설정 방법
SET GLOBAL validate_password.dictionary_file='prohibitive_word.data';
SET GLOBAL validate_password.policy='STRONG';
서비스 중인 DB에서 비밀번호가 변경이 되면 장애가 발생하기에 서비스 중인 경우 서비스를 멈추지 않고서는 비밀번호를 변경하는 것은 불가능했다
이를 개선하기 위해 계정의 비밀번호로 2개의 값을 동시에 사용할 수 있게 했다
Primary: 최근 설정한 비밀 번호
Secondary: 이전 비밀번호
이중 비밀번호를 사용하려면 기존 비밀번호 변경 구문에 RETAIN CURRENT PASSWORD 옵션을 추가
Secondary 비밀번호를 꼭 삭제할 필요는 없지만 보안을 위해서 삭제하는 것이 좋다
사용자에게 권한을 부여할 때는 GRANT 명령을 사용
권한을 묶어서 역할을 사용할 수 있게 됐다
// 역할 생성
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_read TO reader@'127.0.0.1'
GRANT role_emp_read, role_emp_write TO writer@'127.0.0.1'
로그 아웃 후 다시 로그인하면 역할이 초기화 되는데 이를 위해 아래 글로벌 변수를 설정하면 로그인과 동시에 역할이 활성화 됨
SET GLOBAL activate_all_roles_on_login=ON;