Vertica의 2가지 권한 부여 방식

Vertica의 권한 부여 방식

Oracle DBMS가 익숙한 사용자가 봤을때, Vertica는 Schema, Role, User의 개념이 다르다. 특히 Schema <> User인 부분에 큰 차이가 있을듯. (오히려 오라클이 Schema=User의 특징이 독특하다 할 수 있다.)

그래서 Vertica의 권한 관리는 달라야 한다. 테이블이나 기타 오브젝트들은 Schema(<>User)에 포함되나, User에는 포함이 안되기 때문이다.

크게 보면 두 가지로 나뉘는 것 같다.

  1. Schema에 속하는 Object에 직접 권한을 주기
  2. 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,… 등이 가능하기 위해선 두 방법 중 하나.
    1. 특정 테이블 별로 부여
      • 스키마에 grant USAGE
      • 테이블에 grant SELECT, UPDATE,…
    2. 스키마에 부여 후, 테이블에서 스키마의 권한을 받도록 함
  • 스키마에서 이후 생성되는 테이블들에 대한 권한 상속을 받을지 초기값(default)를 정할 수 있음
  • 개별 권한 부여는 v_catalog.grants 에서 확인 가능하며
  • 스키마 권한 상속은 v_internal.vs_tables, v_internal.vs_schemata에서 확인 가능