본문 바로가기
데이터베이스

[RealMySQL 8.0] 3장 사용자 및 권한

by 판교가고싶어요 2024. 12. 14.

3.1 사용자 식별

  • MySQL은 사용자 계정과 접속 위치로 계정을 식별한다.
    • 모든 외부 클라이언트에서 접속이 가능하다면 'user_id'@'%' 처럼 호스트부분을 % 문자로 대체하면 된다.
    • 로그인 시 권한이나 계정 정보는 가장 작은 범위에 해당하는 정보에 매칭된다.
    • 관리 편의상 가급적 중복이 되지 않도록 하자.

3.2 사용자 계정 관리

  • 8.0 부터 계정은 시스템 계정과 일반 계정으로 구분된다.
    • 시스템 계정 : 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 : 계정 사용 여부를 지정한다.

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; 명령을 사용하면 된다.

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 시스템 변수로 로그인 시 역할을 자동으로 활성화 할 수 있다.
  • 역할과 계정은 내부적으로 동일하다.