Ab der Version 23ai ist die SQL Firewall Teil des Oracle Kernels. Die Firewall kann über das PL/SQL-Package DBMS_SQL_FIREWALL administriert werden. Dieser Artikel soll die Einrichtung und die Funktionsweise aufzeigen.
Einrichtung
Aktivieren der SQL Firewall in der PDB (als sys oder priviligierter User):
SQL> exec dbms_sql_firewall.enable;
PL/SQL procedure successfully completed.
SQL> set lines 300
SQL> select * from dba_sql_firewall_status;
STATUS STATUS_UPDATED_ON EXCLUDE_JOBS
-------- --------------------------------------------------------------------------- ------------
ENABLED 10-APR-26 11.30.39.795661 AM +00:00 Y
Starten des Captures Prozesses zum erfassen des Workloads:
SQL> BEGIN
DBMS_SQL_FIREWALL.CREATE_CAPTURE (
username => 'APP',
top_level_only => TRUE,
start_capture => FALSE );
END;
/
2 3 4 5 6 7
PL/SQL procedure successfully completed.
SQL> select username, top_level_only, status from dba_sql_firewall_captures where username='APP';
USERNAME TOP_LEVEL_ONLY STATUS
------------ -------------- --------
APP Y DISABLED
Das Capture muss jetzt noch gestartet werden, da start_capture auf False gesetzt wurde:
SQL> exec dbms_sql_firewall.start_capture ('APP');
PL/SQL procedure successfully completed.
SQL> select username, top_level_only, status from dba_sql_firewall_captures where username='APP';
SQL>
USERNAME TOP_LEVEL_ONLY STATUS
------------ -------------- --------
APP N ENABLED
Jetzt kann der Workload ausgeführt werden, der später die Grundlage für die spätere Allow List sein soll.
Dafür führen wir einige SQL als Benutzer APP in der PDB aus.
Stoppen des Capture Prozesses:
SQL> exec dbms_sql_firewall.stop_capture('APP');
PL/SQL procedure successfully completed.
In folgenden Views sind die erfassten SQLs und die Session Kontexte einzusehen:
--session logs (context)
SQL> select username, ip_address, client_program, os_user
from dba_sql_firewall_session_logs
where username = 'APP' order by login_time; 2 3
USERNAME IP_ADDRESS CLIENT_PROGRAM OS_USER
------------ --------------- -------------- --------------------
APP 10.0.0.215 sqlplus@dbfire oracle
wall (TNS V1-V
3)
--capture logs (SQLs)
SQL> SQL> select command_type, sql_text, accessed_objects from dba_sql_firewall_capture_logs;
COMMAND_TYPE SQL_TEXT ACCESSED_OBJECTS
--------------- -------------------------------------------------- --------------------
SELECT SELECT SUM (PREIS) FROM BESTELLUNGEN WHERE KUNDENN "APP"."BESTELLUNGEN"
R=:"SYS_B_0"
EXECUTE BEGIN BESTELLSUM (?); END; "APP"."BESTELLSUM"
SELECT SELECT COUNT (*) FROM BESTELLUNGEN WHERE KUNDENNR= "APP"."BESTELLUNGEN"
:"SYS_B_0"
SELECT SELECT KUNDENNR,ARTIKEL,PREIS,MENGE FROM BESTELLUN "APP"."BESTELLUNGEN"
GEN WHERE KUNDENNR=:"SYS_B_0"
Hier sind die SQL-Muster zu sehen, die erfasst wurden.
Aus diesen Ergebnissen kann dann die Allowlist generiert werden:
SQL> exec dbms_sql_firewall.generate_allow_list('APP');
PL/SQL procedure successfully completed.
-- view allow list
SQL> select username, status, top_level_only from dba_sql_firewall_allow_lists where username='APP';
USERNAME STATUS TOP_LEVEL_ONLY
------------ -------- --------------
APP DISABLED N
-- view allowed SQLs
SQL> select username, current_user, top_level, sql_text, accessed_objects from dba_sql_firewall_allowed_sql where username='APP' order by sql_text, current_user, top_level;
USERNAME CURRENT_USER TOP_LEVEL SQL_TEXT ACCESSED_OBJECTS
------------ ------------ --------- -------------------------------------------------- --------------------
APP APP Y BEGIN BESTELLSUM (?); END; "APP"."BESTELLSUM"
APP APP Y SELECT COUNT (*) FROM BESTELLUNGEN WHERE KUNDENNR= "APP"."BESTELLUNGEN"
:"SYS_B_0"
APP APP Y SELECT KUNDENNR,ARTIKEL,PREIS,MENGE FROM BESTELLUN "APP"."BESTELLUNGEN"
GEN WHERE KUNDENNR=:"SYS_B_0"
APP APP N SELECT SUM (PREIS) FROM BESTELLUNGEN WHERE KUNDENN "APP"."BESTELLUNGEN"
R=:"SYS_B_0"
-- view allowed contexts
SQL> select username, ip_address from sys.dba_sql_firewall_allowed_ip_addr where username='APP';
USERNAME IP_ADDRESS
------------ ---------------
APP 10.0.0.215
SQL> select username, os_user from sys.dba_sql_firewall_allowed_os_user where username='APP';
USERNAME OS_USER
------------ --------------------
APP oracle
SQL> select username, os_program from sys.dba_sql_firewall_allowed_os_prog where username='APP';
USERNAME OS_PROGRAM
------------ --------------------------------------------------------------------------------------------------------------------------------
APP sqlplus@dbfirewall (TNS V1-V3)
Aktivieren der Allowlist:
SQL> BEGIN
DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST (
username => 'APP',
enforce => DBMS_SQL_FIREWALL.ENFORCE_SQL,
block => TRUE
);
END;
/ 2 3 4 5 6 7 8
PL/SQL procedure successfully completed.
Hierbei können verschiedenen Parameter verwendet werden:
enforce =>
- ENFORCE_ALL –> default, SQLs und Kontext werden angewendet
- ENFORCW_SQL –> nur SQLs werden angewendet
- ENFORCE_CONTEXT –> nur Session Kontext wird angewendet
block =>
- false –> default, Violations werden nicht geblockt, nur protokolliert (View DBA_SQL_FIREWALL_VIOLATIONS).
- true –> Violations werden geblockt und protokolliert (View DBA_SQL_FIREWALL_VIOLATIONS).
Ändern des Block-Modus für die Allow-List:
exec dbms_sql_firewall.update_allow_list_enforcement('APP', block=>FALSE);
Anpassungen der Allowlist können jederzeit gemacht werden.
--hinzufügen eines erlaubten OS Benutzers
BEGIN
DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT (
username => 'APP',
context_type => DBMS_SQL_FIREWALL.OS_USERNAME,
value => 'opc'
);
END;
/
--entfernen eines erlaubten OS Benutzers
BEGIN
DBMS_SQL_FIREWALL.DELETE_ALLOWED_CONTEXT (
username => 'APP',
context_type => DBMS_SQL_FIREWALL.OS_USERNAME,
value => 'opc'
);
END;
/
--entfernen einer erlaubten IP Adresse:
BEGIN
DBMS_SQL_FIREWALL.DELETE_ALLOWED_CONTEXT (
username => 'APP',
context_type => DBMS_SQL_FIREWALL.IP_Address,
value => '192.168.1.70'
);
END;
/
--entfernen eines erlaubten Programms
BEGIN
DBMS_SQL_FIREWALL.DELETE_ALLOWED_CONTEXT (
username => 'APP',
context_type => DBMS_SQL_FIREWALL.OS_PROGRAM,
value => 'sqlplus.exe'
);
END;
/
Testen der Funktion
Um die Funktion zu testen, werden verschiedene SQL Statements ausgeführt.
SQL mit identischer where Bedingung:
SQL> select count(*) from bestellungen where kundennr='123456';
COUNT(*)
----------
3
SQL mit geänderter where-Bedingung:
SQL> select count(*) from bestellungen;
select count(*) from bestellungen
*
ERROR at line 1:
ORA-47605: SQL Firewall violation
Help: https://docs.oracle.com/error-help/db/ora-47605/
SQL mit geänderter Spaltenwahl (ursprünglich: „select kundennr, artikel, preis, menge from bestellungen where kundennr=’123456′;“:
SQL> select preis, menge from bestellungen where kundennr='123456';
select preis, menge from bestellungen where kundennr='123456'
*
ERROR at line 1:
ORA-47605: SQL Firewall violation
Help: https://docs.oracle.com/error-help/db/ora-47605/
SQL> select preis, menge ,kundennr, artikel from bestellungen where kundennr='123456';
select preis, menge ,kundennr, artikel from bestellungen where kundennr='123456'
*
ERROR at line 1:
ORA-47605: SQL Firewall violation
Help: https://docs.oracle.com/error-help/db/ora-47605/
Mit der SQL Firewall kann somit die Sicherheit von sensiblen Daten erhöht werden. Die SQL Firewall schützt hauptsächlich vor missbrauch von priviligierten Benutzern und SQL-Injections, da unbekannte SQL Muster oder Quellen der Verbindung blockiert werden, bevor die SQLs in der Datenbank ausgeführt werden.
Nutzung in der OCI Datasafe
In der OCI kann im Datasafe die SQL-Firewall grafisch bedient und administriert werden. Dabei können Ziele in der OCI und auch onPrem von Datasafe administriert werden.
Nachfolgend einige Bilder für die adminsitration der SQL-Firewall mittels Datasafe:
Anzeige der Kontextinformationen und erlaubten SQLs:

Ebenfalls zu sehen sind hier die Administrationsmöglichkeiten wie z.B. Löschen von SQLs aus der Allowed_list oder „Add from violations“ womit man auf Violations reagieren kann, die ungewollt entstehen. Die Allow_Lists für SQL und Kontext sind somit flexibel modifizierbar.
Dashboard für SQL-Firewall mit übersicht über Anzahl der violations, SQL-Firewall rules und SQL Collections:

Details der SQL-Violations:

Im Datasafe in der OCI können aus diesen Ansichten auch Reports geneiert werden. Datasafe ermöglicht zudem auch die Nutzung von Notifications im Falle von Firewall violoations.