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.
Ola,
ResponderExcluirParabéns Fábio pelo blog e conteúdo apresentado.
Abraços
Rodrigo Almeida
Obrigado Rodrigo. Também parabenizo o seu blog (que já está incluso há um bom tempo na MINHA LISTA DE BLOGS).
ResponderExcluir