Oracle AI Database 26ai — 사전 보호

발행: (2025년 12월 26일 오전 05:46 GMT+9)
7 min read
원문: Dev.to

I’m happy to translate the article for you, but I need the text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line exactly as you provided and preserve all formatting, markdown, and technical terms.

시스템 전체 “ANY” 권한 및 데이터 사전

사용자에게 시스템 전체 ANY 권한(예: SELECT ANY TABLE, DROP ANY TABLE)이 부여되더라도, 해당 사용자는 여전히 SYS 스키마에 속한 객체나 내부 데이터 사전 테이블을 볼 수 없습니다.

SQL*Plus: Release 10.1.0.4.2 - Production on Tue Jan 9 10:38:31 2024
SQL> SHOW USER
USER is "SYS"

SQL> CREATE TABLE sys.tb AS SELECT * FROM dual;
Table created.

SQL> CREATE USER vahid IDENTIFIED BY a;
User created.

SQL> GRANT CREATE SESSION, SELECT ANY TABLE TO vahid;
Grant succeeded.

SQL> CONN vahid/a
Connected.

SQL> SELECT * FROM sys.tb;
ORA-00942: table or view does not exist

SQL> SELECT * FROM v$datafile;
ORA-00942: table or view does not exist

SELECT ANY DICTIONARY 권한 부여

제한이 SELECT ANY TABLE에 대해 해제되면, SELECT ANY DICTIONARY 시스템 권한을 부여할 수 있습니다:

SQL> GRANT SELECT ANY DICTIONARY TO vahid;
Grant succeeded.

SQL> CONN vahid/a
Connected.

SQL> SELECT * FROM sys.tb;

D
-
X

SQL> SELECT file# FROM v$datafile WHERE ROWNUM = 1;

FILE#
----------
     1

Oracle 12c 및 이후 – 일부 사전 객체는 숨겨진 상태로 유지

Oracle 12c부터 SELECT ANY DICTIONARY를 사용해도 다음과 같은 내부 테이블에 대한 접근 권한이 부여되지 않습니다:

USER$, ENC$, DEFAULT_PWD$, LINK$, USER_HISTORY$, CDB_LOCAL_ADMINAUTH$, XS$VERIFIERS

Note: 역할 SELECT_CATALOG_ROLE도 많은 데이터 사전 뷰에 대한 접근을 허용합니다.

역사적인 O7_DICTIONARY_ACCESSIBILITY 매개변수

보다 강력한(현재는 제거된) 메커니즘은 초기화 매개변수 O7_DICTIONARY_ACCESSIBILITY였습니다.
TRUE 로 설정하면 시스템 전체 ANY 권한을 가진 모든 사용자가 동일한 권한 수준에서 데이터 사전을 읽을 수 있었습니다.

SQL*Plus: Release 10.1.0.4.2 - Production on Tue Jan 9 11:26:57 2024
SQL> SHOW PARAMETER o7_dictionary_accessibility

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------------------
O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE

SQL> ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY = TRUE SCOPE = SPFILE;
System altered.

SQL> STARTUP FORCE;
SQL> CREATE USER vahid IDENTIFIED BY a;
User created.

SQL> GRANT CREATE SESSION, SELECT ANY TABLE TO vahid;
Grant succeeded.

SQL> CONN vahid/a
Connected.

SQL> SELECT file# FROM v$datafile WHERE ROWNUM = 1;

FILE#
----------
     1

SQL> SELECT * FROM sys.tb;

D
-
X

제거됨: 이 매개변수는 Oracle 19c에서 완전히 제거되었습니다.

Dictionary Protection in Oracle AI Database 26ai

Oracle AI Database 26ai는 제한을 Oracle‑maintained 사용자 집합으로 확대합니다. 이러한 사용자는 DICTIONARY_PROTECTED = 'YES' 로 표시됩니다.

Consequently, even a user with SELECT ANY TABLE cannot see objects that belong to any of the schemas above.
그 결과, SELECT ANY TABLE 권한을 가진 사용자라도 위 스키마에 속한 객체를 볼 수 없습니다.

Example – SYSDG schema (Oracle AI Database 26ai)

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Jan 9 13:25:56 2024
SQL> CREATE USER c##vahid IDENTIFIED BY a;
User created.

SQL> GRANT CREATE SESSION, SELECT ANY TABLE TO c##vahid;
Grant succeeded.

SQL> GRANT UNLIMITED TABLESPACE TO SYSDG;
Grant succeeded.

SQL> CREATE TABLE SYSDG.tb AS SELECT * FROM dual;
Table created.

SQL> CONN c##vahid/a
Connected.

SQL> SELECT * FROM SYSDG.tb;
ORA-00942: table or view does not exist

Same scenario on Oracle 21c (no protection)

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Jan 9 13:25:56 2024
SQL> CREATE USER c##vahid IDENTIFIED BY a;
User created.

SQL> GRANT CREATE SESSION, SELECT ANY TABLE TO c##vahid;
Grant succeeded.

SQL> GRANT UNLIMITED TABLESPACE TO SYSDG;
Grant succeeded.

SQL> CREATE TABLE SYSDG.tb AS SELECT * FROM dual;
Table created.

SQL> CONN c##vahid/a
Connected.

SQL> SELECT * FROM SYSDG.tb;

D
-
X

사전 보호 활성화

Dictionary Protection 임의의 사용자에 대해서는 활성화할 수 없습니다; 대상은 Oracle‑maintained 계정이어야 하며 NO AUTHENTICATION을 사용해야 합니다.

SQL> ALTER USER C##vahid ENABLE DICTIONARY PROTECTION;
ORA-40374: Dictionary protection feature is supported for only Oracle maintained users.
SQL> ALTER USER SYSTEM ENABLE DICTIONARY PROTECTION;
ORA-40369: Only NO AUTHENTICATION user can be marked as dictionary protected.

두 조건을 모두 만족하는 사용자는 DGPDB_INT입니다:

SQL> SELECT username,
           dictionary_protected,
           authentication_type,
           oracle_maintained
      FROM dba_users
     WHERE username = 'DGPDB_INT';

USERNAME   DICTIONARY_PROTECTED AUTHENTICATION_TYPE ORACLE_MAINTAINED
---------- -------------------- ------------------- --------------------
DGPDB_INT  NO                   NONE                Y

이제 보호를 켤 수 있습니다:

SQL> ALTER USER DGPDB_INT ENABLE DICTIONARY PROTECTION;
User altered.

Summary

Feature / Parameter“ANY” 권한에 대한 효과Availability
SELECT ANY DICTIONARY대부분의 사전 뷰/테이블에 대한 읽기 권한을 부여 (12c+에서는 일부 제외)All versions
O7_DICTIONARY_ACCESSIBILITY시스템 ANY 권한이 사전을 읽을 수 있도록 허용19c에서 제거
Dictionary Protection (26ai)SELECT ANY TABLE 권한이 있더라도 Oracle이 관리하는 보호된 스키마의 객체 접근 차단Oracle AI Database 26ai (이후 버전)
SELECT_CATALOG_ROLE많은 사전 뷰에 대한 접근을 부여 (역할 기반)All versions

이러한 메커니즘을 이해하면 DBA가 내부 메타데이터를 볼 수 있는 사용자를 제어하고, 중요한 시스템 객체가 우발적으로 노출되는 것을 방지할 수 있습니다.

타임스탬프
23:29 2024

DGPDB_INT 스키마에 테이블 생성

SQL> create table DGPDB_INT.tb as select * from dual;
Table created.
SQL> conn c##vahid/a
Connected.

SQL> select * from DGPDB_INT.tb;

D
-
X

참고: 사용자 c##vahid는 이 스키마의 테이블에 접근할 수 있습니다.

사전 보호 활성화

SQL> alter user DGPDB_INT enable dictionary protection;
User altered.
SQL> conn c##vahid/a
Connected.

SQL> select * from DGPDB_INT.tb;
ORA-00942: table or view does not exist

Oracle‑Maintained 스키마를 수동으로 생성

숨겨진 파라미터 _oracle_script를 사용하면 Oracle‑Maintained 스키마를 생성하고 해당 스키마에 대해 Dictionary Protection을 활성화할 수 있습니다.

SQL> show con_name
CON_NAME
--------------------
CDB$ROOT

SQL> alter session set "_oracle_script"=true;
Session altered.

SQL> create user vahid;
User created.

SQL> select USERNAME,
           dictionary_protected,
           AUTHENTICATION_TYPE,
           ORACLE_MAINTAINED
    from dba_users
    where username = 'VAHID';

USERNAME   DIC AUTHENTI ORACLE_MAINTAINED
---------- --- -------- --------------------
VAHID       NO  NONE     Y

SQL> alter user VAHID enable dictionary protection;
User altered.
Back to Blog

관련 글

더 보기 »

휴대폰을 계속 잡지 않고 MFA 테스트

문제: 인증 기능을 작업할 때 MFA 테스트는 거의 항상 흐름을 깨뜨립니다. 전화기의 잠금을 해제합니다. 인증 앱을 엽니다. 테스트 계정을 스크롤합니다. Rac...