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).
wow!! 15Exadata Patching: Inactive VAR LV /dev/mapper/VGExaDb-LVDbVar2 size (XXXXX) is smaller than Active VAR LV /dev/mapper/VGExaDb-LVDbVar1 size(XXXXX)
[…] Você também pode usar a opção IDENTIFIED BY EXTERNAL KEYSTORE em todos os […]