Vertica의 권한 부여 방식
Oracle DBMS가 익숙한 사용자가 봤을때, Vertica는 Schema, Role, User의 개념이 다르다. 특히 Schema <> User인 부분에 큰 차이가 있을듯. (오히려 오라클이 Schema=User의 특징이 독특하다 할 수 있다.)
그래서 Vertica의 권한 관리는 달라야 한다. 테이블이나 기타 오브젝트들은 Schema(<>User)에 포함되나, User에는 포함이 안되기 때문이다.
크게 보면 두 가지로 나뉘는 것 같다.
- Schema에 속하는 Object에 직접 권한을 주기
- Schema에 권한을 주고 그에 속해있는 Object는 Schema의 권한을 받기
물론 여기에 Role 개념을 더하면 권한 관리가 더 잘 될 수 있을듯…
GRANT 로 개별 테이블에 권한 부여
¶셋업
-
스키마, 유저, 테이블 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14-- dbadmin으로 수행
create schema schema1;
create user user1
identified by '********'
;
create table schema1.table1
(col1 int
);
create table schema1.table2
(col1 int
);
¶개별 테이블에 대한 권한을 개별 사용자에게 부여
-
스키마 사용권한(usage)을 schema1에게 부여
1
2
3
4
5-- dbadmin으로 수행
grant usage
on schema schema1
to user1
; -
테이블 조회권한(select)을 user1에게 부여
1
2
3
4
5-- dbadmin으로 수행
grant select
on all tables in schema schema1
to user1
; -
사용자 조회권한은 v_catalog.grants에서 확인할 수 있음
1
2
3
4
5
6
7
8
9
10-- dbadmin으로 수행
select object_type
,privileges_description
,object_schema
,object_name
,grantee
from v_catalog.grants
where grantee = 'user1'
order by 1,2,3,4
;object_type privileges_description object_schema object_name grantee RESOURCEPOOL USAGE [NULL] general user1 SCHEMA USAGE [NULL] schema1 user1 TABLE SELECT schema1 table1 user1 TABLE SELECT schema1 table2 user1 -
user1
은 실제 테이블들을 조회할 수 있다.1
2
3
4
5
6
7
8
9
10-- user1로 수행
select *
from schema1.table1
;
--> 정상 조회
select *
from schema1.table2
;
--> 정상 조회
¶grant 이후 스키마에 추가되는 테이블의 경우 조회 권한이 없음
-
문제는 이후 새로 생성되는 테이블의 경우 권한 변화가 없게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16-- dbadmin으로 수행
create table schema1.table3
(
col1 int
)
;
select object_type
,privileges_description
,object_schema
,object_name
,grantee
from grants
where grantee = 'user1'
order by 1,2,3,4
;object_type privileges_description object_schema object_name grantee RESOURCEPOOL USAGE [NULL] general user1 SCHEMA USAGE [NULL] schema1 user1 TABLE SELECT schema1 table1 user1 TABLE SELECT schema1 table2 user1 1
2
3
4
5
6
7-- user1로 수행
select *
from schema1.table3
;
--> Permission denied for relation table3
--> 조회 불가
권한 상속(inherit privileges) 으로 권한 부여
-
schema에 권한을 주고, table에는 schema의 권한을 상속 받을 수 있음
-
table별로 schema의 권한을 상속 받을지를 지정할 수 있음
-
schema에서는 (설정 이후) 스키마에 추가로 생성되는 테이블에 대해 권한을 상속받을 지의 default 값을 지정할 수 있음
-
권한 상속 관련 설정 값은 v_catalog.tables정보에서 확인할 수 없고, 내부 테이블인 v_internal.vs_tables에서 확인 가능
-
확인
1
2
3
4
5
6
7
8
9-- dbadmin으로 수행
-- 현재 단계까지의 상태 확인
select s.name table_schema
,s.defaultinheritprivileges schema_inherit_privileges
,t.name table_name
,t.inheritprivileges table_inherit_privileges
from v_internal.vs_tables t
inner join v_internal.vs_schemata s on s.oid = t.schema
where s.name = 'schema1'table_schema schema_inherit_privileges table_name table_inherit_privileges schema1 false table1 false schema1 false table2 false schema1 false table3 false - 스키마의 권한 상속 기본 값은
false
이며, - 모든 테이블의 권한 상속 값은
false
로 되어 있음
- 스키마의 권한 상속 기본 값은
¶스키마에 SELECT 권한 부여 후 테이블에서 상속 받기
-
처음과 마찬가지 방식으로 테이블 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21-- dbadmin으로 수행
grant select, usage
on schema schema1
to user1
;
-- 테이블의 권한을 스키마에서도 상속받기로 변경
alter table schema1.table3
include schema privileges
;
-- 현재 grant 상태 확인
select object_type
,privileges_description
,object_schema
,object_name
,grantee
from grants
where grantee = 'user1'
order by 1,2,3,4
;object_type privileges_description object_schema object_name grantee RESOURCEPOOL USAGE [NULL] general user1 SCHEMA SELECT, USAGE [NULL] schema1 user1 TABLE SELECT schema1 table1 user1 TABLE SELECT schema1 table2 user1 -
스키마에 SELECT 까지 부여되었으나, TABLE SELECT 권한이 부여된 것은 아님
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43-- user1 로 수행
select *
from schema1.table3
;
--> 정상 조회됨
-- 현재 상태 테이블 권한 조회
select s.name table_schema
,s.defaultinheritprivileges schema_inherit_privileges
,t.name table_name
,t.inheritprivileges table_inherit_privileges
from v_internal.vs_tables t
inner join v_internal.vs_schemata s on s.oid = t.schema
where s.name = 'schema1'
```
|table_schema|schema_inherit_privileges|table_name|table_inherit_privileges
|------------|-------------------------|----------|------------------------
|schema1 |false |table1 |false
|schema1 |false |table2 |false
|schema1 |false |table3 |true
- table3이 schema1에 부여된 SELECT 권한을 상속 받았기에 user1이 grant SELECT on table3이 없음에도 table3을 조회할 수 있음
## 스키마의 default 값에 따른 테이블 값 변경 확인
- 추가 생성되는 테이블에도 include schema privileges 적용되게 변경
```sql
-- dbadmin으로 수행
create table schema1.table4
(
col1 int
)
;
select s.name table_schema
,s.defaultinheritprivileges schema_inherit_privileges
,t.name table_name
,t.inheritprivileges table_inherit_privileges
from v_internal.vs_tables t
inner join v_internal.vs_schemata s on s.oid = t.schema
where s.name = 'schema1'table_schema schema_inherit_privileges table_name table_inherit_privileges schema1 false table1 false schema1 false table2 false schema1 false table3 true schema1 false table4 false - 새로 생성되는 테이블은 inherit privileges가 false인 상태
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21-- dbadmin 으로 수행
alter schema schema1
default include privileges
;
-- 설정 변경 이후 신규 테이블 생성
create table schema1.table5
(
col1 int
)
;
-- 설정 값 확인
select s.name table_schema
,s.defaultinheritprivileges schema_inherit_privileges
,t.name table_name
,t.inheritprivileges table_inherit_privileges
from v_internal.vs_tables t
inner join v_internal.vs_schemata s on s.oid = t.schema
where s.name = 'schema1'
;table_schema schema_inherit_privileges table_name table_inherit_privileges schema1 true table1 false schema1 true table2 false schema1 true table3 true schema1 true table4 false schema1 true table5 true - table5의 경우 권한을 상속 받음
1
2
3
4
5
6
7
8
9
10
11
12-- user1로 수행
select *
from schema1.table4
;
--> Permission denied for relation table4
--> 조회 안됨
select *
from schema1.table5
;
--> 정상 조회
결론
- 특정 테이블에 SELECT, UPDATE,… 등이 가능하기 위해선 두 방법 중 하나.
- 특정 테이블 별로 부여
- 스키마에 grant USAGE
- 테이블에 grant SELECT, UPDATE,…
- 스키마에 부여 후, 테이블에서 스키마의 권한을 받도록 함
- 특정 테이블 별로 부여
- 스키마에서 이후 생성되는 테이블들에 대한 권한 상속을 받을지 초기값(default)를 정할 수 있음
- 개별 권한 부여는
v_catalog.grants
에서 확인 가능하며 - 스키마 권한 상속은
v_internal.vs_tables
,v_internal.vs_schemata
에서 확인 가능