TDE wallet in multi database environment

 

Dans l’article TDE (Part I) nous avions configuré TDE pour la base de données ARKONA en RAC. Une wallet  contenant la mastrer key, avait été générée. L’emplacement de la wallet est configuré dans le fichier sqlnet.ora se trouvant dans le répertoire TNS_ADMIN par défaut ($ORACLE_HOME/network/admin).

[oracle@racdb1 admin]$ cat sqlnet.ora

ENCRYPTION_WALLET_LOCATION = (SOURCE =(METHOD = FILE) (METHOD_DATA =(DIRECTORY =/oracle/oraBase/wallet)))

Mais voilà, maintenant il nous faut gérer sur ce même cluster le chiffrage par tablespace d’une deuxième base de données. Comment faire sachant qu’une wallet ne peut appartenir qu’à une seule base de données ?  Et en plus il faudra configurer des connexions par SSL pour chacune des bases et donc gérer de nouvelles wallet. (la mise en place SSL sera fait dans un prochain article).

 

Pour la gestion de wallet dans un environnement multidatabase, oracle propose 3 solutions

 

La première solution est de laisser pour toutes les bases le TNS_ADMIN par défaut qui pointe donc sur le sqlnet.ora dans $ORACLE_HOME/network/admin et surtout ne mettre aucune entrée ENCRYPTION_WALLET_LOCATION et WALLET_LOCATION dans ce fichier.

Cela aura pour effet, qu'à chaque création de wallet, elles se créeront dans $ORACLE_BASE/admin/DB_UNIQUE_NAME/wallet ou $ORACLE_HOME/admin/DB_UNIQUE_NAME/wallet et donc chaque base écrira sa wallet dans un répertoire diffèrent.

C’est la solution la plus simple:

[oracle@oradbm1 TESTORA]$ export ORACLE_SID=TESTORA1
[oracle@oradbm1 TESTORA]$ sqlplus / as sysdba
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "MotDePasse";

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "MotDePasse"
*
ERROR at line 1:
ORA-28368: cannot auto-create wallet

SQL> ! mkdir -p /oracle/oraBase/admin/TESTORA/wallet

SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "MotDePasse";

System altered.

SQL> !ls -l /oracle/oraBase/admin/TESTORA/wallet
total 4
-rw-r--r--. 1 oracle oinstall 1573 Jun 14 14:35 ewallet.p12

Remarque : si jamais la base est un jour dataguardée et que le db_unique_name doit être changé, il faudra penser à déplacer la wallet de place.

Mais ce n’est pas la solution que nous allons retenir, car en plus on vient de me dire à l'oreillette qu'on nous impose d’écrire la wallet dans un filesystem spécifique qui est lui-même chiffré.

 

La deuxième solution, celle que nous allons choisir, est de préciser dans le fichier sqlnet.ora l’emplacement de la wallet avec en variable le nom de l’instance, comme dans l’exemple ci-dessous:

ENCRYPTION_WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /home/oracle/wallet/$ORACLE_SID)

 

Et la troisième solution proposé par Oracle, à ne faire que si les deux précédentes solutions ne sont pas faisables, est de gérer plusieurs sqlnet.ora grâce à la variable d’environnement TNS_ADMIN.

Les bases doivent être alors démarrées avec la variable TNS_ADMIN positionnée vers leur propre sqlnet.ora. Cela signifie que si un administrateur démarre la base sous sqlplus il doit être sûr que le TNS_ADMIN est bien positionné dans sa session sinon cela risque de provoquer des petits soucis Wink

En RAC (ou avec Oracle restart) il faut informer la couche grid de bien prendre la bonne configuration TNS_ADMIN pour chaque base, exemple pour la base TESTORA et PRODDB:

[oracle]/home/oracle> srvctl setenv database -d TESTORA -T "TNS_ADMIN=$ORACLE_HOME/network/admin/testora"

[oracle]/home/oracle> srvctl getenv database -d TESTORA
TESTORA:
TNS_ADMIN=/oracle/11.2.0.4/database/network/admin/testora


[oracle]/home/oracle> srvctl setenv database -d PRODDB -T "TNS_ADMIN=$ORACLE_HOME/network/admin/proddb"

[oracle]/home/oracle> srvctl getenv database -d PRODDB
PRODDB:
TNS_ADMIN=/oracle/11.2.0.4/database/network/admin/proddb

A chaque démarrage par la couche grid, les bases seront démarrées avec le « bon » TNS_ADMIN qui pointent vers « son » sqlnet.ora qui pointe lui-même vers sa wallet.

Cette solution n’est à choisir qu’en dernier lieu, mais elle fonctionne, c’est juste qu’au niveau de l’administration il faut être un peu plus rigoureux.

 

Pour mettre donc la solution 2 en place nous commençons par migrer la wallet de ARKONA. Pour cela il faut arrêter la base de données :

[oracle@racdb1 admin]$ srvctl start database -d ARKONA

Puis créer sur les 2 noeuds les répertoires qui vont hébérger les wallet

[root@racdb1 ~]# mkdir -p /fscrypt/wallet/ARKONA1
[root@racdb1 ~]# mkdir -p /fscrypt/wallet/DERDIAN1
[root@racdb1 ~]# chown -R oracle.oinstall /fscrypt/wallet

[root@racdb2 ~]# mkdir -p /fscrypt/wallet/ARKONA2
[root@racdb2 ~]# mkdir -p /fscrypt/wallet/DERDIAN2
[root@racdb2 ~]# chown -R oracle.oinstall /fscrypt/wallet

Ensuite il suffit de copier les wallets existantes dans les nouveaux répertoires

[oracle@racdb1 ~]$ cp -p /oracle/oraBase/wallet/ewallet.p12 /fscrypt/wallet/ARKONA1

[oracle@racdb2 ~]$ cp -p /oracle/oraBase/wallet/ewallet.p12 /fscrypt/wallet/ARKONA2

Maintenant nous pouvons changer la configuration de « encryption wallet »

[oracle@racdb1 admin]$ cd $ORACLE_HOME/network/admin
[oracle@racdb1 admin]$ vi sqlnet.ora
ENCRYPTION_WALLET_LOCATION = (SOURCE =(METHOD = FILE) (METHOD_DATA =(DIRECTORY =/fscrypt/wallet/${ORACLE_SID})))

 

Il ne reste plus qu’à démarrer la base ARKONA et tester l’ouverture de la wallet

[oracle@racdb1 admin]$ srvctl start database -d ARKONA
[oracle@racdb1 admin]$ export ORACLE_SID=ARKONA1
[oracle@racdb1 admin]$ sqlplus / as sysdba

SQL>  select * from gv$encryption_wallet

  INST_ID WRL_TYPE                      WRL_PARAMETER                                           STATUS
---------- -------------------- -------------------------------------------------- ------------------
                 1 file                     /fscrypt/wallet/${ORACLE_SID}                                CLOSED
                 2 file                     /fscrypt/wallet/${ORACLE_SID}                                CLOSED


SQL> ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "MotDePasse";
System altered.

SQL>  select * from gv$encryption_wallet

  INST_ID WRL_TYPE                      WRL_PARAMETER                                          STATUS
---------- -------------------- -------------------------------------------------- ------------------
                 1 file                     /fscrypt/wallet/${ORACLE_SID}                               OPEN
                 2 file                     /fscrypt/wallet/${ORACLE_SID}                               OPEN

Migration OK. (pas bien compliqué!)

 

Testons maitnenant les wallets en multi environnement.

Il faut donc créer la nouvelle wallet de la base de données DERDIAN, et la répliquer sur l’autre nœud du RAC :

[oracle@racdb1 admin]$ export ORACLE_SID=DERDIAN1
[oracle@racdb1 admin]$ sqlplus / as sysdba

SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "MotDePasse2";
System altered.

SQL> select * from gv$encryption_wallet

   INST_ID WRL_TYPE                     WRL_PARAMETER                                          STATUS
---------- -------------------- -------------------------------------------------- ------------------
                 1 file                     /fscrypt/wallet/${ORACLE_SID}                               OPEN
                 2 file                     /fscrypt/wallet/${ORACLE_SID}                               CLOSED

SQL> !ls -l /fscrypt/wallet/DERDIAN1
total 4
-rw-r--r--. 1 oracle asmadmin 1573 Jun 14 20:46 ewallet.p12

SQL> !scp /fscrypt/wallet/DERDIAN1/ewallet.p12 oracle@racdb2:/fscrypt/wallet/DERDIAN2
ewallet.p12                                                                                                100% 1573     1.5KB/s   00:00   

Puis sur le deuxième noeud:

[oracle@racdb2 admin]$ sqlplus / as sysdba

SQL> ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "MotDePasse2";
System altered.

SQL> select * from gv$encryption_wallet;

   INST_ID WRL_TYPE                     WRL_PARAMETER                                         STATUS
---------- -------------------- -------------------------------------------------- ------------------
                 1 file                     /fscrypt/wallet/${ORACLE_SID}                              OPEN
                 2 file                     /fscrypt/wallet/${ORACLE_SID}                              OPEN

 

Et voilà ce n’est pas bien compliqué. Maintenant il nous reste à mettre en place les connexions SSL (par certificat) avec la gestion multi-wallet mais cela est une autre histoire… qui sera compté dans un prochain article.