3.1 사용자 식별
- MySQL은 사용자 계정과 접속 위치로 계정을 식별한다.
- 모든 외부 클라이언트에서 접속이 가능하다면 'user_id'@'%' 처럼 호스트부분을 % 문자로 대체하면 된다.
- 로그인 시 권한이나 계정 정보는 가장 작은 범위에 해당하는 정보에 매칭된다.
- 관리 편의상 가급적 중복이 되지 않도록 하자.
3.2 사용자 계정 관리
- 8.0 부터 계정은 시스템 계정과 일반 계정으로 구분된다.
- 시스템 계정 : SYSTEM_USER 권한을 가지고 있다. 데이터베이스 관리를 위한 계정이다.
- 계정관리, 타 세션 쿼리 강제 종료 등이 가능하다.
- 일반 계정 : SYSTEM_USER 권한을 가지고 있지 않다. 일반적인 데이터베이스 사용을 위한 계정이다.
- 시스템 계정 : SYSTEM_USER 권한을 가지고 있다. 데이터베이스 관리를 위한 계정이다.
- 내장된 계정
- 'mysql.sys'@localhost : 내장 스키마 객체의 DEFINER로 사용되는 계정
- 'mysql.session'@'localhost' : MySQL 플러그인이 서버로 접근할 때 사용되는 계정
- 'mysql.infoschema'@'localhost' : information_schema에 정의된 뷰의 DEFINER로 사용되는 계정
- 삭제되지 않도록 주의하자. 위 계정은 account_locked 되어 있다.
- 계정 생성은 CREATE USER 명령으로, 권한 부여는 GRANT 명령으로 수행 가능하다.
- CREATE USER 'user'@'%' : 계정명과 호스트 이름을 지정한다.
- IDENTIFIED WITH 'mysql_native_password' by 'password' : 인증 플러그인을 명시한다.
- REQUIRE NONE : 접속 시 SSL/TLS 채널을 사용할지 여부를 설정한다.
- PASSWORD EXPIRE NEVER : 비밀번호의 만료 기간을 지정한다.
- PASSWORD HISTORY DEFAULT : password history 값 만큼의 이력을 저장하고, 이력에 있는 비밀번호는 재사용할 수 없다.
- PASSWORD REUSE INTERVAL DEFAULT : 재사용 금지 기간을 명시한다.
- PASSWORD REQUIRE CURRENT DEFAULT : 비밀번호 변경 시 현재 비밀번호를 요구할지를 의미한다.
- ACCOUNT UNLOCK : 계정 사용 여부를 지정한다.
- CREATE USER 'user'@'%' : 계정명과 호스트 이름을 지정한다.
3.3 비밀번호 관리
- 이중 비밀번호
- 비밀번호를 크기가 2인 SLIDING WINDOW 방식으로 관리한다.
- 이중 비밀번호를 사용하지 않는다면 데이터베이스 비밀번호 변경이 어렵다.
- ALTER USER 'root'@'localhost' IDENTIFED BY 'new_password' RETAIN CURRENT PASSWORD;
- RETAIN CURRENT PASSWORD 로 기존 비밀번호를 세컨더리 비밀번호로 설정할 수 있다.
- ALTER USER 'root'@'localhost' DISCARD OLD PASSWORD로 비밀번호 변경 작업이 끝나면 세컨더리 비밀번호를 폐기하자.
3.4 권한
- 글로벌 권한과 객체 권한
- 글로벌 권한 : 데이터베이스나 테이블 이외의 객체에 적용되는 권한.
- CREATE ROLE, CRATE USER, SHUTDOWN 등
- 객체 권한: 데이터베이스 객체에 적용되는 권한.
- CREATE, GRANT OPTION, DROP, ALTER, DELETE, INSERT, SELECT, UPDATE, CREATE VIEW 등
- 글로벌 권한 : 데이터베이스나 테이블 이외의 객체에 적용되는 권한.
- 동적 권한과 정적 권한
- 동적 권한은 서버의 컴포넌트나 플러그인이 설치되면 등록되는 권한이다.
- SYSTEM_USER, SET_USER_ID, BACKUP_ADMIN 등
- SUPER 라는 권한이 8.0 부터 동적 권한으로 잘게 쪼개졌다.
- 동적 권한은 서버의 컴포넌트나 플러그인이 설치되면 등록되는 권한이다.
- 권한의 부여
- GRANT 명령어를 사용한다.
- GRANT SUPER ON . TO 'user'@'localhost';
- 글로벌 권한은 특정 객체에 부여될 수 없으므로 ON . 를 사용한다.
- GRANT EVENT ON employees.* TO 'user'@'localhost;
- GRANT SELECT, INSERT, UPDATE, DELETE ON employees.department TO 'user'@'localhost';
- 모든 객체를 의미하는 . 이나 특정 객체를 지정하는 표현식을 사용 할 수 있다.
- 테이블이나 칼럼 단위의 권한은 성능 상 이슈로 잘 사용하지 않는다. 별도의 VIEW를 만들어 권한을 부여하는 것을 권장한다.
- 부여된 권한의 확인은 SHOW GRANTS; 명령을 사용하면 된다.
- GRANT SUPER ON . TO 'user'@'localhost';
- GRANT 명령어를 사용한다.
3.5 역할 (ROLE)
- 역할은 권한을 묶은 것이다.
- CREATE ROLE 명령어로 역할을 만들고, GRANT 명령어로 권한을 부여한다.
- CRATE ROLE role_emp_read; : 역할을 생성
- GRANT SELECT ON employees.* TO role_emp_read; : 역할에 권한 부여
- GRANT role_emp_read TO 'reader'@'%' : 계정에 역할을 바인딩
- (reader 계정으로 로그인 후) SET ROLE 'role_emp_read';
- SELECT current_role();
- activate_all_roles_on_login 시스템 변수로 로그인 시 역할을 자동으로 활성화 할 수 있다.
- 역할과 계정은 내부적으로 동일하다.
'데이터베이스' 카테고리의 다른 글
[RealMySQL 8.0] 5장 트랜잭션과 잠금 (0) | 2025.01.02 |
---|---|
[RealMySQL 8.0] 4장 아키텍처 (0) | 2024.12.16 |
[RealMySQL 8.0] 1장. 소개, 2장. 설치와 설정 (0) | 2024.12.10 |
CAP 이론 소개 - 데이터베이스 초보자용 (2) | 2022.03.26 |
Shared Lock 과 Exclusive Lock (0) | 2021.12.05 |