MySQL

[MySQL] 사용자- 권한(Privilege)과 역할(Role)

meegu 2024. 9. 21. 23:25

1. 권한(Privilege)

1-1. 분류

정적권한(Static Privileges) : 

- MySQL 서버의 소스코드에 고정적으로 명시되어 있는 권한

- 예를들어 SELECT, INSERT, UPDATE, DELETE 등의 기본적인 데이터베이스 작업에 대한 권한

- MySQL이 시작될 때부터 서버 내에서 항상 사용 가능

 

- 글로벌 권한(Global Privileges) : 데이터베이스나 테이블 이외의 객체에 적용되는 권한

- 객체 권한 (Object Privileges) : 데이터베이스나 테이블을 제어하는 데 필요한 권한

 

동적권한(Dynamic Privileges) : 

- 서버가 시작될 때 기본으로 존재하지 않고 컴포넌트나 플러그인을 설치하거나 특정 기능이 추가될 때 동적으로 생성되는 권한

- MySQL의 기능 확장에 따라 새로운 권한이 추가될 수 있음

- 일부는 서버에 명시되어 있기도 함

- MySQL 서버를 재시작하지 않고도 동적으로 권한을 부여하거나 관리할 수 있게해 기능의 유연한 확장을 가능하게 함

 

1-2. 권한 확인, 부여

각 계정이나 권한에 부여된 권한 혹은 역할 확인

(* 이 전에 'migu'라는 계정을 새로 만들었다)

SHOW GRANTS FOR 'migu'@'%';

 

USAGE :

데이터베이스에 접근할 수 있는 기본 권한을 가진 상태

사용자는 MySQL 서버에 접속할 수 있지만, 데이터베이스나 테이블에 대해 실제 작업을 수행할 수 있는 권한은 없다.

사용자 생성에 따른 기본적인 존재를 보장

 

권한 부여 방법

GRANT 권한종류 ON 권한범위 TO 유저

 

 

권한 범위에 따른 권한 부여 방법

 

(1). 글로벌 권한 

GRANT CREATE USER ON *.* TO 'migu'@'%';

 

글로벌 권한은 특정 DB나 테이블에 부여될 수 없기 때문에 ON 절에 항상  ' *.* ' 를 사용

( *.* = 모든 DB의 모든 오브젝트(테이블, 스토어드 프로시저, 함수 등)를 포함해 전체 MySQL 서버를 의미)

migu 계정에 CREATE USER 권한을 주고

해당 계정으로 접속해 계정생성 가능 여부 확인 > 됨

 

(2). DB 권한 

GRANT EVENT ON *.* TO 'migu'@'%';
GRANT EVENT ON sales.* TO 'migu'@'%';

 

DB 권한은 특정 DB에 대해서만 or 서버에 존재하는 모든 DB에 대해서 권한을 부여할 수 있음 

따라서 *.* / DB.*을 모두 사용할 수 있지만 DB권한만 부여하는 경우 테이블에 대해 부여할 수 없기 때문에 테이블까지 명시할 수 없음

 

여기서 DB란?

여러 테이블과 그 외의 오브젝트(예: 뷰, 스토어드 프로시저, 이벤트 등)를 포함하는 논리적 그룹

 

(3). 테이블 권한 

GRANT SELECT, DELETE ON *.* TO 'migu'@'%';
GRANT SELECT, DELETE ON sales.* TO 'migu'@'%';
GRANT SELECT, DELETE ON sales.orders TO 'migu'@'%';

 

테이블 권한은 특정 DB의 오브젝트에 대해서만 or 서버에 존재하는 모든 DB에 대해서 or 특정 DB의 특정 오브젝트에 대해서만 

권한을 부여하는 것이 가능

 

GRANT INSERT, UPDATE(dept_name) ON sales.products TO 'migu'@'%';

 

테이블 특정 컬럼에 대해서만 권한을 부여할 경우 위와 같이 괄호를 사용할 수 있음

위의 경우 INSERT 명령은 모든 컬럼에 대해 수행할 수 있으나, UPDATE 명령의 경우 dept_name 컬럼에 대해서만 수행 가능

 

이러한 권한이 하나라도 설정되면 나머지 모든 테이블의 모든 컬럼에 대해서도 권한 체크를 하기 때문에 전체적으로 성능에 영향을 미칠 수 있기 때문에 지양하고 별도의 뷰를 만드는 방법을 고려해볼 수 있음

 

2. 역할(Role)

2-1. 역할이란?

역할(Role) :

- 권한을 묶어서 사용할 수 있게 하는 것

- 계정에 역할을 부여하면 해당 계정은 역할에 속한 권한을 가지게 됨

- 역할이 활성화 되어있을 때만 사용할 수 있는 상태가 됨

- 서버 내부적으로 역할과 계정은 동일한 객체로 취급 됨 ( mysql DB의 user 테이블을 살펴보면 권한과 사용자 계정이 구분없이 저장된 것을 확인할 수 있음)

 

2-2. 역할 생성 및 사용

(1). activate_all_roles_on_login 시스템 변수 설정

SET GLOBAL activate_all_roles_on_login=ON;

 

역할이 부여된 계정을 로그아웃 했다가 다시 로그인 하는 경우 역할이 활성화 되지 않은 상태로 초기화 되어 매번

SET ROLE '역할명' 명령을 실행해 해당 역할을 활성화해야 하는데,

activate_all_roles_on_login 시스템 변수가 ON으로 되어 있다면 사용자가 MySQL 에 로그인 할 때 자동으로 역할을 활성화 하게 됨

 

(2). 역할 생성

CREATE ROLE
-> role_read,
-> role_write;

- CREATE ROLE '역할명' 으로 역할 정의

- 호스트 부분을 명시하지 않은 경우 자동으로 모든 호스트(%)가 추가됨

 

GRANT SELECT ON *.* TO role_read;
GRANT INSERT, DELETE, UPDATE ON *.* TO role_write;

- GRANT 명령으로 각 역할에 대해 실질적인 권한 부여

 

각각의 역할에 부여된 권한을 확인해보면 명령한대로 잘 부여되어 있음을 확인할 수 있다.

GRANT role_read, role_write TO 'migu'@'%';

- GRANT 명령으로 계정에 역할 부여

시스템 변수를 변경해둔 대로 로그인과 동시에 각 역할이 활성화 되었음을 확인할 수 있다.