mysql
DB의 user
테이블을 살펴보면 실제 권한과 사용자 계정이 구분 없이 저장된 것을 확인할 수 있다.역할과 계정의 차이는 account_locked
칼럼의 값이 다를 뿐 아무런 차이가 없다.
SELECT user, host, acount_locked FROM mysql.user;
role_
등)나 키워드를 추가해 역할의 이름을 선택하는 방법을 권장한다.CREATE ROLE
명령으로 역할을 정의한다.이렇게 만들어진 역할은 빈 껍데기만 있는 역할이다.
호스트 부분을 별도로 명시하지 않으면 자동으로 ‘모든 호스트(%)’가 자동으로 추가된다.
-- role_emp_read와 role_emp_write라는 이름의 역할을 정의
CREATE ROLE role_emp_read, role_emp_write;
-- 위의 쿼리와 동일한 계정이 생성된다.
CREATE ROLE role_emp_read@'%', role_emp_write@'%';
GRANT
명령으로 각 역할에 대해 실질적인 권한을 부여한다.-- role_emp_read 역할에 employees DB의 모든 객체에 대해 SELECT 권한 부여
GRANT SELECT ON employees.* TO role_emp_read;
-- role_emp_write 역할에 employees DB의 모든 객체에 대해 데이터 변경 권한 부여
GRANT INSERT, UPDATE, DELETE ON employees.* TO role_emp_write;
CREATE USER
명령으로 계정을 생성(아무런 권한 없음) 후 GRANT
명령으로 역할을 부여한다.
-- 계정 생성
CREATE USER reader@'127.0.0.1' INDENTIFIED BY 'qwerty'
CREATE USER writer@'127.0.0.1' INDENTIFIED BY 'qwerty'
-- 계정에 역할 부여
GRANT role_emp_read TO reader@'127.0.0.1'
GRANT role_emp_write TO writer@'127.0.0.1'
SHOW GRANTS
명령을 계정이 가진 권한을 확인할 수 있다.실제 역할은 부여되어 있지만 계정의 활성화된 역할을 조회해 보면 해당 역할이 없음을 확인할 수 있다.
-- 계정의 활성화된 역할 조회
SELECT current_role();
SET ROLE
명령을 실행해 해당 역할을 활성화해야 한다.일단 역할이 활성화되면 그 역할이 가진 권한은 사용할 수 있는 상태가 된다.
계정이 로그아웃됐다가 다시 로그인하면 역할이 활성화되지 않은 상태로 초기화돼 버린다.
-- 계정 활성화
SET ROLE 'role_emp_read';
activate_all_roles_on_login
시스템 변수로 설정할 수 있다.MySQL 서버의 역할은 자동으로 활성화되지 않게 설정돼 있다.
activate_all_roles_on_login
시스템 변수를 ON으로 설정하면 SET ROLE 명령으로 역할을 활성화하지 않아도 로그인과 동시에 부여된 역할이 자동으로 활성화된다.
-- 자동으로 역할 활성화
SET GLOBAL activate_all_roles_on_login=ON;
-- 역할 생성
CREATE ROLE role_emp_local_read@localhost;
-- 계정 생성
CREATE USER reader@'127.0.0.1' IDENTIFIED BY 'qwerty';
-- 역할에 권한 부여
GRANT SELECT ON employees.* TO role_emp_local_read@'localhost';
-- 계정에 역할 부여
-- 호스트가 달라서 호환되지 않음에도 SELECT 권한이 부여된다.
GRANT role_emp_local_read@'localhost' TO reader@'127.0.0.1';
CREATE ROLE
명령으로 생성하고, 계정은 CREATE USER
명령으로 생성CREATE USER
명령에 대해서는 권한이 없지만 CREATE ROLE
명령만 실행 가능한 사용자는 역할을 생성할 수 있다.account_locked
칼럼의 값이 ‘Y’로 설정돼 있어서 로그인 용도로 사용할 수가 없게 된다.SHOW GRANTS
명령을 사용
mysql
DB의 권한 관련 테이블 참조 (표 형태로 깔끔하게 볼 수 있다)
저장소 테이블 | 설명 |
---|---|
mysql.default_roles | 계정별 기본 역할 |
mysql.role_edges | 역할에 부여된 역할 관계 그래프 |