Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


quarta-feira, 17 de junho de 2009

Definição de senhas case-sensitive no Oracle 11g ...

Por Eduardo Legatti

Olá,

Para quem está planejando migrar o seu atual banco de dados Oracle para a mais recente versão Oracle 11g, ao utilizar o DBCA (Database Configuration Assistant), irá se deparar com uma nova tela de configuração intitulada de "Definições de Segurança". O objetivo desta tela é configurar, além de algumas definições padrão de auditoria, um novo perfil de senhas como mostrado na figura abaixo:



As configurações de segurança padrão ativam a auditoria para muitos privilégios de sistemas diferentes, como create session, create user, drop user, create any procedure, alter system, alter database, entre outras, de forma a seguir algumas exigências normativas definidas na legislação americana Sarbanes-Oxley (SOX).

O objetivo deste artigo é demonstrar a nova funcionalidade de senhas case-sensitive do Oracle 11g que, até então, eram case-insensitive, ou seja, no Oracle 11g existe a diferenciação entre letras maiúsculas e minúsculas na definição de uma senha de usuário de banco de dados. Por exemplo: Nas versões anteriores ao Oracle 11g, caso criássemos um usuário de banco de dados SCOTT e definíssemos sua senha para TIGER, poderíamos então nos conectar no banco de dados através deste usuário digitando a senha TIGER, Tiger, tiger, TiGer ou tiGER, sem qualquer distinção entre letras maiúsculas e minúsculas.

Agora no Oracle 11g, ao escolher a primeira opção conforme mostrado na figura acima, o banco de dados fará distinção entre letras maiúsculas e minúsculas ao entrar com a senha do usuário. No exemplo anterior, a senha do usuário SCOTT foi definida como TIGER (todas em maiúsculas), portanto, a conexão com o banco de dados só será bem sucedida caso a senha seja fornecida seja TIGER, não mais Tiger, tiger, TiGer ou tiGER.

Podemos ver abaixo o novo parâmetro de inicialização responsável por implementar este novo perfil de senhas case-sensitives no Oracle 11g:

SQL> show parameter sec_case_sensitive_logon

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------------------
sec_case_sensitive_logon             boolean     TRUE
 
Como demonstrado acima, o parâmetro SEC_CASE_SENSITIVE_LOGON está atualmente configurado como TRUE, ou seja, para realizar uma conexão bem sucedida no banco de dados, um usuário deverá fornecer a senha exatamente como foi definida durante a criação do usuário (diferenciando maiúsculas e minúsculas), isso supondo que a mesma tenha sido definida já no próprio Oracle 11g. Vamos então a um exemplo prático:

C:\>sqlplus / as sysdba

SQL*Plus: Release 11.1.0.6.0 - Production on Qua Jun 17 09:32:49 2009

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

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS> create user scott identified by tiger;

Usuário criado.

SYS> grant connect to scott;

Concessão bem-sucedida.

SYS> connect scott/TIGER
ERROR:
ORA-01017: senha/nome do usuário inválido; log-on negado


Advertência: Você não está mais conectado ao ORACLE.
@> connect scott/Tiger
ERROR:
ORA-01017: senha/nome do usuário inválido; log-on negado


@> connect scott/TiGer
ERROR:
ORA-01017: senha/nome do usuário inválido; log-on negado


@> connect scott/tiGER
ERROR:
ORA-01017: senha/nome do usuário inválido; log-on negado


@> connect scott/tiger
Conectado.
 
De acordo com a demonstração acima, podemos perceber que o usuário SCOTT só conseguiu se logar no banco de dados quando a senha "tiger" (todas em minúsculas) foi fornecida. Ao consultarmos a view de dicionário de dados DBA_USERS, poderemos perceber duas mudanças significativas:

SYS> select username, password, password_versions from dba_users;

USERNAME              PASSWORD                 PASSWORD_VERSIONS
--------------------- ------------------------ -----------------
MGMT_VIEW                                      10G 11G
SYS                                            10G 11G
SYSTEM                                         10G 11G
DBSNMP                                         10G 11G
SYSMAN                                         10G 11G
SCOTT                                          10G 11G
OUTLN                                          10G 11G
ANONYMOUS
WMSYS                                          10G 11G
XDB                                            10G 11G
DIP                                            10G 11G
ORACLE_OC                                      10G 11G
TSMSYS                                         10G 11G
XS$NULL                                        10G 11G

14 linhas selecionadas. 

A primeira mudança que podemos notar é que a informação do valor hash da senha na coluna PASSWORD não é mais mostrada como nas versões anteriores do Oracle, portanto, a mesma foi omitida no Oracle 11g, mas nada nos impede visualizar o seu valor hash na tabela base de dicionário de dados SYS.USER$.

SYS> select name,password from sys.user$ where name='SCOTT';

NAME                       PASSWORD
-------------------------- ------------------------------
SCOTT                      F894844C34402B67
 
Vale a pena salientar que o novo valor hash gerado pela senha case-sensitive é armazenada na coluna SPARE4 da tabela base SYS.USER$ do dicionário de dados.
Uma outra mudança perceptível na view de dicionário de dados DBA_USERS foi adição de uma nova coluna chamada PASSWORD_VERSIONS que indica em qual versão do Oracle a senha do usuário foi criada.

O valor "10g 11g" significa que a senha em questão possui informações hash tanto na coluna PASSWORD quanto na coluna SPARE4 da tabela base SYS.USER$, e que a mesma pode ou não ser case-sensitive (Isso vai depender se o parâmetro SEC_CASE_SENSITIVE_LOGON está ativado ou não).

O valor "10g" significa que somente a coluna PASSWORD possui a informação hash da senha do usuário, indicando que independente do parâmetro SEC_CASE_SENSITIVE_LOGON estar ativado ou não, a senha deste usuário vai ser case-insensitive até que a mesma seja alterada.

O valor "11g" indica que somente a coluna SPARE4 possui a informação hash da senha do usuário, indicando que a mesma é case-sensitive, portanto, o usuário conseguirá se conectar no banco de dados apenas quando o parâmetro SEC_CASE_SENSITIVE_LOGON estiver configurado com o valor TRUE (ativado). Abaixo irei realizar uma pequena demonstração:

SYS> alter user scott identified by TIGER;

Usuário alterado.

SYS> select password,spare4 from user$ where name='SCOTT';

PASSWORD                   SPARE4
-------------------------- --------------------------------------------------------------
F894844C34402B67           S:2CA14104071F06830C95527377C53B0DBF0349DE1B7BF4238EA663C806FD

SYS> select password_versions from dba_users where username='SCOTT';

PASSWORD
--------
10G 11G

SYS> alter user scott identified by values 'F894844C34402B67';

Usuário alterado.

SYS> select password,spare4 from user$ where name='SCOTT';

PASSWORD                   SPARE4
-------------------------- ----------------------------------------------------------
F894844C34402B67

SYS> select password_versions from dba_users where username='SCOTT';

PASSWORD
--------
10G

SYS> alter user scott identified 
  2  by values 'S:2CA14104071F06830C95527377C53B0DBF0349DE1B7BF4238EA663C806FD';

Usuário alterado.

SYS> select password,spare4 from user$ where name='SCOTT';

PASSWORD                   SPARE4
-------------------------- --------------------------------------------------------------
                           S:2CA14104071F06830C95527377C53B0DBF0349DE1B7BF4238EA663C806FD

SYS> select password_versions from dba_users where username='SCOTT';

PASSWORD
--------
11G
 
Em resumo, quando se define uma nova senha de usuário utilizando o Oracle 11g, a mesma irá atualizar os valores hash nas colunas PASSWORD e SPARE4 independente do parâmetro SEC_CASE_SENSITIVE_LOGON estiver ativado ou não.

Portanto, quando migramos usuários de versões Oracle anteriores (8i, 9i, 10g) para o Oracle 11g, seja utilizando uma importação FULL com o tradicional utilitário de importação (imp), ou usando o utilitário Import Datapump (impdp), nas quais as senhas dos usuários são case-insensitives, as senhas desses usuários continuarão case-insensitives, independente do parâmetro SEC_CASE_SENSITIVE_LOGON estar ativado ou não.

No caso de usuários com privilégios SYSDBA e SYSOPER, um outro parâmetro foi adicionado ao utilitário orapwd de forma a controlar senhas case-sensitives no arquivo de senhas:

$ orapwd file=orapwBD01 entries=5 ignorecase=y password=minha_senha
 
O parâmetro ignorecase, demonstrado no comando acima, pode ter o valor "n" (default), informando que as senhas serão tratadas como case-sensitives, ou "y" informando que as senhas serão tratadas como case-insensitives.

Para finalizar, e aproveitando o assunto de segurança de acesso e senhas de usuários, agora no Oracle 11g foi também disponibilizada uma view de dicionário de dados DBA_USERS_WITH_DEFPWD que ajuda o DBA a identificar quais usuários possuem a senha padrão "default" desde a criação do banco de dados, de forma que as mesmas possam ser alteradas quando possível:

SYS> select * from dba_users_with_defpwd;

USERNAME
------------------------------
DIP
XS$NULL
TSMSYS
OUTLN
EXFSYS
ORACLE_OCM
XDB
WMSYS

8 linhas selecionadas.



2 comentários:

Unknown disse...

Senhores, tenho em minha empresa uma base da dados que migramos do Oracle 10g para Oracle 11g Release 10.2.0.1.0, porem, estamos com problemas na autenticação da senha, pelo que li, o Oracle 11g é case-sensitive e temos muitas aplicações que acessam a base (como no 10g era case-insensitive), estamos tendo problemas, pois toda hora a base retorna: "the account is locked", devido nossa aplicações ainda utilizarem "insensitive".
Pelo que ppude verificar, tratasse de uma parametro, consigo alterar isso no Oralce 11g para rodar case-insensitive?
(Lembro que o Oracle esta rodando em um RedHat Enterprise 5 64Bits)

Obrigado.

Eduardo Legatti disse...

Olá TCI,

Realmente se trata de um parâmetro ;-)

No caso das senhas, para tornar o Oracle case-insensitive como nas versões anteriores, basta setar o parâmetro para FALSE como demonstrado abaixo:

SQL> alter system set sec_case_sensitive_logon=false;

Abraços e até mais ...

Postagens populares