Social Icons

16 de dez. de 2010

Segurança no Oracle 10G - Top 5 Basic Security


Pessoal,

    Neste artigo irei apresentar as minhas 5 principais recomendações de segurança básica para o Oracle Database 10G, aplicando o princípio de privilégio mínimo. Este princípio determina que os usuários devem possuir somente os privilégios necessários para executar as suas atividades no Banco de Dados, minimizando deste modo, os riscos de acesso à dados indevidos e perdas de dados acidentais.
   
    Seguem abaixo os 5 principais itens de segurança básica (indicados pela Oracle) para aumentar o nível de segurança em Bancos de Dados Oracle 10G:

------------------------------------------------------------------------------
    Para iniciar o passo-a-passo de qualquer um dos itens abaixo, é necessário conectar-se previamente no Banco de Dados desejado, através do SQL Plus, com um usuário com privilégios administrativos (usuário contendo a role DBA ou o privilégio de sistema SYSDBA);
------------------------------------------------------------------------------

    1- Protegendo o dicionário de dados:
   
        Configurar o valor do parâmetro de sistema O7_DICTIONARY_ACCESSIBILITY para FALSE.  Isso impede que usuários com privilégios ANY TABLE acessem tabelas do dicionário de dados, além de forçar o usuário SYS a se conectar como SYSOPER ou SYSDBA.
       
        Passo-a-passo:
       
            a) Executar o comando abaixo para verificar o valor do parâmetro O7_DICTIONARY_ACCESSIBILITY:
                SHOW PARAMETER O7_DICTIONARY_ACCESSIBILITY;
                 
            b) Se o valor de O7_DICTIONARY_ACCESSIBILITY for diferente de FALSE, execute os comandos abaixo para efetuar a alteração e reiniciar o Banco de Dados, para que a alteração tenha efeito:
                ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY = FALSE SCOPE=SPFILE;
                SHUTDOWN IMMEDIATE;
                STARTUP;

  

 
    2- Revogando privilégios públicos em packages que oferecem riscos de segurança:
   
        Este item requer um pouco mais de trabalho e cuidados que o item anterior. Nele iremos revogar os privilégios de execução pública nas packages UTL_SMTP, UTL_TCP, UTL_HTTP, UTL_FILE e DBMS_OBFUSCATION_TOOLKIT. Isso impede que usuários maliciosos executem essas packages de forma indevida, reduzindo deste modo, os riscos de segurança.
   
        Passo-a-passo:
       
        a) Executar a query abaixo para gerar um script contendo comandos necessários para revogar privilégios públicos nas packages mencionadas neste item:
                SELECT     'REVOKE EXECUTE ON ' || OBJECT_NAME || ' FROM PUBLIC;'
                FROM        dba_objects o
                WHERE     OBJECT_NAME IN ('UTL_SMTP','UTL_TCP','UTL_HTTP','UTL_FILE','DBMS_OBFUSCATION_TOOLKIT')

                AND           O.OWNER = 'PUBLIC'
                ORDER BY    1
                         
    
        Obs.: Salve o resultado em um arquivo.          
          
        b) Executar o bloco PL/SQL abaixo para gerar um script com atribuições de privilégios necessários para que todos os usuários (schemas) que possuem objetos que utilizam as packages deste item, possam executá-las após revogarmos os privilégios públicos:
       
            SET OUTPUT ON           
            BEGIN
                 DBMS_OUTPUT.ENABLE(NULL);
             
                 FOR cur_rec IN (SELECT      o.owner,
                                          SUM(INSTR(UPPER(S.TEXT), 'UTL_SMTP')) AS UTL_SMTP,
                                          SUM(INSTR(UPPER(S.TEXT), 'UTL_TCP')) AS UTL_TCP,
                                          SUM(INSTR(UPPER(S.TEXT), 'UTL_HTTP')) AS UTL_HTTP,
                                          SUM(INSTR(UPPER(S.TEXT), 'UTL_FILE')) AS UTL_FILE,
                                          SUM(INSTR(UPPER(s.text), 'DBMS_OBFUSCATION_TOOLKIT')) AS DBMS_OBFUSCATION_TOOLKIT
                              FROM        dba_objects o
                              INNER JOIN  dba_source s
                                  ON      s.owner = o.owner
                                  AND     s.type = o.object_type
                                  AND     S.NAME = O.OBJECT_NAME
                              WHERE       OBJECT_NAME NOT IN ('UTL_SMTP','UTL_TCP','UTL_HTTP','UTL_FILE','DBMS_OBFUSCATION_TOOLKIT')
                              AND         S.OWNER != 'SYS'
                              AND         (UPPER(S.TEXT) LIKE UPPER('%UTL_SMTP%')
                              OR          UPPER(S.TEXT) LIKE UPPER('%UTL_TCP%')
                              OR          UPPER(S.TEXT) LIKE UPPER('%UTL_HTTP%')
                              OR          UPPER(S.TEXT) LIKE UPPER('%UTL_FILE%')
                              OR          UPPER(S.TEXT) LIKE UPPER('%DBMS_OBFUSCATION_TOOLKIT%'))
                              GROUP BY    o.owner
                              ORDER BY    1)
              LOOP
                  IF CUR_REC.UTL_SMTP > 0 THEN
                      DBMS_OUTPUT.PUT_LINE('GRANT EXECUTE ON UTL_SMTP TO ' || CUR_REC.owner || ';');             
                  END IF;
                 
                  IF CUR_REC.UTL_TCP > 0 THEN
                      DBMS_OUTPUT.PUT_LINE('GRANT EXECUTE ON UTL_TCP TO ' || CUR_REC.owner || ';');
                  END IF;
                 
                  IF CUR_REC.UTL_HTTP > 0 THEN
                      DBMS_OUTPUT.PUT_LINE('GRANT EXECUTE ON UTL_HTTP TO ' || CUR_REC.owner || ';');
                  END IF;
                 
                  IF CUR_REC.UTL_FILE > 0 THEN
                      DBMS_OUTPUT.PUT_LINE('GRANT EXECUTE ON UTL_FILE TO ' || CUR_REC.owner || ';');
                  END IF;
                 
                  IF CUR_REC.DBMS_OBFUSCATION_TOOLKIT > 0 THEN
                      DBMS_OUTPUT.PUT_LINE('GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO ' || CUR_REC.owner || ';');
                  END IF;     
              END LOOP;    
            END;
            /

           
            Obs. 1: Salvar o resultado em um arquivo.
           
            Obs. 2: O bloco PL/SQL acima não gera os privilégios necessários para objetos compilados em código nativo ou objetos wrapped. O procedimento necessário para estes casos não é abordado neste artigo, portanto tenha muito cuidado ao executar este item, pois se o Banco de Dados tiver objetos wrapped ou compilados em código nativo, estes objetos ficarão inválidos e poderão impedir o funcionamento de sistemas que dependem deles. Para mais informações consulte os links:                    http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/wrap.htm e http://www.oracle-base.com/articles/11g/PlsqlNewFeaturesAndEnhancements_11gR1.php#native_compilation.
                                                  
        c) Executar os comandos do script gerado no passo "a" e em seguida executar o script gerado no passo "b".
  
 
 

    3- Restringindo diretórios do Sistema Operacional:
   
        Verificar o valor do parâmetro de sistema UTL_FILE_DIR. Se este parâmetro tiver um valor apontando para um ou mais diretório(s) do sistema de arquivos, configure no Sistema Operacional, privilégios de gravação reduzidos (valor de cota máxima de gravação em disco) neste(s) diretório(s) para o usuário do SO que executa os processos do Oracle (normalmente usuário "oracle"). Se isso não for possível, pode-se configurar no parâmetro UTL_FILE_DIR um diretório em um volume lógico separado do volume lógico em que estão os arquivos e software Oracle. Isso reduz o risco de um script malicioso ser executado no BD para gravar arquivos nesta pasta até  estourar o limite de tamanho do volume lógico e "parar" o Banco de Dados quando o volume lógico "estourar".

        Verificando o valor do parâmetro UTL_FILE_DIR:
                SHOW PARAMETER UTL_FILE_DIR;
       
        O parâmetro UTL_FILE_DIR pode ser configurado para apontar para mais de um diretório ou para o diretório raiz do sistema de arquivos. Por questões de segurança evite fazer isso. Configure no máximo um diretório.
       
        Se for desejado "limpar" (apontar para nenhum diretório) o parâmetro UTL_FILE_DIR, para aumentar o nível de segurança, execute os comandos abaixo para alterá-lo e reiniciar o Banco de Dados:
            ALTER SYSTEM SET UTL_FILE_DIR = '' SCOPE=SPFILE;
            SHUTDOWN IMMEDIATE;
            STARTUP;


 
    4- Restringindo privilégios administrativos aos usuários do Banco de Dados:

        Se um ou mais usuário(s) possuir(em) a role DBA e/ou o privilégio de sistema SYSDBA, sem necessidade ou indevidamente, execute os procedimentos abaixo para revogar os privilégios administrativos:
       
        Passo-a-passo:
   
        a) Verificando usuários com a role DBA:
            SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'DBA';
               
            Para revogar a role DBA para um determinado usuário execute o comando abaixo substituindo XXX pelo nome dele:
                REVOKE DBA FROM XXX;    

  
        b) Verificando usuários com o privilégio de sistema SYSDBA:
            SELECT * FROM V$PWFILE_USERS; 

   
             Para revogar o privilégio de sistema SYSDBA para um determinado usuário execute o comando abaixo substituindo XXX pelo nome dele:
                REVOKE SYSDBA FROM XXX      
           
        Mais informações sobre a role DBA e o privilégio de sistema SYSDBA, consulte http://momendba.blogspot.com/2007/07/closer-look-at-sysdba-and-dba.html.
    


    5- Desativando autenticação remota do Sistema Operacional:
   
        Na configuração padrão do Oracle 10G, o Banco de Dados permite que usuários autenticados no sistema operacional façam conexão local sem fornecer usuário e senha do Banco de Dados.
       
        Para permitir esse modo de conexão somente para usuários locais do Sistema Operacional, deve-se configurar o valor do parâmetro REMOTE_OS_AUTHENT para FALSE. Essa configuração evita que usuários remotos (usuários de qualquer computador em uma rede) se conectem no Banco de Dados sem fornecer usuário e senha.
       
        Passo-a-passo:
       
        a) Verificando o valor do parâmetro REMOTE_OS_AUTHENT:
            SHOW PARAMETER REMOTE_OS_AUTHENT;
       
        b) Se o valor do parâmetro REMOTE_OS_AUTHENT for diferente de FALSE, execute o comando abaixo para configurá-lo para FALSE e para reiniciar o Banco de Dados, aplicando as alterações efetuadas:
            ALTER SYSTEM SET REMOTE_OS_AUTHENT=FALSE SCOPE=SPFILE;
            SHUTDOWN IMMEDIATE;
            STARTUP;
   

Referências:
    - Material do curso oficial da Oracle: Oracle Database 10G Administration Workshop I.

   

2 comments:

  1. Ola,

    Parabéns Fábio pelo blog e conteúdo apresentado.

    Abraços
    Rodrigo Almeida

    ResponderExcluir
  2. Obrigado Rodrigo. Também parabenizo o seu blog (que já está incluso há um bom tempo na MINHA LISTA DE BLOGS).

    ResponderExcluir

 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)