DEV
라는 Redshift
의 데이터베이스
안에 네 개의 스키마를 생성한다. (스키마의 목적은 내부에 있는 테이블의 목적이 무엇인지를 속한 스키마만 보고도 파악할 수 있도록 해 주는 것)RAW_DATA
는 ETL
의 결과가 들어가는 스키마 ANALYTICS
는 ELT
의 결과가 들어가는 스키마 ADHOC
은 테스트용 테이블이 들어가는 스키마 PII
는 개인 정보가 들어가는 스키마✔ 이때 개인 정보는 잘못 사용해서 노출되면 패널티가 크기 때문에 관리를 철저하게 해야 한다. 웬만하면 사용하지 않는 것이 좋지만 꼭 해야 한다면 별도의 스키마를 두고, 그 밑에 테이블을 둔다. 이 테이블에 접근할 수 있는 인원은 꼭 개인 정보를 보아야 하는 인원으로만 구성해서 최소화하며 꼭 로그를 남긴다.
CREATE SCHEMA
를 통해 생성해 줄 수 있다.CREATE SCHEMA RAW_DATA;
CREATE SCHEMA ANALYTICS;
CREATE SCHEMA ADHOC;
CREATE SCHEMA PII;
PG_NAMESPACE
를 조회해 확인할 수 있다.SELECT *
FROM PG_NAMESPACE;
RAW_DATA
, ALALYTICS
, ADHOC
, PII
이렇게 생성해 준 네 개의 스키마가 생성되어 조회되는 것을 확인할 수 있다.테이블에 접근 권한을 부여해 줄 사용자를 생성한다.
사용자를 생성할 때는 CREATE USER
를 통해 생성할 수 있다.
이때 PASSWORD
뒤에는 설정해 줄 비밀번호를 입력해 주면 되는데 사용자를 생성할 때 비밀번호에 대한 제약 조건이 존재한다.
제약 조건에 어긋나는 비밀번호를 입력하면 (psycopg2.errors.SyntaxError) password must contain an uppercase ASCII character
이런 오류를 겪게 된다.
나는 대문자를 입력하지 않아 오류가 발생했다. 제약 조건에 맞는 비밀번호를 입력하면 Done
이라는 문구가 뜨게 된다.
CREATE USER song PASSWORD '...';
PG_USER
를 조회해 준다.SELECT *
FROM PG_USER;
song
이 등록된 것을 볼 수 있다.그룹이 필요한 이유는 사용자가 많아지게 되면 사용자 개개인에게 일일이 권한을 부여하는 것이 어려워지기 때문이다.
이를 해결하기 위해 테이블별로 접근 권한을 정하는 것이 아니라 스키마별로 권한을 정하고, 사용자들도 사용자별로 권한을 정하는 것이 아니라 그룹별로 권한을 정한다.
대신 그룹은 계승이 되지 않는다. 예를 들어 B 그룹이 A 그룹의 권한 + 추가 권한이라고 해도 A 그룹의 권한을 가지고 올 수 없고 다시 설정해 주어야 한다. 그렇기 때문에 너무 많은 그룹이 생기면 관리가 어려워진다. 이 문제를 해결하기 위해 나온 게 역할(Role)
이다.
먼저 다음과 같은 그룹을 생성해 보자.
analytics_users
analytics_authors
pii_users
CREATE GROUP
구문을 통해 그룹을 생성할 수 있다.
CREATE GROUP analytics_users;
CREATE GROUP analytics_authors;
CREATE GROUP pii_users;
ALTER GROUP groupname ADD USER username
를 사용해 주며 특정 권한을 줄 때는 GRANT
명령을 통해 줄 수 있다.ALTER GROUP analytics_users ADD USER song;
ALTER GROUP analytics_authors ADD USER song;
ALTER GROUP pii_users ADD USER song;
PG_GROUP
을 조회하면 된다.SELECT *
FROM PG_GROUP;
앞서 말했듯 역할(Role)
은 계승이 되지 않는 그룹(Group)
의 문제를 해결해 줄 수 있다. 즉, 계승이 된다는 뜻이다.
역할은 사용자에게 부여될 수도 있고, 다른 역할에 부여될 수도 있다.
한 사용자는 그룹과 동일하게 다수의 역할에 소속이 가능하다.
역할을 생성할 때는 CREATE ROLE
을 사용해 준다.
CREATE ROLE staff;
CREATE ROLE manager;
CREATE ROLE external;
GRANT ROLE rolename TO username
, GRANT ROLE rolename TO ROLE otherrolename
으로 쿼리문을 사용해 주면 된다. -- staff 역할을 song이라는 사용자에게 부여한다.
GRANT ROLE staff TO song;
-- staff 역할을 manager 역할에게 부여한다
GRANT ROLE staff TO ROLE manager;
SVV_ROLES
를 조회하면 된다.SELECT *
FROM SVV_ROLES;
staff
, manager
, external
이라는 세 개의 역할(role)
이 생성된 것을 볼 수 있다.