やりたいこと
- Redshift のユーザーについて、WLM とアクセス権限を別々のグルーピングを行いたい。
- WLM のワークロードキューで管理したいユーザー群とアクセス権限が同じユーザー群が異なるグルーピングになるため。
実装方法
- WLM(Workload Mangagement)のワークロードキューはユーザーグループで設定し、アクセス権限制御はロールで設定する。
- RBAC(Role Based Access Control)のアクセス権限機能(階層構造と継承など)を利用できるため、アクセス権限制御はロールを用いる。
- WLM 以下の理由でグループを使用する
検証ポイント
- ロールで設定通りのアクセス制御が行われること
- グループでWLM制御が行われること
構成要素(グループ・ユーザー・ロール・スキーマ・テーブル)
- ユーザーグループ
- batch_group
- batch_user_01
- batch_user_02
- adhoc_user_group
- individual_user_01
- individual_user_02
- ロール
- system_role
- batch_user_01
- batch_user_02
- individual_role
- individual_user_01
- individual_user_02
- スキーマ
- system_schema
- individual_schema
- テーブル
- system_role がアクセスできるテーブル
- system_schema.stg_tbl_01
- system_schema.dwh_tbl_01
- individual_role がアクセスできるテーブル
- individual_schema.wrk_tbl_01
- individual_schema.wrk_tbl_02
CREATE GROUP batch_group;
CREATE GROUP adhoc_user_group;
# バッチユーザー
CREATE USER batch_user_01 PASSWORD 'Password123!' IN GROUP batch_group;
CREATE USER batch_user_02 PASSWORD 'Password123!' IN GROUP batch_group;
# 個人ユーザー
CREATE USER individual_user_01 PASSWORD 'Password123!' IN GROUP adhoc_user_group;
CREATE USER individual_user_02 PASSWORD 'Password123!' IN GROUP adhoc_user_group;
create schema system_schema;
create schema individual_schema;
CREATE TABLE system_schema.stg_tbl_01 (col1 VARCHAR(20)); # stg_tbl_01
CREATE TABLE system_schema.dwh_tbl_01 (col1 VARCHAR(20)); # dwh_tbl_01
CREATE TABLE individual_schema.wrk_tbl_01 (col1 VARCHAR(20)); # wrk_tbl_01
CREATE TABLE individual_schema.wrk_tbl_02 (col1 VARCHAR(20)); # wrk_tbl_02
# ロールを作成
CREATE ROLE system_role;
CREATE ROLE individual_role;
# ロールからスキーマへの権限を付与
GRANT USAGE ON SCHEMA system_schema TO ROLE system_role;
GRANT USAGE ON SCHEMA individual_schema TO ROLE individual_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA system_schema TO ROLE system_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA individual_schema TO ROLE individual_role;
# ユーザーにロール単位でアクセス権限を付与
GRANT ROLE system_role TO batch_user_01, batch_user_02;
GRANT ROLE individual_role TO individual_user_01, individual_user_02;
dev=# SELECT * FROM svv_user_grants;
user_id | user_name | role_id | role_name | admin_option
181 | dm_admin_user | 372701 | dm_admin_role | f
189 | ds:central_db_nsp_b77f35248f9446f9bc61b7d8a3026df5 | 871650 | ds:central_db | f
190 | batch_user_01 | 1157704 | system_role | f
191 | batch_user_02 | 1157704 | system_role | f
190 | batch_user_01 | 1157705 | individual_role | f
192 | individual_user_01 | 1157705 | individual_role | f
193 | individual_user_02 | 1157705 | individual_role | f
(7 rows)
WLM設定
検証結果
- サービスの機能検証をするわけではないので、網羅的なテストは実施していない。
[ec2-user@ip-172-31-0-101 ~]$ psql "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.com user=individual_user_01 dbname=dev port=5439"
Password for user individual_user_01:
psql (13.7, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
dev=> select * from system_schema.stg_tbl_01;
ERROR: permission denied for schema system_schema
dev=> select * from individual_schema.wrk_tbl_01;
col1
(0 rows)
dev=>
参考
ロール・グループ・ユーザーの属性
CREATE ROLE role_name
[ EXTERNALID external_id ]
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]
where option can be:
CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
システムビュー
GRANT ROLE role1 TO reguser;
GRANT ROLE role2 TO reguser;
GRANT ROLE role1 TO superuser;
GRANT ROLE role2 TO superuser;
SELECT user_name,role_name,admin_option FROM svv_user_grants;
user_name | role_name | admin_option
superuser | role1 | False
reguser | role1 | False
superuser | role2 | False
reguser | role2 | False