قابلیت SQL Firewall در اوراکل 23ai

SQL Firewall یکی دیگر از قابلیتهای جدید اوراکل در نسخه 23c است بر اساس این قابلیت می توانیم مجموعه ای از دستورات را به عنوان دستورات مجاز برای دیتابیس تعریف کنیم در این صورت کاربر نمی تواند دستور دیگری خارج از این مجموعه را اجرا کند حتی اگر این کاربر مجوز اجرای آن دستورات را داشته باشد.

قصد داریم اقدامات کاربر Usef را تحت نظر بگیریم و تمامی دستورات اجرا شده توسط این کاربر را capture کنیم سپس با تنظیم SQL Firewall، به این کاربر اجازه ندهیم خارج از دستوراتی که capture شده اند، دستور جدیدی را اجرا کند.

برای اجرای این سناریو، ابتدا محیط تست را آماده می کنیم.

SQL> create user usef identified by a;
User created.
SQL> grant dba to usef;
Grant succeeded.
SQL> conn usef/a@OEL8:1521/TEHRANPDB
Connected.
SQL> create table usef.tbl1 as select * from dual;
Table created.
SQL> create table usef.tbl2 as select * from dual;
Table created.
SQL> create or replace procedure usef.prc1 as
  2  text varchar2(100);
  3  begin
  4  select * into text from tbl1;
  5  end;
  6  /
Procedure created.

برای مدیریت SQL FIREWALL می توانیم از کاربر sys استفاده کنیم و یا کاربر جدیدی را ایجاد کنیم و با دادن مجوز sql_firewall_admin به این کاربر، اقدامات لازم را از طریق آن انجام دهیم.

در قدم اول، کاربر usr_firewall را برای مدیریت SQL FIREWALL ایجاد می کنیم و دسترسی sql_firewall_admin را به آن اهدا می کنیم.

SQL> create user usr_firewall identified by a;
User created.
SQL>  grant create session,sql_firewall_admin to usr_firewall;
Grant succeeded.

برای فعال کردن SQL FIREWALL، از طریق یوزر user_firewall به دیتابیس وصل شده و دستور زیر را اجرا می کنیم:

SQL> conn usr_firewall/a@OEL8:1521/TEHRANPDB
Connected.
SQL> exec dbms_sql_firewall.enable;
PL/SQL procedure successfully completed.

برای مشاهده وضعیت فعلی SQL FIREWALL می توانیم از ویوی dba_sql_firewall_status استفاده کنیم:

SQL> select status,to_char(status_updated_on,'YYYY/MM/DD HH24:MI:SS','NLS_CALENDAR=persian') status_updated_on   from dba_sql_firewall_status;
STATUS   STATUS_UPDATED_ON
-------- -------------------
ENABLED  1402/06/11 18:13:59

این مرحله از تنظیمات SQL FIREWALL به تنظیمات “قابلیت Privilege Analysis” که در نسخه 12c ارائه شده بود، شباهت زیادی دارد در این مرحله می بایست Captureای را ایجاد کرده و به کاربر usef اجازه دهیم تا دستوراتش را اجرا کند بعد از بازه زمانی مشخص، زمانی که احساس کردیم دستورات به اندازه کافی Capture شده اند، capture را متوقف کنیم.

بنابرین ابتدا باید از طریق پروسیجر create_capture از پکیج dbms_sql_firewall کپچر مورد نظر را ایجاد کنیم.

SQL> conn usr_firewall/a@OEL8:1521/TEHRANPDB
Connected.
SQL>  exec dbms_sql_firewall.create_capture(USERNAME=>'USEF',TOP_LEVEL_ONLY=>true,START_CAPTURE=>true);
PL/SQL procedure successfully completed.

با تنظیم پارامتر TOP_LEVEL_ONLY به مقدار true، از ثبت دستوراتی که در پس زمینه اجرای PL/SQL اجرا می شوند، جلوگیری می شود.

قبل از بستن capture، از طریق کاربر usef اقداماتی را انجام می دهیم:

SQL> conn usef/a@OEL8:1521/TEHRANPDB
Connected.
SQL> delete tbl1;
1 row deleted.
SQL> rollback;
Rollback complete.
SQL> select * from tbl1;
D
-
X
SQL> exec prc1;
PL/SQL procedure successfully completed.

بعد از اجرا دستورات فوق، capture را متوقف می کنیم:

SQL> conn usr_firewall/a@OEL8:1521/TEHRANPDB
Connected.
SQL> exec dbms_sql_firewall.stop_capture('USEF');
PL/SQL procedure successfully completed.

ویوی dba_sql_firewall_capture_logs لیست دستورات capture شده را نمایش می دهد:

SQL> select  command_type,sql_text from dba_sql_firewall_capture_logs where username='USEF';
COMMAND_ SQL_TEXT
-------- -------------------------
EXECUTE  BEGIN PRC1; END;
DELETE   DELETE TBL1
SELECT   SELECT * FROM TBL1

در قدم بعدی، از طریق این دستورات، allow listای را ایجاد می کنیم تا کاربر usef صرفا مجاز به اجرای دستورات فوق باشد:

SQL> conn usr_firewall/a@OEL8:1521/TEHRANPDB
Connected.
SQL> exec dbms_sql_firewall.generate_allow_list('USEF');
PL/SQL procedure successfully completed.

برای مشاهده کوئری های قابل اجرا توسط کاربر usef، می توانیم از ویوی dba_sql_firewall_allowed_sql استفاده کنیم:

SQL> select sql_text from dba_sql_firewall_allowed_sql where username='USEF';
SQL_TEXT
-------------------------
BEGIN PRC1; END;
DELETE TBL1
SELECT * FROM TBL1

در نهایت allow_list ایجاد شده را فعال می کنیم:

SQL> exec dbms_sql_firewall.enable_allow_list('USEF',DBMS_SQL_FIREWALL.ENFORCE_SQL,TRUE);
PL/SQL procedure successfully completed.

با کاربر usef به دیتابیس وصل شده تا این مسئله را تست کنیم:

SQL> select * from tbl1;
D
-
X

SQL> desc tbl1
ORA-47605: SQL Firewall violation
SQL> select * from tbl2;
ORA-47605: SQL Firewall violation

SQL> drop table tbl2;
ORA-47605: SQL Firewall violation

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

SQL> create table tbl3 as select * from dual;
ORA-47605: SQL Firewall violation

همانطور که می بینید، این کاربر صرفا سه دستوری که capture شده است را می تواند اجرا کند. این مسئله به ابزاری که استفاده می کنید هم مربوط نیست و با هر ابزاری کاربر usef به این خطا بر خواهد خورد.

لیست violationها را می توانیم از طریق ویوی dba_sql_firewall_violations ببینیم:

SQL> conn usr_firewall/a@OEL8:1521/TEHRANPDB
Connected.
SQL> select command_type,sql_text,cause,firewall_action,to_char(occurred_at,'YYYY/MM/DD HH24:MI:SS','NLS_CALENDAR=persian')  occurred_at from dba_sql_firewall_violations;
COMMAND_TYPE    SQL_TEXT                                 CAUSE                FIREWAL OCCURRED_AT
--------------- ---------------------------------------- -------------------- ------- -------------------
CREATE TABLE    CREATE TABLE TBL3 AS SELECT * FROM DUAL  SQL violation        Blocked 1402/06/11 18:47:21
SELECT          SELECT * FROM TBL2                       SQL violation        Blocked 1402/06/11 18:46:08
DESCRIBE        DESCRIBE TBL1                            SQL violation        Blocked 1402/06/11 18:48:34
DROP TABLE      DROP TABLE TBL2                          SQL violation        Blocked 1402/06/11 18:46:51

برای پاک کردن capture_logها می توانیم دستور زیر را اجرا کنیم:

exec dbms_sql_firewall.purge_log('USEF', null, dbms_sql_firewall.capture_log);

دستور زیر violation_logهای قدیمی تر از 10 روز را پاک می کند:

exec dbms_sql_firewall.purge_log('usef', systimestamp-10, dbms_sql_firewall.violation_log);

همچنین با دستور زیر همه لاگهای مربوط به SQL Firewall پاک می شود(به استثنای ده روز آخر):

exec dbms_sql_firewall.purge_log('usef', systimestamp-10, dbms_sql_firewall.all_logs);

برای غیرفعال کردن allow-list از دستور زیر استفاده می شود:

SQL> exec dbms_sql_firewall.disable_allow_list ('USEF');
PL/SQL procedure successfully completed.

همچنین برای غیرفعال کردن SQL Firewall از دستور زیر استفاده می کنیم:

SQL> exec dbms_sql_firewall.disable;
PL/SQL procedure successfully completed.

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *