Social Icons

Mostrando postagens com marcador Segurança. Mostrar todas as postagens
Mostrando postagens com marcador Segurança. Mostrar todas as postagens

23 de ago. de 2011

Artigo SQL Magazine 90: Segurança no Oracle 10G e 11G


Olá pessoal,

     Já está nas bancas a SQL Magazine nº 90, com um artigo meu sobre 5 recomendações básicas de segurança para o Oracle Database 10G e 11G.




     Segue abaixo um pequeno trecho deste artigo, que também poderá ser consultado no link http://www.devmedia.com.br/articles/viewcomp.asp?comp=22008

  

     Segurança de dados é um assunto cada vez mais frequente nas organizações, principalmente após o “boom” da Internet, onde muitas empresas passaram a vender seus produtos e precisam proteger os dados de seus clientes e os seus próprios dados. No entanto, diante desta necessidade cada vez maior de proteger os dados, precisamos nos preocupar, primeiramente, em proteger o local onde os dados ficam armazenados, o banco de dados.
    
     Para aumentar a segurança de bancos de dados Oracle, apresentaremos neste artigo algumas dicas de segurança recomendadas pela própria Oracle, que classificaremos como sendo as cinco principais configurações de segurança básica que devem ser aplicadas em bancos de dados Oracle 10G e 11G.
    
     As configurações aplicarão o princípio de privilégio mínimo, que é uma frase atualmente muito utilizada pelas empresas de tecnologia quando se referem à segurança de dados, redes ou sistemas. Quando se trata de bancos de dados, este princípio determina basicamente que:
     Os usuários devem possuir somente os privilégios necessários para executar as suas tarefas no Banco de Dados e nada mais, ou seja, os usuários não devem possuir mais privilégios do que eles realmente precisam para executar suas tarefas. Isso minimiza os riscos de acesso a dados indevidos e perdas de dados acidentais ou maliciosas (quando um usuário apaga dados ou objetos que podem prejudicar um ou mais sistemas, conscientemente, de propósito).

Implementando os cinco itens de segurança
Começaremos agora a entender e configurar cinco itens de segurança relacionados aos SGBDs Oracle 10 G e 11 G. Cada item será apresentado em um tópico e poderá ser implementado através de um roteiro passo-a-passo. No entanto, antes de iniciar a configuração dos mesmos, é necessário efetivar o seguinte pré-requisito:

Conectar-se previamente no banco de dados desejado, através do SQL Plus, com um usuário que tenha privilégios administrativos (usuário que contém a role DBA ou o privilégio de sistema SYSDBA).



Para ler todo o artigo, é necessário comprar a revista ou acessar o site da DEVMEDIA (conteúdo online completo somente para assinantes).

4 de fev. de 2011

Criptografando tabelas com o TDE


Pessoal,
   
     Neste artigo irei apresentar o recurso de segurança do Oracle Database (existente a partir da versão 10G release 2) chamado Transparent Data Encryption (TDE). Este recurso permite proteger dados confidenciais de colunas e índices de tabelas, criptografando os dados e armazenando-os de modo seguro (criptografados) nos arquivos de dados do Sistema Operacional. Aos consultar estes dados (criptografados), eles são decriptografados antes de serem apresentados para o usuário final. A criptografia e decriptografia dos dados ocorre de forma transparente, sem necessidade de linhas de código adicionais na aplicação ou no banco de dados.

     Com TDE, ao criptografar os dados de uma coluna de uma tabela, é gerada uma chave de criptografia para a tabela, que é armazenada no Dicionário de Dados (D.D.) para posterior decriptografia. Por sua vez, a chave de criptografia da tabela também é criptografada por outra chave, que é chamada chave mestra e que é armazenada fora do Banco de Dados, em um local seguro chamado Oracle Wallet.

     Quando um usuário do Banco de Dados altera ou inclui dados (dados de entrada) em uma coluna criptografada, o Oracle Database recupera a chave mestra do Wallet, decriptografa a chave da tabela (recuperada no D.D.) e usa esta chave para criptografar os dados de entrada, antes de armazená-los no Banco de Dados. Nos dados, antes da criptografia, são adicionadas palavras extras chamadas SALT, que alteram os dados originais e que ajudam a dificultar "ataques hackers" de decriptografia. SALT é adicionado por padrão no TDE e pode ser utilizado somente ao criptografar tabelas. Índices não podem conter SALT.
     Com TDE os dados podem ser criptografados utilizando um dos quatro seguintes algoritmos de criptografia:  3DES168AES128AES192 e AES256. AES192 é o algoritmo padrão.

      É importante ressaltar que ao utilizar TDE nas tabelas, há um custo de performance para criptografar e decriptografar as colunas. Em testes do artigo Transparent Data Encryption (TDE) in Oracle 10g Database Release 2 (http://www.oracle-base.com/articles/10g/TransparentDataEncryption_10gR2.php), o tempo de execução das instruções SQL para atualizações e consultas em uma tabela (que possui o total de 2 colunas e somente 1 coluna criptografada) aumentou aproximadamente 40%.

    Para utilizar TDE, no Oracle Database 10G Enterprise Edition (versão do Oracle mais utilizada), é necessário obter licenciamento da option Oracle Advanced Security (ver http://download.oracle.com/docs/cd/B19306_01/license.102/b14199/options.htm#CIHJHABF)

    Para demonstrar a utilização de TDE, seguiremos os passos abaixo:
--------------------------------------------------------------------------
    Para iniciar o passo-a-passo 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), que não seja o SYS, pois se o passo 2 for executado pelo SYS ele irá falhar (o Oracle Database não permite utilizar TDE em objetos do schema SYS).
--------------------------------------------------------------------------

    PASSO 1: Criando e referenciando o Wallet
     
         a) Acrescente no arquivo sqlnet.ora da pasta network/admin do Oracle Home o seguinte bloco:

             ENCRYPTION_WALLET_LOCATION =
                (SOURCE=
                     (METHOD=file)
                     (METHOD_DATA=
                              (DIRECTORY=\ORACLE_BASE\admin\ORACLE_SID\wallet)))


         O parâmetro DIRECTORY do bloco de código acima indica o caminho do arquivo Wallet que será criado no item "b)" deste passo e está redigido de acordo com os padrões do sistema de arquivos do Windows.  Neste item, substitua os valores:
                  - ORACLE_BASE: pelo diretório correspondente ao Oracle Base em sua instalação de BD.
                  - ORACLE_SID: pelo nome da instância de BD.

       Obs.: Se o diretório wallet não existir, crie-o dentro da pasta \ORACLE_BASE\admin\ORACLE_SID. A pasta "\ORACLE_BASE\admin\ORACLE_SID\wallet" é o caminho padrão de criação de Wallets.

         b) Crie o Wallet e defina a chave mestra na instância de Banco de Dados (BD) em execução:
                 No prompt do SQL digite:
                        ALTER SYSTEM SET ENCRYPTION KEY AUTHENTICATED BY "Teste123";      
    
                 Obs.: Substitua Teste123 pela senha desejada. Este item define uma senha mestra e automaticamente cria o Wallet na pasta padrão referenciada no item "a)".


        PASSO 2: Criando e inserindo dados em uma tabela com uma coluna criptografada

        Execute no SQL Plus os comandos abaixo:
             CREATE TABLE   table_tde_test (
                                            ID           NUMBER,
                                            DATA1  VARCHAR2(40),
                                            DATA2  VARCHAR2(40) ENCRYPT);


             INSERT INTO table_tde_test (ID, DATA1, DATA2)
             VALUES (1, 'Dados NÃO criptogrados na coluna DATA1!','Dados criptogrados na coluna DATA2!');
    
             COMMIT;

             ALTER SYSTEM FLUSH BUFFER_CACHE; --> força atualização dos dados no arquivo de dados da tabela
   


        PASSO 3: Testando o TDE no nível da tabela

            a) Execute um SELECT na tabela criada no passo anterior:
                      SELECT * FROM  table_tde_test;
 
                Resultado:
                      Todos os dados da tabela serão retornados, inclusive os dados da coluna DATA2, que estão criptografados, pois o Wallet foi criado e está aberto desde o passo 1.

            b) Feche o Wallet:
                        ALTER SYSTEM SET WALLET CLOSE;

                Resultado
                        Wallet fechado.
                         
           c) Execute novamente o SELECT do item "a)":
                      SELECT * FROM  table_tde_test;

                Resultado:
                         O SELECT irá disparar o erro ORA-28365, pois com o Wallet fechado não é possível recuperar a senha de criptografia da tabela e decriptografar os dados.
  
            d) Execute um novo SELECT sem retornar os dados da coluna criptografada (DATA2):
                       SELECT ID, DATA1 FROM table_tde_test;

                Resultado:
                          A instrução SELECT irá retornar com sucesso pois sem a incluir a coluna DATA2, não é necessário consultar o Wallet.


        PASSO 4: Testando o TDE no nível do arquivo de dados

           a) Localize o arquivo de dados em que a tabela foi criada. A query abaixo poderá ser executada para descobrir o caminho completo do arquivo de dados se o usuário conectado tiver privilégios administrativos ou tiver privilégios de SELECT nas visões DBA_TABLES e DBA_DATA_FILES:

          SELECT            F.FILE_NAME
          FROM              DBA_TABLES T
          INNER JOIN   DBA_DATA_FILES F
                    ON         T.TABLESPACE_NAME = F.TABLESPACE_NAME
          WHERE           T.TABLE_NAME = 'TABLE_TDE_TEST';

  
           b) Entre na pasta localizada no item anterior:
        
                  - Se estiver usando SO Linux digite no prompt de comandos:
                            strings FILE.DBF | grep "criptogrados na coluna DATA"
  
                  Obs.: Substitua FILE.DBF pelo nome do arquivo de dados identificado no item anterior.
  

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.

   
 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)