Definição de senhas case-sensitive no Oracle 11g
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).
Abaixo veremos esta 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.