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


domingo, 2 de junho de 2013

Fazendo uso de Wallets no Oracle para omitir informações de usuários e senhas durante uma autenticação no banco de dados

Por Eduardo Legatti

Olá,

Quando precisamos conectar no banco de dados Oracle, geralmente precisamos fornecer três informações básicas: o usuário, a senha e a string de conexão (Oracle Net Service Name) contendo as informações do banco de dados de destino na qual queremos nos conectar. Em relação a string de conexão, podemos utilizar um alias referente a um serviço de banco de dados localizado no arquivo TNSNAMES.ORA. Por exemplo, utilizando o SQL*Plus, em vez de utilizarmos um alias TNS contendo a string de conexão para o banco de dados (ex: sqlplus user/pass@TNS), à partir do  SQL*Plus do Oracle 10g poderemos também utilizar a sintaxe easy connect (ex: sqlplus user/pass@servername:port/DB). Enfim, independente da forma de conexão utilizada, para que uma aplicação possa se conectar no banco de dados, essas três informações são necessárias. No entanto, a seguinte questão poderá surgir: Como fazer para proteger as informações de usuário e senha de forma que as mesmas não fiquem expostas no código da aplicação, arquivos de configuração, scripts SQL e arquivos batch? Bom, é aí que entra o conceito de Wallet, ou seja, um container usado para armazenar credenciais de autenticação de forma segura e criptografada.

Após o Wallet ser configurado, não será mais necessário fornecer as informações de usuário e senha, pois as mesmas estarão armazenadas no Wallet. Para tanto, será necessário apenas informar a string de conexão para o banco de dados de destino (ex: sqlplus /@TNS). Veremos a seguir um exemplo prático de como criar um Wallet.

Após instalação do Oracle Client, o primeiro passo será editar o arquivo SQLNET.ORA localizado em ORACLE_HOME/network/admin de forma a configurarmos o parâmetro WALLET_LOCATION conforme demonstrado abaixo:

WALLET_LOCATION =
   (SOURCE =
     (METHOD = FILE)
     (METHOD_DATA =
       (DIRECTORY = C:\WALLET)
     )
   )

SQLNET.WALLET_OVERRIDE = TRUE
 
Acima, foi definido que o caminho do Wallet será C:\WALLET. O parâmetro SQLNET.WALLET_OVERRIDE foi setado para TRUE apenas para garantir que o método de autenticação seja o de autenticação de banco de dados, ou seja, qualquer método de autenticação, como por exemplo, (OS authentication) será ignorado. Bom, após realizado a configuração acima, irei criar a seguir o Wallet. Vale a pena salientar que será necessário definir uma senha de no mínimo 8 caracteres (letras e números) para a criação do Wallet. Esta senha será necessária para abrir o Wallet conforme demonstrações mais a frente.

C:\>mkstore -wrl "C:\WALLET" -create
Oracle Secret Store Tool : Versão 11.2.0.1.0 - Production
Copyright (c) 2004, 2009, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.

Informe a senha: ********

Informe a senha novamente: ********
 
Após a criação do Wallet, podemos ver abaixo que dois arquivos foram criados no diretório C:\WALLET.

C:\>dir C:\WALLET
 O volume na unidade C não tem nome.
 O número de série do volume é 74DF-3878

 Pasta de C:\WALLET

02/06/2013  13:02             3.589 cwallet.sso
02/06/2013  13:02             3.512 ewallet.p12
               2 arquivo(s)          7.101 bytes
               2 pasta(s) 14.245.322.752 bytes disponíveis
 
O próximo passo será o de fornecer as credenciais de autenticação como usuário, senha, e a string de conexão. Abaixo, irei informar o serviço BD01 que deverá estar devidamente configurado no arquivo TNSNAMES.ORA, o usuário scott e a senha tiger.
 
C:\>mkstore -wrl "C:\WALLET" -createCredential BD01 scott tiger
Oracle Secret Store Tool : Versão 11.2.0.1.0 - Production
Copyright (c) 2004, 2009, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.

Informe a senha da wallet: ********

PKI-02002: Não foi possível abrir a wallet. Verifique a senha.
 
Apenas para fins de demonstração, caso eu informe a senha diferente da que foi definida na criação do Wallet, o erro PKI-02002 será emitido.

C:\>mkstore -wrl "C:\WALLET" -createCredential BD01 scott tiger
Oracle Secret Store Tool : Versão 11.2.0.1.0 - Production
Copyright (c) 2004, 2009, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.

Informe a senha da wallet: ********

Create credential oracle.security.client.connect_string1
 
Após a digitação correta da senha, podemos ver acima que a credencial foi inserida na Wallet com sucesso. Para nos certificarmos disso podemos utiliza o comando abaixo para verificar as informações.

C:\>mkstore -wrl "C:\WALLET" -listCredential
Oracle Secret Store Tool : Versão 11.2.0.1.0 - Production
Copyright (c) 2004, 2009, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.

Informe a senha da wallet: ********

List credential (index: connect_string username)
1: BD01 scott

Agora poderemos realizar o teste de conexão. Para tanto irei utilizar o sqlplus para simular o cliente remoto. Para que o teste seja realizado com sucesso, o serviço BD01 deverá estar devidamente configurado no arquivo TNSNAMES.ORA conforme demonstrado abaixo:

BD01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = server01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = BD01)
    )
  )

Vamos então ao teste. Abaixo irei realizar a conexão com o banco de dados, omitinto o usuário e senha. A única informação passada será a do serviço de banco de dados.

C:\>sqlplus /@BD01

SQL*Plus: Release 11.2.0.1.0 Production on Dom Jun 2 13:13:03 2013

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

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

SQL> show user
USER é "SCOTT"

Perfeito. A conexão foi realizada com sucesso. Agora vamos simular a alteração da senha do usuário SCOTT.

C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Dom Jun 2 13:15:03 2013

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

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

SQL> alter user scott identified by dog;

Usuário alterado.

Se tentarmos realizar a conexão novamente, veremos abaixo que a mesma irá falhar, pois a credencial no Wallet possui informação da senha antiga (tiger).

C:\>sqlplus /@BD01

SQL*Plus: Release 11.2.0.1.0 Production on Dom Jun 2 13:19:03 2013

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

ERROR:
ORA-01017: senha/nome do usuário inválido; log-on negado

Para tanto, precisaremos atualizar o Wallet informando a nova senha do usuário SCOTT conforme demonstrado no comando abaixo:

C:\>mkstore -wrl "C:\WALLET" -modifyCredential BD01 scott dog
Oracle Secret Store Tool : Versão 11.2.0.1.0 - Production
Copyright (c) 2004, 2009, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.

Informe a senha da wallet: ********

Modify credential
Modify 1

Após a atualização da senha, poderemos realizar um novo teste conforme a seguir.

C:\>sqlplus /@BD01

SQL*Plus: Release 11.2.0.1.0 Production on Dom Jun 2 13:21:03 2013

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

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

SQL> show user
USER é "SCOTT"

Se por acaso desejarmos excluir essa credencial do Wallet, bastará utilizarmos o comando abaixo.

C:\>mkstore -wrl "C:\WALLET" -deleteCredential BD01
Oracle Secret Store Tool : Versão 11.2.0.1.0 - Production
Copyright (c) 2004, 2009, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.

Informe a senha da wallet:

Delete credential
Delete 1

Enfim, se quisermos inserir várias credenciais no Wallet de forma que mais de um usuário faça uso do mesmo, basta definirmos diferentes nomes de serviços TNS. No mais, no Oracle 11g foi criado o utilitário orapki que oferece muito mais opções para gerenciamento de wallets, entre outros recursos.



6 comentários:

Alessandro Cordeiro disse...

Olá Legatti

Você sabe qual é a versão do client minimo para aceitar o uso de wallet? Pois hoje tenho clientes que apesar de estar na versão 11 o banco de dados, ainda tem maquinas que acessam usando o Client 9.

Obrigado.

Eduardo Legatti disse...

Olá Alessandro,

Acredito que à partir do Oracle 10g, mas não custa tentar se os Clients Oracle 9i irão funcionar.

Abraços,

Legatti

Agnus Tecnologia T.I disse...

Olá Eduardo,

Fiquei com três duvidas, se puder me solucionar agradeço.

1) Como uso dois Wallet? Pq ao usar o Autonomos DataBase eu já tenho uma Wallet para acesso ao banco com criptografia.
2) No Exemplo seu o SQLPLUs vc não informa o Login nem a senha, E se a aplicação passar o Login e a senha o Client ignora?
3) No caso gerencio uma aplicação que pode logar com 3 Contas distintas, como valido isso no Wallet?

Eduardo Legatti disse...

Nunca fiz testes com mais de um wallet. Acredito que você pode inserir várias credenciais no mesmo Wallet de forma que mais de um usuário faça uso do mesmo. Não me lembro se basta definir diferentes nomes de serviços TNS ou se apenas o usuário sendo diferente já funcionaria. Se for informado o usuário e senha a conexão vai ser realizada com sucesso. O propósito do wallet é esconder essas informações.

Abraços

Legatti

Agnus Tecnologia T.I disse...

Oi Eduardo, fiz uns testes aqui, e o que posso dizer é que para cada usuario vou precisar de um alias no tnsnames, até ai não é problema. O meu problema é que aplicação passa o login e uma senha e ela Obrigda "saber" a senha. A minha ideia era ignorar a senha do sistema informado e o Client Oracle usar a senha do Wallet, assim na configuração da aplicação eu colocaria qualquer coisa na senha so para configurar.

Eduardo Legatti disse...

Nesse caso a aplicação teria que permitir uma configuração para permitir o uso de wallets onde o usuário e senha não são informadas.

Postagens populares