Database/Mysql

[Real MySQL] 3. 사용자 및 권한

noahkim_ 2023. 11. 23. 16:45

"Real MySQL" 책을 정리한 포스팅 입니다.

 

1. 사용자 식별

'svc'@'127.0.0.1'
'svc'@'%'
  • 홀따옴표로 감싸 식별자 표시를 합니다.
  • 사용자의 접속지점도 계정의 일부가 됩니다.
    • 아이디와 호스트를 함께 명시해야 합니다.
    • 로그인 시에 계정의 접속지점이 호스트 정보와 불일치하다면 접속할 수 없습니다.

 

2. 사용자 계정 관리

시스템 계정과 일반 계정

  • SYSTEM_USER 권한을 가지고 있느냐에 따라 시스템 계정과 일반 계정으로 구분됩니다.

 

시스템 계정
  • 데이터베이스 서버 관리자를 위한 계정
  • 기능
    • 계정관리
    • 다른 세션 강제 종료
    • 스토어트 프로그램 생성시 DEFINER를 타 사용자로 설정

 

일반 계정
  • 개발자를 위한 계정

 

내장 계정

  • 잠겨있는 계정입니다.
SELECT user, host, account_locked FROM mysql.user WHERE USER LIKE 'mysql.%';

 

mysql.sys
  • 기본적으로 내장된 sys 스키마의 객체들의 DEFINER로 사용되는 계정

 

mysql.session
  • 플러그인이 서버로 접근할 때 사용되는 계정

 

mysql.infoschema
  • information_schema에 정의된 뷰의 DEFINER로 사용되는 계정

 

계정 생성

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
  • 인증방식과 비밀번호를 설정합니다.
  • 다양한 인증방식을 플러그인 형태로 제공합니다.
    • Native Pluggable Authentication : 비밀번호에 대해 해시값을 저장하고 인풋값이 일치하는지 비교하는 방식
    • Caching SHA-2 Pluggable Authentication : 암호화 해시값 생성을 위해 SHA-2 알고리즘을 사용합니다.(ssl or RSA 필수)
    • PAM Pluggable Authentication : 외부 인증을 사용할 수 있게 해주는 인증방식
    • LDAP Pluggable Authentication : LDAP 인증을 사용할 수 있게 해주는 인증방식

 

REQUIRE
  • MySQL 서버에 접속할 때 암호화된 SSL/TLS 채널을 사용할 지 여부를 설정한다

 

PASSWORD EXPIRE
  • 비밀번호의 유효기간을 설정하는 옵션
  • 별도로 명시하지 않으면 default_password_lifetime 시스템 변수에 저장된 기간으로 설정됩니다.
  • INTERVAL n DAY (유효기간)

 

PASSWORD HISTORY
  • 한번 사용했던 비밀번호를 재사용하지 못하게 하는 옵션
  • password_history 테이블에 password_history 시스템 변수 갯수만큼 패스워드 변경 이력을 저장합니다.

 

PASSWORD REUSE INTERVAL
  • 한 번 사용했던 비밀번호의 재사용 금지 기간을 설정하는 옵션
  • password_reuse_interval 시스템 변수 기간 만큼 패스워드 재사용이 금지됩니다.

 

PASSWORD REQUIRE
  • 비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호를 입력해야 할지 말지를 결정하는 옵션
  • CURRENT : 현재 비밀번호 입력 필요 O
  • OPTIONAL : 현재 비밀번호 입력 필요 X
  • DEFAULT : password_require_current 시스템 변수의 값으로 설정

 

ACCOUNT LOCK / UNLOCK
  • 계정을 사용하게 할지 말지를 정하는 옵션

 

3. 비밀번호 관리

고수준 비밀번호

  • 비밀번호의 유효기간이나 이력 관리를 통한 재사용 금지 뿐만 아니라 글자의 조합이나 금칙어를 설정하는 기능도 있습니다.
  • 이를 위해 validate_password 컴포넌트를 사용해야 합니다.

 

정책
  • LOW : 길이
  • MEDIUM : 길이, 숫자, 대소문자, 특수문자 
  • STRONG : 길이, 숫자, 대소문자, 특수문자, 금칙어 

 

validate_password 시스템 변수
  • 'validate_password.check_user_name'
  • 'validate_password.length'
  • 'validate_password.mixed_case_count'
  • 'validate_password.number_count'
  • 'validate_password.special_char_count'
  • 'validate_password.policy' : 정책
  • 'validate_password.dictionary_file' : 금칙어가 작성된 파일 경로

 

이중 비밀번호

  • 두개의 비밀번호를 설정할 수 있으며, 하나만 맞더라도 로그인이 성공합니다.

 

Primary, Secondary 설정
ALTER USER 'root'@'localhost' IDENTIFIED BY 'old_pwd';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_pwd' RETAIN CURRENT PASSWORD;

 

Secondary 삭제
ALTER USER 'root'@'localhost' DISCARD OLD PASSWORD;

 

4. 권한

글로벌 권한과 객체 권한

글로벌 권한
  • 데이터베이스나 테이블 이외의 객체에 적용되는 권한 입니다.

 

객체 권한
  • 데이터베이스나 테이블을 제어하는데 필요한 권한 입니다.
  • 반드시 특정 객체를 명시해야 합니다.

 

동적 권한

  • 서버가 시작되면서 동적으로 생성하는 권한
  • 백업 관리자와 복제 관리자가 꼭 필요한 권한만 부여할 수 있습니다.

 

GRANT 문

  • 각 권한의 특성에 따라 ON 절에 명시되는 오브젝트의 내용이 바뀌어야 합니다.
GRANT privilege_list ON db.table TO 'user'@'host';
GRANT SUPER ON *.* TO 'user'@'localhost';
GRANT EVENT ON *.* TO 'user'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'user'@'localhost';

 

5. 역할

  • 권한을 묶어서 역할을 사용할 수 있습니다.
  • 역할과 사용자는 동일한 객체로 취급됩니다.

 

생성과정

정의
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;

 

계정에 역할 부여
GRANT role_emp_read TO 'reader'@'localhost';
GRANT role_emp_read, role_emp_write TO 'writer'@'localhost';

 

역할 활성화
SET ROLE 'role_emp_read';
  • 'activate_all_roles_on_login' 시스템 변수를 활성화하면 로그인과 동시에 부여된 역할이 자동으로 활성화됩니다.