Oracle AI Database 26ai — 사전 보호
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.