사용자, 권한, 역할
사용자 식별
하나의 계정에는 아이디와 호스트(IP or Hostname)가 함께 사용된다.
모든 외부 컴퓨터에서 접속이 가능한 사용자 계정을 생성하려면 호스트를
‘%’로 설정하면 된다.동일한 아이디를 가졌지만 호스트가 다른 계정들이 있다면, 좁은 범위의 호스트를 가진 계정을 우선시하게 된다.
시스템 계정과 일반 계정
시스템 계정
SYSTEM_USER권한을 갖고 있는 계정을 의미한다.계정 관리, 세션에서 실행중인 쿼리 강제 종료, 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정하는 등 중요 작업을 수행할 수 있다.
DBA가 이 계정을 통해 데이터베이스를 관리하게 된다.
일반 계정
SYSTEM_USER권한을 갖고 있지 않은 계정을 의미한다.mysql.sys,mysql.session,mysql.infoschema계정은 내부적으로 사용할 목적을 위해 내장해둔 계정이다.
계정 생성 및 변경
CREATE USER명령으로 계정을 생성하고,GRANT명령으로 권한을 부여할 수 있다.인증 방식, 비밀번호 옵션(유효 기간, 이력 개수 등), 기본 역할, SSL 옵션, 계정 잠금 여부를 설정하여 생성할 수 있다.
Caching SHA-2 Pluggable Authentication방식을 기본 인증 방식으로 사용한다. SCRAM 인증 방식을 통해 기본적으로 5000번의 해시 함수를 실행하여 결과를 만들고 로그인 요청을 보낸다. 해시 결과값을 메모리에 캐싱하여 성능을 보완한다.
이중 비밀번호
보통 응용 프로그램 서버들은 공용 계정으로 데이터베이스 서버를 사용한다. 이 때 공용 계정의 비밀번호를 변경하면 기존 서비스들에서 접근할 수 없게 되는 문제가 있다.
하나의 계정에 2개의 비밀번호를 동시에 가질 수 있도록 하고, Primary, Secondary로 구분한다.
기존 계정에서 비밀번호를 변경하고자 할 때,
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’ RETAIN CURRENT PASSWORD옵션을 사용하면 새로운 비밀번호는 Primary가 되고 기존 비밀번호는 Secondary가 된다.기존 비밀번호는
ALTER USER ‘root’@’localhost’ DISCARD OLD PASSWORD명령으로 제거할 수 있다.
권한
글로벌 권한
데이터베이스나 테이블 이외의 객체에 적용되는 권한
객체 권한
데이터베이스나 테이블 제어 시에 필요한 권한
동적 권한
MySQL 서버의 컴포넌트나 플러그인이 설치되었을 때 등록되는 권한
백업 관리, 복제 관리, 서버 관리 등 다양한 권한 범위를 나누어 적용할 수 있다.
부여
GRANT privilege_list ON db.table TO ‘user’@’host’;형태로 권한을 부여할 수 있다.privilege_list에는
,를 통해 여러 권한을 명시할 수 있다.ON 절에서는 어떤 데이터베이스의 어떤 오브젝트에 권한을 부여할 지 결정한다.
글로벌 권한의 경우 특정 데이터베이스나 테이블에 부여될수 없으므로 항상
ON *.*를 사용해야 한다.DB 권한의 경우 특정 DB 또는 전체 DB에 대해 부여할 수 있다. 하지만 테이블 단위까지는 부여할 수 없다.
테이블 권한의 경우 특정 데이터베이스나 테이블 단위로 부여할 수 있다.
칼럼 별 권한도 부여 가능하다. INSERT, UPDATE, SELECT 권한만 부여 가능하다.
GRANT SELECT,INSERT,UPDATE(column_name) ON db.table TO ‘user’@’host’;다만 이렇게 하나라도 칼럼 별 권한을 부여하는 경우 모든 칼럼에 대해 권한 체크를 하므로 전체적인 성능이 저하될 수 있다.
따라서 권한을 분리하고자 하는 칼럼만으로 구성된 별도의 뷰를 만들어 권한을 부여하는 것이 낫다.
역할
역할을 생성하고 권한을 부여한 후, 계정마다 역할을 부여할 수 있다.
activate_all_roles_on_login옵션을 true로 두면 사용자 로그인 시 자동으로 역할이 활성화되지만, 기본적으로 false이므로 역할 활성화를 별도로 해주어야 한다.
Last updated