DBMS_SQL_FIREWALL - Firewall dentro da Base de Dados (Parte III)

 No post anterior, vimos a possibilidade de restringir/autorizar a execução de SQL a um utilizador através de listas criadas numa captura de actividade.
Durante a captura não são apenas registados os comandos de SQL, mas também outros dados, o endereço de IP a partir do qual o SQL foi executado, o programa a partir do qual foi executado o SQL e ainda o utilizador de sistema operativo que lançou esse programa.
Este 3 dados adicionais são parte dos contextos que podem ser usados pela SQL Firewall.
Além de restringir a execução de comandos de SQL, é possível limitar a execução através destes contextos, limitar o acesso a partir de um IP ou de um utiliazdor de SO ou até de uma aplicação especifica.

Quando analisamos a lista criada durante a captura vemos que já existe essa informação armazenada.
Podemos ver isso na view dba_sql_firewall_capture_logs.

        
           
SQL> select username, command_type, client_program, os_user, ip_address from dba_sql_firewall_capture_logs;

USERNAME    COMMAND_TYPE     CLIENT_PROGRAM                            OS_USER    IP_ADDRESS    
___________ ________________ _________________________________________ __________ _____________ 
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          ALTER SESSION    java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
HR          SELECT           java@localhost.localdomain (TNS V1-V3)    oracle     127.0.0.1     
     
         

 Vemos que o sql capturado foi todo executado da máquina local (127.0.0.1), pelo user de sistema oracle e que foi uma aplicação java que executou o SQL.
Ao capturar esta informação e com ela gerar uma lista através do procedimento generate_allow_list, estamos não só a gerar listas de SQL mas também dos contextos capturados.
Podemos validar isso através das seguintes views:

        
           
SQL> select * from dba_sql_firewall_allowed_ip_addr;

USERNAME    IP_ADDRESS    
___________ _____________ 
HR          127.0.0.1     


SQL> select * from dba_sql_firewall_allowed_os_prog;

USERNAME    OS_PROGRAM                                
___________ _________________________________________ 
HR          java@localhost.localdomain (TNS V1-V3)    


SQL> select * from dba_sql_firewall_allowed_os_user;

USERNAME    OS_USER    
___________ __________ 
HR          oracle     
     
         

 Quando fizemos o enable das listas através deste comando:

dbms_sql_firewall.enable_allow_list(username => 'HR',enforce => dbms_sql_firewall.enforce_all, block => true);

Decidimos que queremos validar todas as listas através do segundo parâmetro 'enforce', com o valor dbms_sql_firewall.enforce_all.
Temos dois valores adicionais, dbms_sql_firewall.enforce_sql, que apenas valida o SQL e dbms_sql_firewall.enforce_context que apenas valida os contextos capturados.
Com a SQL Firewall podemos nem sequer validar comandos de SQL e apenas a criação da sessão através dos contextos. Caso não seja iniciada com as condições do contexto (IP,OSUSER,PROGRAM) a sessão não é sequer iniciada.

No próximo exemplo ao tentar criar uma ligação a partir de uma máquina windows para a VM com a Oracle 23c free, temos um outro IP, um outro programa e um outro utilizador de SO, o que dá origem a um erro de ligação desencadeado pela SQL Firewall não permitindo sequer a criação da sessão. Basta um deles não coincidir e a sessão será bloqueada.

        
           
SQLcl: Release 23.3 Production on sexta out. 13 11:28:19 2023

Copyright (c) 1982, 2023, Oracle.  All rights reserved.

Username? (''?) hr/oracle@localhost:1521/freepdb1
  USER          = hr
  URL           = jdbc:oracle:thin:@localhost:1521/freepdb1
  Error Message = ORA-47605: ViolaþÒo da Firewall de SQL
Username? (RETRYING) ('hr/*********@localhost:1521/freepdb1'?)     
         

 Podemos ver a informação de ligações atraves da seguinte query:

        
           
SQL> select * from dba_sql_firewall_session_logs;

            SESSION_ID USERNAME    LOGIN_TIME                          IP_ADDRESS    CLIENT_PROGRAM                            OS_USER          
______________________ ___________ ___________________________________ _____________ _________________________________________ ________________ 
   7289077817488179201 HR          12-OCT-23 14.24.40.828779000 GMT    127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           
   7289380881824415745 HR          13-OCT-23 10.00.43.170444000 GMT    10.0.2.2      SQLcl                                     gn-rrodrigues    
   7288719420115386369 HR          11-OCT-23 15.13.54.067050000 GMT    127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           
     
         

E verificar que IP, programa e OS_user não correspondem ao que está nas listas de permissões.
Analisando a view de violações vemos que existe mais uma, a última linha, do tipo context violation devido à tentativa de login falhada.

        
           
SQL> select username, command_type, ip_address, client_program, os_user, cause, firewall_action from dba_sql_firewall_violations;

USERNAME    COMMAND_TYPE    IP_ADDRESS    CLIENT_PROGRAM                            OS_USER          CAUSE                FIREWALL_ACTION    
___________ _______________ _____________ _________________________________________ ________________ ____________________ __________________ 
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          EXECUTE         127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          EXECUTE         127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          EXECUTE         127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          EXECUTE         127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          EXECUTE         127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          SELECT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          INSERT          127.0.0.1     java@localhost.localdomain (TNS V1-V3)    oracle           SQL violation        Blocked            
HR          CONNECT         10.0.2.2      SQLcl                                     gn-rrodrigues    Context violation    Blocked            
     
         

Em qualquer momento podemos alterar esta situação mudando a informação que existe nas listas de permissões. Podemos remover ou acrescentar qualquer destes contextos caso faça sentido.
Imaginando que faz sentido o acesso aos dados através da sessão que eu tentei criar a partir do windows, poderei acrescentar essa informação aos contextos existentes.
Isso será feito através do procedimento add_allowed_context que me permite acrescentar dados ou caso queira o contrario o procedimento delete_allowed_context.
 

        
           
SQL> exec dbms_sql_firewall.add_allowed_context(username => 'HR', context_type => dbms_sql_firewall.ip_address, value => '10.0.2.2');

PL/SQL procedure successfully completed.

SQL> exec dbms_sql_firewall.add_allowed_context(username => 'HR', context_type => dbms_sql_firewall.os_username, value => 'gn-rrodrigues');

PL/SQL procedure successfully completed.

SQL> exec dbms_sql_firewall.add_allowed_context(username => 'HR', context_type => dbms_sql_firewall.os_program, value => 'SQLcl');

PL/SQL procedure successfully completed.     
         

 Depois de actualizar os dados nas listas temos então acesso à BD a partir da máquina windows.

        
           
SQLcl: Release 23.3 Production on sexta out. 13 11:49:26 2023

Copyright (c) 1982, 2023, Oracle.  All rights reserved.

Username? (''?) hr/oracle@localhost:1521/freepdb1
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09

SQL>     
         

 Ao analisarmos a informação nas listas percebemos que elas foram actualizadas com os dados acrescentados.

        
           
SQL> select * from dba_sql_firewall_allowed_ip_addr;

USERNAME    IP_ADDRESS    
___________ _____________ 
HR          10.0.2.2      
HR          127.0.0.1     

SQL> select * from dba_sql_firewall_allowed_os_prog;

USERNAME    OS_PROGRAM                                
___________ _________________________________________ 
HR          SQLcl                                     
HR          java@localhost.localdomain (TNS V1-V3)    

SQL> select * from dba_sql_firewall_allowed_os_user;

USERNAME    OS_USER          
___________ ________________ 
HR          gn-rrodrigues    
HR          oracle           
     
         

Podemos para cada uma das listas existente acrescentar ou remover dados dos contextos, conseguindo assim limitar o acesso à BD com o SQL Firewall, indo além da limitação de execução de SQL.
Cada utilizador poderá ter validações diferentes, actuando ao nível dos contextos, do SQL ou dos dois em simultâneo.

No próximo texto falarei da possibilidade de capturar também actividade de SQL executada através de PLSQL e de como isso poderá limitar a execução de SQL Injection. 

Comentários

Mensagens populares deste blogue

DBMS_SQL_FIREWALL - Firewall dentro da Base de Dados (Parte I)

DBMS_SQL_FIREWALL - Firewall dentro da Base de Dados (Parte IV)