زمانی که یکی از مجوزهای 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.
کاربر DGPDB_INT این شرایط را دارد:
SQL> select USERNAME,dictionary_protected,AUTHENTICATION_TYPE,ORACLE_MAINTAINED from dba_users where username=’DGPDB_INT’; USERNAME DIC AUTHENTI ORACLE_MAINTAINED ---------- --- -------- ------------------ DGPDB_INT NO NONE Y
برای این کاربر می توانیم قابلیت Data Dictionary Protection را فعال کنیم قبل از این کار، دسترسی کاربر c##usef را بر روی جداول این Schema تست می کنیم:
SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Jan 9 14:23:29 2024 SQL> create table DGPDB_INT.tb as select * from dual; Table created.
SQL> conn c##usef/a Connected. SQL> select * from DGPDB_INT.tb; D - X
کاربر c##Usef به جداول این اسکیما دسترسی دارد. قابلیت Data Dictionary Protection را برای این اسکیما فعال می کنیم:
SQL> alter user SYSTEM enable dictionary protection; ORA-40369: Only NO AUTHENTICATION user can be marked as dictionary protected. SQL> alter user DGPDB_INT enable dictionary protection; User altered.
SQL> conn c##usef/a Connected. SQL> select * from DGPDB_INT.tb; ORA-00942: table or view does not exist
با کمک پارامتر مخفی oracle_script_ هم می توان اسکیمای oracle maintain ساخت و این قابلیت را برای آن فعال کرد:
SQL> show con_name CON_NAME -------------------- CDB$ROOT SQL> alter session set "_oracle_script"=true; Session altered. SQL> create user usef; User created.
SQL> select USERNAME,dictionary_protected,AUTHENTICATION_TYPE,ORACLE_MAINTAINED from dba_users where username='USEF'; USERNAME DIC AUTHENTI ORACLE_MAINTAINED ---------- --- -------- -------------------- USEF NO NONE Y
SQL> alter user USEF enable dictionary protection; User altered.