Introdução

Quando trabalhamos com Transparent Data Encryption (TDE), os comandos administrativos que alteram o conteúdo da wallet devem ser executados com a wallet aberta no modo “PASSWORD” ao invés do modo “AUTOLOGIN”, uma vez que o modo AUTOLOGIN é utilizado apenas para abertura do banco de dados e leitura das Master Encryption Keys.

Por padrão, para abrir e fechar a Wallet no modo PASSWORD, precisamos executar um comando similar ao exemplo abaixo:

-- open
administer key management set keystore open identified by "<SenhaDaWalletAqui>";

-- close
administer key management set keystore close identified by "<SenhaDaWalletAqui>";

Neste post eu demonstro como utilizar os comandos “ADMINISTER KEY” com uma sintaxe alternativa, indicando o uso de uma “EXTERNAL STORE” ao invés de informar a senha explicitamente no comando sendo digitado no SQLPLUS.

Essa abordagem pode ser útil quando você precisa realizar muitas ações que envolvem o uso da wallet TDE no mesmo banco de dados sem ficar copiando e colando a senha no SQL*PLUS, ou até mesmo quando precisa realizar uma atividade compartilhando a tela com outras pessoas que não deveriam ter conhecimento da senha sendo utilizada.

Como isso funciona ?

O Oracle Database suporta o uso de uma wallet auxiliar da Wallet principal que mantém as chaves do TDE. Essa Wallet auxiliar faz o papel de uma Secure External Password Store (SEPS). É isso mesmo que você pensou, é como uma Wallet da Wallet (Uma wallet “A” do tipo Auto-Login possui a senha que abre a Wallet “B”).

Para começar usar essa funcionalidade, precisamos criar um sub-diretório chamado “tde_seps” no diretório base usado pela wallet do banco de dados. Neste caso, ficaria “<wallet_root>/tde_seps”.

Exemplo

O CDB abaixo tem o parâmetro “wallet_root” definido para “/u01/app/oracle/admin/CDBTST/wallet”.

Parâmetro wallet_root:

SQL> select value from v$parameter where name = 'wallet_root';

VALUE
----------------------------------------------------------------------------------------------------
/u01/app/oracle/admin/CDBTST/wallet

Status da Wallet em cada PDB.

SQL> SELECT CON_ID, STATUS, KEYSTORE_MODE AS KEY_MODE, WRL_PARAMETER FROM V$ENCRYPTION_WALLET;

CON_ID STATUS		    KEY_MODE WRL_PARAMETER
------ -------------------- -------- ---------------------------------------------------------------------------
     1 OPEN		    NONE     /u01/app/oracle/admin/CDBTST/wallet/tde/
     2 OPEN		    UNITED
     3 OPEN		    ISOLATED /u01/app/oracle/admin/CDBTST/wallet/21525D37D5E478E5E0630E01A8C056FE/tde/
     4 OPEN		    UNITED
     5 OPEN		    UNITED
     7 OPEN_NO_MASTER_KEY   UNITED

6 rows selected.

No exemplo acima, o PDB com CON_ID=3 está configurado no modo “Isolated-Keystore”, indicando que esse PDB usa uma wallet própria, isolada do CDB. Todos os demais estão no modo “United-Keystore”, indicando que eles compartilham a mesma wallet que CDB root (por isso a coluna WRL_PARAMETER aparece vazia pra esses PDBs).

Para este exemplo, eu criei o PDB “TESTKEY2” (CON_ID=7), sem definir uma Master Encryption Key propositalmente, por isso ele aparece com status “OPEN_NO_MASTER_KEY”.

Para corrigir este cenário, é necessário executar um comando similar ao exemplo abaixo, assumindo que a senha da wallet é “Dibiei”:

ALTER SESSION SET CONTAINER = TESTKEY2;
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY "Dibiei" WITH BACKUP;

Mas o objetivo desse post é mostrar como executar os comandos com uma sintaxe alternativa, como essa abaixo:

ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE WITH BACKUP;

Solução

1) Crie o sub-diretório tde_seps dentro do diretório definido no parâmetro wallet_root, ou o caminho definido em WALLET_LOCATION se estiver usando sqlnet.ora:

mkdir -p /u01/app/oracle/admin/CDBTST/wallet/tde_seps

2) Adicione a credencial do tipo TDE_WALLET.

administer key management 
add secret 'Dibiei' 
for client 'TDE_WALLET' 
to local auto_login keystore '/u01/app/oracle/admin/CDBTST/wallet/tde_seps';

DICA: Caso a wallet SEPS ainda não exista, esse comando irá criá-la automaticamente.

3) Comece a executar os comandos com a opção “IDENTIFIED BY EXTERNAL STORE”:

ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE;

Exemplo:

SQL> ! mkdir -p /u01/app/oracle/admin/CDBTST/wallet/tde_seps


SQL> administer key management 
add secret 'Dibiei' 
for client 'TDE_WALLET' 
to local auto_login keystore '/u01/app/oracle/admin/CDBTST/wallet/tde_seps'; 

keystore altered.

SQL> ALTER SESSION SET CONTAINER = TESTKEY2;

Session altered.

SQL> SELECT CON_ID, STATUS FROM V$ENCRYPTION_WALLET;

CON_ID STATUS
------ --------------------
     7 OPEN_NO_MASTER_KEY

SQL> 
SQL> ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE WITH BACKUP;

keystore altered.

SQL> SELECT CON_ID, STATUS FROM V$ENCRYPTION_WALLET;

CON_ID STATUS
------ --------------------
     7 OPEN

PDB com Wallet em Isolated Mode

O comando acima deve funcionar para qualquer PDB nesse CDB que compartilham a mesma Wallet (United-Mode), mas e para os PDBs configurado como Isolated-Mode ?

SQL> alter session set container = PDBTST1;

Session altered.


SQL> ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE WITH BACKUP;;
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE WITH BACKUP
*
ERROR at line 1:
ORA-00988: missing or invalid password(s)

O erro acima é esperado porque a wallet auxiliar “tde_seps” foi criada para o CDB root e PDBs que compartilham a mesma wallet que o CDB (United-Mode).

Para esse recurso funcionar com PDB que usa uma wallet exclusiva, é necessário criar uma wallet “tde_seps” exclusiva para o PDB. Para isso, a nova wallet “tde_seps” deve ser criada no diretório equivalente a “<wallet_root>/<PDB_GUID>/tde_seps

Exemplo:

SQL> SELECT WRL_PARAMETER FROM V$ENCRYPTION_WALLET;

WRL_PARAMETER
--------------------------------------------------------------------------------
/u01/app/oracle/admin/CDBTST/wallet/2245AE812C785E04E0630E01A8C05C06/tde/

SQL> administer key management 
add secret 'Dibiei' 
for client 'TDE_WALLET'
to local auto_login keystore '/u01/app/oracle/admin/CDBTST/wallet/2245AE812C785E04E0630E01A8C05C06/tde_seps'; 

keystore altered.


SQL> ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE WITH BACKUP;

keystore altered.

Uso com Oracle Key Vault (OKV)

Se o ambiente usa Wallet com Oracle Key Vault (OKV), essa mesma abordagem pode ser usada, mudando apenas o nome do “CLIENT” no comando ADD SECRET de ‘TDE_WALLET‘ para ‘OKV_PASSWORD‘.

No exemplo abaixo, a senha da wallet do OVK foi incluída como “NULL” na wallet auxiliar (padrão quando a wallet é criada sem senha pelo OKV Client):

administer key management 
add secret 'NULL' for client 'OKV_PASSWORD' 
to local auto_login keystore '/u01/app/oracle/admin/CDB1/wallet/tde_seps';

Com essa configuração, a wallet do tipo OKV pode ser manuseada sem a necessidade de digitar a senha a cada operação (mesmo que ela seja NULL).

Exemplo:

SQL> administer key management 
add secret 'NULL' for client 'OKV_PASSWORD' 
to local auto_login keystore '/u01/app/oracle/admin/CDB1/wallet/tde_seps';  2    3  

keystore altered.

SQL> administer key management set keystore CLOSE identified by external store container = all;

keystore altered.

SQL> 
SQL> SELECT WRL_TYPE, CON_ID, STATUS, WALLET_TYPE FROM V$ENCRYPTION_WALLET;

WRL_TYPE   CON_ID STATUS	       WALLET_TYPE
---------- ------ -------------------- ---------------
FILE		1 CLOSED	       UNKNOWN
OKV		1 CLOSED	       UNKNOWN
FILE		2 CLOSED	       UNKNOWN
OKV		2 CLOSED	       UNKNOWN
FILE		3 CLOSED	       UNKNOWN
OKV		3 CLOSED	       UNKNOWN

6 rows selected.

SQL> administer key management set keystore OPEN identified by external store container = all;

keystore altered.

SQL> 
SQL>  SELECT WRL_TYPE, CON_ID, STATUS, WALLET_TYPE FROM V$ENCRYPTION_WALLET;

WRL_TYPE   CON_ID STATUS	       WALLET_TYPE
---------- ------ -------------------- ---------------
FILE		1 CLOSED	       UNKNOWN
OKV		1 OPEN		       OKV
FILE		2 CLOSED	       UNKNOWN
OKV		2 OPEN		       OKV
FILE		3 CLOSED	       UNKNOWN
OKV		3 OPEN		       OKV

6 rows selected.

Conclusão

Este post demonstrou como utilizar a opção EXTERNAL KEYSTORE no gerenciamento do Transparent Data Encryption (TDE), o que permite utilizar o recurso de SEPS para evitar a necessidade de digitar senhas explicitamente nos comandos ADMINISTER KEY. O conteúdo deve ser o suficiente para dar os primeiros passos em configurações de United-Mode e Isoloated Mode em banco de dados Multitenant, assim como ambientes que usam o Oracle Key Vault (OKV).

2 thoughts on “Oracle TDE: Como Executar Comandos “ADMINISTER KEY” Com a Opção “IDENTIFIED BY EXTERNAL STORE””

Leave a Reply to Oracle TDE – User-Defined Key: Como Criar Uma Master Encryption Key (MEK) Com a Sua Própria Chave – Blog do DibieiCancel reply

Discover more from Blog do Dibiei

Subscribe now to keep reading and get access to the full archive.

Continue reading