اوراکل 23c – قابلیت Dictionary Protection

ساخت وبلاگ

زمانی که یکی از مجوزهای system “ANY” privilege نظیر select any table، drop any table و … را به کاربری می دهیم، آن کاربر امکان دسترسی به objectهای شمای sys و جداول Data Dictionary را ندارد:

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 usef identified by a;
User created.
SQL> grant create session,select any table to usef;
Grant succeeded.
SQL> conn usef/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 table برای یک کاربر برداریم، می توانیم مجوز SELECT ANY DICTIONARY را به آن کاربر اعطا کنیم:

SQL> grant SELECT ANY DICTIONARY to usef;
Grant succeeded.
SQL> conn usef/a
Connected.
SQL> select * from sys.tb;
D
-
X
SQL> select file# from v$datafile where rownum=1; FILE#
---------- 1

البته از اوراکل 12c، دسترسی به بعضی از جداول Data Dictionary حتی با داشتن مجوز  SELECT ANY DICTIONARY  هم امکان پذیر نیست. لیست بعضی از این جداول را در قسمت زیر می بینید:

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

نقش SELECT_CATALOG_ROLE هم می تواند دسترسی به ویوهای دیتادیکشنری را به کاربر اعطا کند که قبلا در مورد تفاوت این نقش با مجوز SELECT ANY DICTIONARY مطلبی را نوشته ایم.

شکل پیشرفته تر از مجوز SELECT ANY DICTIONARY پارامتر o7_dictionary_accessibility است که با تنظیم این پارامتر به مقدار true، هر کاربری که هر کدام از مجوزهای system “ANY” privilege را دریافت می کرد، می توانست به جداول Data Dictionary هم در همان سطح دسترسی داشته باشد(البته مقدار پیش فرض این پارامتر به مقدار false تنظیم شده بود):

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 usef identified by a;
User created.
SQL> grant create session,select any table to usef;
Grant succeeded.
SQL> select file# from v$datafile where rownum=1; FILE#
---------- 1
SQL> select * from sys.tb;
D
-
X

این پارامتر از نسخه 19c به صورت کامل حذف شده است.

در نسخه 23c، اوراکل دامنه این محدودیتها را افزایش داده و Dictionary Protection را برای کاربران زیر هم فعال کرده است:

SQL> select username,ORACLE_MAINTAINED from dba_users where dictionary_protected='YES';
USERNAME ORACLE_MAINTAINED
------------------ --------------------
SYSRAC Y
XS$NULL Y
LBACSYS Y
CTXSYS Y
DVF Y
DVSYS Y
AUDSYS Y
GSMADMIN_INTERNAL Y
GGSHAREDCAP Y
XDB Y
SYSBACKUP Y
SYSKM Y
SYSDG Y
13 rows selected.

بنابرین اگر کاربری یکی از مجوزهای system “ANY” privilege را داشته باشد، نمی تواند صرفا با داشتن این مجوزها، به جداول هر کدام از اسکیماهای فوق دسترسی داشته باشد.

برای مثال، جدولی را برای اسکیمای SYSDG ایجاد می کنیم با توجه به آنکه قابلیت Data Dictionary Protection برای این Schema فعال شده است، جداول این Schema هم همانند جداول دیتا دیکشنری برای کاربر c##usef که مجوز select any table دارد، قابل رویت نخواهد بود:

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Jan 9 13:25:56 2024
SQL> create user c##usef identified by a;
User created.
SQL> grant create session,select any table to c##usef;
Grant succeeded.
SQL> grant unlimited tablespace to SYSDG;
Grant succeeded.
SQL> create table SYSDG.tb as select * from dual;
Table created.
SQL> conn c##usef/a
Connected.
SQL> select * from SYSDG.tb;
ORA-00942: table or view does not exist

اما همین سناریو در نسخه 21c به خطا نخواهد خورد:

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Jan 9 13:25:56 2024
SQL> create user c##usef identified by a;
User created.
SQL> grant create session,select any table to c##usef;
Grant succeeded.
SQL> grant unlimited tablespace to SYSDG;
Grant succeeded.
SQL> create table SYSDG.tb as select * from dual;
Table created.
SQL> conn c##usef/a
Connected.
SQL> select * from SYSDG.tb;
D
-
X

قابلیت Data dictionary protection برای هر کاربری نمی تواند فعال شود و کاربر باید از نوع Oracle maintained  باشد:

SQL> alter user C##usef enable dictionary protection;
ORA-40374: Dictionary protection feature is supported for only Oracle maintained users.

البته امکان فعال کردن این قابلیت برای همه Oracle maintained userها هم وجود ندارد و اسکیما باید از نوع NO AUTHENTICATION هم باشد:

SQL> alter user SYSTEM enable dictionary protection;
ORA-40369: Only NO AUTHENTICATION user can be marked as dictionary protected.

کار

تالار های تخصصی...
ما را در سایت تالار های تخصصی دنبال می کنید

برچسب : نویسنده : خنجی niksaleh بازدید : 21 تاريخ : دوشنبه 2 بهمن 1402 ساعت: 13:15

خبرنامه