메뉴 건너뛰기

Korea Oracle User Group

23ai

23ai NF(New Feature) 스키마 레벨의 권한 부여 기능

 

오라클 23ai 버전에서 쓸만한 새로운 기능이 생겨 테스트를 진행해 보았다.

스키마 레벨의 권한 부여 기능이다.

 

운영 업무 중 권한 부여에 대한 요청이 올 수 있다.

Grant를 통한 권한 부여는 보안 관점에서 사고 방지를 위해 최소로 부여될 필요가 있다.

 

오라클의 이전 버전에서는 object 단위나 system 레벨로 권한을 부여할 수 있었다.

그러나 현실적으로 필드에서는 ROLE을 생성해 부여하곤 한다.

하지만 이 부분도 현실과 괴리가 있을 수 있다.

비즈니스의 단위가 대개의 경우 schema(스키마) 단위로 이루어지며 

운영자, 담당자, 뷰 계정이 이에 걸맞는 권한을 부여 받을 필요가 있을 때가 있다.

이럴 경우 스키마 단위의 권한 부여가 있으면 어떨까라고 현장의 DBA들은 생각했을 수 있다.

본인도 그런 경우가 허다했었다.

그러던 기능이 23ai에 생긴 것이다.

 

아래 테스트를 진행해 보겠습니다.

 

스키마 단위의 권한을 부여하기 위해서는 다음의 권한을 가지고 있어야 한다.

GRANT ANY SCHEMA PRIVILEGE / GRANT ANY PRIVILEGE 시스템 권한 필요

 

테스트 계정으로 HR_TEST / KOREAOUG 계정을 생성하도록 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
SQL> create user koreaoug identified by koreaoug;
 
사용자가 생성되었습니다.
 
SQL> grant connect, resource to hr;
 
권한이 부여되었습니다.
 
SQL> grant connect, resource to koreaoug;
 
권한이 부여되었습니다.

 

테스트용 테이블을 생성합니다.

 

1
2
3
SQL> create table hr.HR_TEST1 (col1 varchar2(10));
 
테이블이 생성되었습니다.

 

이제 KOREAOUG 계정으로 접속해 HR 계정의 HR_TEST1 테이블을 조회해 봅니다.

권한이 없으므로 조회가 되지 않을 것입니다.

 

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
[oracle@kwan23c ~]$ sqlplus koreaoug@kwan23c:1521/FREEPDB1
 
SQL*Plus: Release 23.0.0.0.0 - Production on 화 7월 9 18:38:54 2024
Version 23.4.0.24.05
 
Copyright (c) 19822024, Oracle.  All rights reserved.
 
비밀번호 입력: 
 
다음에 접속됨:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.4.0.24.05
 
SQL> show user
USER은 "KOREAOUG"입니다
SQL> show con_name
 
CON_NAME
------------------------------
FREEPDB1
SQL> select * from hr.hr_test1;
select * from hr.hr_test1
                 *
1행에 오류:
ORA-00942: 테이블 또는 뷰  "HR"."HR_TEST1"이(가) 존재하지 않습니다. 도움말:
https://docs.oracle.com/error-help/db/ora-00942/

 

조회가 되지 않습니다.

SYSTEM 계정으로 접속해 스키마 레벨로 권한을 부여합니다.

 

1
2
3
4
5
SQL> show user
USER은 "SYSTEM"입니다
SQL> grant select any table on schema hr to koreaoug;
 
권한이 부여되었습니다.

 

이제 KOREAOUG 계정으로 다시 조회를 해 봅니다.

 

1
2
3
SQL> select * from hr.hr_test1;
 
선택된 레코드가 없습니다.

 

데이터는 없지만 조회에 에러가 없습니다.

딕셔너리 뷰를 조회해서 내용을 확인해 봅니다.

 

1
2
3
4
5
6
7
8
SQL> col grantee for a10
SQL> col privilege for a30
SQL> col schema for a10
SQL> select grantee, privilege, schema from dba_schema_privs;
 
GRANTEE    PRIVILEGE                      SCHEMA
---------- ------------------------------ ----------
KOREAOUG   SELECT ANY TABLE               HR

 

dba_schema_privs 란 뷰가 추가되었습니다.

스키마 레벨의 권한과 관련해 추가된 뷰는 아래와 같습니다.

 

1
2
3
4
5
DBA_SCHEMA_PRIVS
ROLE_SCHEMA_PRIVS
USER_SCHEMA_PRIVS
SESSION_SCHEMA_PRIVS
V$ENABLEDSCHEMAPRIVS

 

이제 HR 계정에 신규테이블을 생성하고 새로 생성한 테이블이 KOREAOUG 계정에 자동으로 권한이 부여되었는지 확인해 보겠습니다.

 

1
2
3
SQL> create table hr.HR_TEST2 (col1 varchar2(10));
 
테이블이 생성되었습니다.

 

KOREAOUG 계정에서 신규 생성한 테이블이 조회되는지 확인해 봅니다.

 

1
2
3
SQL> select * from hr.hr_test2;
 
선택된 레코드가 없습니다.

 

권한을 추가로 부여하지 않아도 신규로 생성된 테이블이 조회가 되는 것을 확인할 수 있습니다.

이제 권한을 회수하고 정상적으로 회수되었는지 체크해 보도록 하겠습니다.

 

1
2
3
SQL> revoke select any table on schema hr from koreaoug;
 
권한이 취소되었습니다.

 

KOREAOUG 계정에서 회수되었는지 확인해 봅니다.

 

1
2
3
4
5
6
SQL> select * from hr.hr_test1;
select * from hr.hr_test1
                 *
1행에 오류:
ORA-00942: 테이블 또는 뷰  "HR"."HR_TEST1"이(가) 존재하지 않습니다. 도움말:
https://docs.oracle.com/error-help/db/ora-00942/

 

딕셔너리 뷰를 다시 확인해 보겠습니다.

 

1
2
3
4
5
6
SQL> col grantee for a10
SQL> col privilege for a30
SQL> col schema for a10
SQL> select grantee, privilege, schema from dba_schema_privs;
 
선택된 레코드가 없습니다.

 

정상적으로 회수된 것을 확인할 수 있습니다.

 

결론

DBA가 권한 관리를 할 때 스키마 단위로 권한을 부여하는 상황에서,

ROLE로 관리하고, 신규 object 추가 시 권한 부여를 해야 하는 번거로움이 사라지게 되었다.

비즈니스 단위로 한 문장으로 편하게 권한 부여와 회수를 할 수 있게 되었다.

진작에 있어야할 권한 부여 레벨이였던 것 같다.

 

※ 스키마 권한 부여에서 제외되는 권한

https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/configuring-privilege-and-role-authorization.html#GUID-58D04BBE-A40D-4699-A2D7-1AB40F532A6D

위로