0

Le chiffrement Oracle : Transparent Data Encryption sur Oracle 19c

twitterlinkedinmail

 

 

Suite au premier article publié ce mois ci concernant “native network encryption” , je vous propose, pour ce sujet chiffrement et sécurité, de découvrir le fonctionnement de Transparent Data Encryption (TDE) pour Oracle.

Le sujet TDE a plusieurs fois été abordé au sein de notre blog, pour la partie PostgreSQL sur cet article, mais également sur une instance de bases de données SQL Server sur ce lien.

Je vous invite donc à lire, ou relire, les présentations faites pour ces SGBD en question.

Pour le moment, intéressons nous à ce que propose Oracle.

 

Présentation

 

Oracle TDE permet de chiffrer des données sensibles dans une base de données Oracle (multitenant ou pas) de façon la plus transparente possible pour l’application. En outre, l’application n’a pas besoin d’embarquer de stratégie de chiffrement puisque celle-ci est intégralement gérée coté serveur Oracle.

Les données, dans les colonnes, sont chiffrées une fois inscrites dans les datafiles. Il ne sera donc pas possible de les récupérer (via ALTER SYSTEM DUMP DATAFILE) sans avoir la clé.
Les syntaxes SQL utilisées par l’application restent inchangées puisque celles-ci sont directement envoyées depuis l’application cliente et chiffrées sur le serveur base de données locale (encryption at rest).

 

Oracle TDE utilise, pour son processus, un mécanisme de clés (master key et clé de cryptage) afin de valider l’ouverture du “wallet”, et du chiffrement de la donnée.

À partir d’Oracle 10gr2, Oracle TDE a la possibilité de traiter l’algorithme de chiffrement sur une colonne de table (un champs adresse ou RIB par exemple).
C’est à partir de la version Oracle 11gr1 qu’Oracle TDE peut travailler sur le chiffrement d’un tablespace entier. Ceci a l’avantage de traiter davantage d’objets en même temps.

Mais avant d’aller plus loin sur le fonctionnement de TDE, et comme nous sommes sur Oracle, il convient d’aller vérifier, point de vu licensing, ce que nous devons choisir comme version, pour configurer cette fonctionnalité et être en “règle” avec Oracle.

Cette fois ci, nous serons bien obligés de nous tourner vers la version Enterprise Edition Oracle, avec en plus, l’option payante “Advanced Security”.

 

Extrait du site Oracle -> lien

Pour une version Oracle 19c, nous choisirons donc de prendre une licence Enterprise Edition. A noter que l’option “Advanced Security” est incluse dans la version Personnal Edition On prem, alors qu’elle est en “extra coût” pour une version Enterprise Edition On prem.

 

Les algorithmes de chiffrement

 

Voici la liste des algorithmes utilisés par Oracle pour TDE, et ce, avec une instance de bases de données Oracle 19c

 

Oracle TDE travaille par défaut, avec l’algorithme Advanced Encryption Standard sur 192 bits, soit AES192 si vous souhaitez chiffrer une colonne. Pour un tablespace, c’est le même algorithme, mais en 128 bits.

D’autres algorithmes comme ARIA ou GOST pourront être choisis également.

Pour le chiffrement sur colonne, Oracle TDE utilisera par défaut SALT pour renforcer la sécurité des données. Le procédé suivant est réalisé ; une chaine sera ajoutée de façon aléatoire dans la donnée avant d’être chiffrée. Cela empêchera de trouver facilement la valeur d’un caractère à partir d’un motif de cryptage.

C’est lors de l’appel à la clause “ENCRYPT” que vous pouvez choisir un autre algorithme pour la colonne ou le tablespace.

 

Le fonctionnement

 

Oracle TDE se charge du chiffrement d’une donnée dans une colonne de table applicative en utilisant  un fonctionnement de type ESM (External Security Module) ce qui permet de générer des clés de chiffrement qui servent lors des opérations de cryptage et decryptage.

Ces clés de chiffrement sont stockées en interne dans la base de données. Une clé de chiffrement peut gérer une ou plusieurs colonnes de tables applicatives.

Ces mêmes clés de chiffrement sont stockées en interne dans une colonne du dictionnaire de données (vues v$encryption…) .
C’est la clé que l’on appelle « master key » qui permet de crypter/decrypter la colonne du dictionnaire de données afin d’utiliser ces clés de chiffrement de données aux personnes autorisées.

On peut représenter le mécanisme via le graphique suivant afin de comprendre le cheminement du processus Oracle TDE :

 

Dans tous les cas, il nous faut disposer d’un rôle DBA (ou bien du rôle SYSKM depuis la version Oracle 12c), afin de manipuler cette « master key ».
Cette clé est stockée hors de la base de données, c’est un répertoire de l’OS (ou ASM depuis la version Oracle 12c) qui portera cette clé.
Afin de la sécuriser encore plus, on utilisera un wallet.

 

Prérequis à la mise en place d’un wallet (keystore)

 

Pour mettre en place Oracle TDE,  nous devons créer un wallet.
Celui-ci sera créer par défaut sous « $ORACLE_BASE/admin/$ORACLE_SID/wallet » ou bien dans un autre répertoire que nous pourrons spécifier.

Pour notre instance CAPDATADB

[oracle@ip-172-44-2-141 admin]$ ls -lrt /opt/app/oracle/admin/CAPDATADB/
total 20
drwxr-x---. 2 oracle dba 4096 Jun 3 2021 scripts
drwxr-x---. 2 oracle dba 44 Jun 3 2021 xdb_wallet
drwxr-x---. 2 oracle dba 20 Jun 3 2021 dpdump
drwxr-x---. 2 oracle dba 34 Jun 3 2021 pfile
drwxr-x---. 2 oracle dba 12288 Mar 13 16:08 adump
drwxr-xr-x. 2 oracle dba 6 Mar 13 16:10 wallet

 

Depuis la version Oracle 12c, il est maintenant possible de stocker le wallet (keystore) sur ASM.

La master key communique alors en base directement afin de pouvoir utiliser la clé de cryptage / décryptage.
On peut schématiser de la façon suivante (attention c’est un vue obsolète depuis Oracle 19c) :

 

 

Afin de pouvoir créer et administrer un wallet, on parle maintenant de keystore en 12c, nous utilisons 2 méthodes;
– soit l’utilisation de l’outil Oracle Wallet Manager fourni par Oracle,
– soit passer les commandes directement en base via les syntaxes « ADMINISTER KEY MANAGEMENT ».

Depuis la version 19c, il y a eu quelques modifications quant à la prise en charge du wallet Oracle.
La variable “ENCRYPTION_WALLET_LOCATION” n’est plus utilisée pour définir l’emplacement du répertoire dédié au wallet.

Nous disposons de 2 nouvelles variables qui sont

– “WALLET_ROOT“, répertoire par défaut dédié au wallet Oracle.
– “TDE_CONFIGURATION“, le type d’emplacement pour TDE. Ce paramètre s’appuie sur le paramètre “KEYSTORE_CONFIGURATION“.

Il est possible de définir ces variables, soit dans le SPFILE.ORA de l’instance, soit au niveau du SQLNET.ORA du ORACLE_HOME.

Pour notre cas d’étude, nous choisissons de placer ces paramètres directement dans le spfile.
En effet, cela a pour avantage de pouvoir activer TDE uniquement pour notre base, et non pas les autres bases du même ORACLE_HOME avec l’option SQLNET.ORA.

 

SQL> ALTER SYSTEM SET WALLET_ROOT = '/opt/app/oracle/admin/CAPDATADB/wallet' scope=spfile;

System altered.

 

 

 

Redémarrer l’instance pour une prise en compte immédiate du paramètre “WALLET_ROOT‘.

Une fois la base redémarrer, configurer la variable “TDE_CONFIGURATION” qui nous sert à spécifier le type de stockage de la clé.
Dans notre exemple, ce sera un fichier.

 

SQL> ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" scope=both;

System altered.

 

 

 

Vérifier via “show parameters” que ces 2 variables sont prises en compte

 

SQL> show parameters wallet_root

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
wallet_root                          string      /opt/app/oracle/admin/CAPDATADB/wallet


SQL> show parameters tde_configuration

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
tde_configuration                    string      KEYSTORE_CONFIGURATION=FILE

 

 

Création d’un keystore

 

Pour la création de la ‘master key’, Oracle TDE  s’appuie sur le format Public Key Cryptography Standards (PKCS), soit un fichier PKCS#12 sous une extension *.p12.
On se connecte au serveur de bases de données sous notre environnement Oracle 19c Enterprise Edition.

Le répertoire choisi pour le stockage de la ‘master key’ est ainsi géré automatiquement avec d’une part “WALLET_ROOT” et d’autre part le  “TDE_CONFIGURATION“.

Nous pouvons le vérifier sur cette base en interrogeant la vue “v$encryption_wallet”.

SQL> select WRL_TYPE,WRL_PARAMETER,STATUS,WALLET_TYPE,WALLET_ORDER,FULLY_BACKED_UP from v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                                      STATUS                         WALLET_TYPE          WALLET_OR  FULLY_BAC
-------------------- -------------------------------------------------- ------------------------------ -------------------- ---------  ---------
FILE                 /opt/app/oracle/admin/CAPDATADB/wallet/tde/        NOT_AVAILABLE                  UNKNOWN              SINGLE     UNDEFINED

 

Gérer le keystore

 

On crée le keystore en utilisant comme password celui de SYS par exemple

 SQL> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY **********;

keystore altered.

 

On peut voir immédiatement, dans le répertoire représenté par la variable “WALLET_ROOT“, un nouveau répertoire nommé “tde” .

[oracle@ip-172-44-2-141 admin]$ ls -l /opt/app/oracle/admin/CAPDATADB/wallet
total 0
drwxr-x---. 2 oracle dba 25 Mar 13 17:35 tde

 

Dans ce répertoire “tde”, nous avons bien un fichier *.p12  créé.

 

[oracle@ip-172-44-2-141 admin]$ ls -lrt /opt/app/oracle/admin/CAPDATADB/wallet/tde
total 4
-rw-------. 1 oracle dba 2555 Mar 13 17:35 ewallet.p12

 

A partir de la, on peut déclarer notre master key dans la base de données.
La première étape consiste à ouvrir ce nouveau keystore avant de créer la master key.

Celui-ci est pour le moment marquée CLOSED

 

SQL> select WRL_TYPE,WRL_PARAMETER,STATUS,WALLET_TYPE from v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                                      STATUS                         WALLET_TYPE
-------------------- -------------------------------------------------- ------------------------------ --------------------
FILE                 /opt/app/oracle/admin/CAPDATADB/wallet/tde/        CLOSED                         UNKNOWN

 

Nous l’ouvrons via la commande

 

SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY *******;

keystore altered.

 

Le wallet est ouvert, mais notre clé n’est toujours pas présente, « OPEN_NO_MASTER_KEY »

 

SQL> select WRL_TYPE,WRL_PARAMETER,STATUS,WALLET_TYPE from v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                                      STATUS                         WALLET_TYPE
-------------------- -------------------------------------------------- ------------------------------ --------------------
FILE                 /opt/app/oracle/admin/CAPDATADB/wallet/tde/        OPEN_NO_MASTER_KEY             PASSWORD

 

Cette première étape est primordiale pour la mise en place de TDE dans une base de données.

Afin d’éviter d’avoir à faire cette manipulation à chaque redémarrage de la base, nous avons le choix d’utiliser le mode AUTO LOGIN pour le keystore.

TDE utilisera le « Single Sign-On » afin de valider l’ouverture du keystore pour cette base de données.
En outre, un fichier comportant l’extension .SSO sera alors créé à cet effet dans le répertoire

 

SQL> ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE IDENTIFIED BY *********;

keystore altered.

 

Vérifier la présence du fichier sso dans le dossier “tde”

[oracle@ip-172-44-2-141 admin]$ ls -lrt /opt/app/oracle/admin/CAPDATADB/wallet/tde
total 8
-rw-------. 1 oracle dba 2555 Mar 13 17:35 ewallet.p12
-rw-------. 1 oracle dba 2600 Mar 13 17:46 cwallet.sso

 

La master key

 

La master key est stockée dans le keystore préalablement créé.
Une fois ouvert, le keystore peut accueillir la nouvelle ‘master key‘.

 

SQL> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY ***** WITH BACKUP;

keystore altered.

 

Pour valider la creation de la master key, on contrôle les vues « v$encryption_wallet » et « v$encryption_keys ».

La première vue indiquera le status OPEN du keystore, ainsi que le type SINGLE SIGN ON pour ce key store.

SQL> select WRL_TYPE,WRL_PARAMETER,STATUS,WALLET_TYPE,WALLET_ORDER,FULLY_BACKED_UP from v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                                       STATUS                         WALLET_TYPE          WALLET_OR        FULLY_BAC
-------------------- --------------------------------------------------  ------------------------------ -------------------- ---------------- ----------------
FILE                 /opt/app/oracle/admin/CAPDATADB/wallet/tde/         OPEN                           PASSWORD             SINGLE           NO

 

La seconde requête donne les infos sur la master key, son ID, son type et surtout sa date d’activation. On voit ici que la master key est donc active depuis le 13 mars 2024 à 17h49:

 

SQL> select KEY_ID,KEYSTORE_TYPE,CREATOR_DBNAME,ACTIVATION_TIME,KEY_USE,ORIGIN from v$encryption_keys;


KEY_ID KEYSTORE_TYPE
------------------------------------------------------------------------------ -----------------
CREATOR_DBNAME
--------------------------------------------------------------------------------------------------------------------------------
ACTIVATION_TIME                                                             KEY_USE    ORIGIN
--------------------------------------------------------------------------- ---------- -----------------------------------------
AVFKfh8jPk/Rv1rHHavj4rsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA SOFTWARE KEYSTORE
CAPDATADB
13-MAR-24 05.49.58.737772 PM +00:00                                         TDE        LOCAL

 

A noter également que la master key est géré en locale (champs ORIGIN=LOCAL), nous verrons par la suite dans quelle mesure ce champs peut avoir une autre valeur.

 

Cas d’utilisation de TDE

 

Chiffrement d’une colonne

 

Depuis Oracle 10gr2, nous pouvons utiliser Oracle TDE pour chiffrer une colonne (en choisissant l’algo de chiffrement si besoin).

On crée une table pour tester le chiffrement. Nous utilisons l’algorithme AES256.

 

SQL> connect manu
SQL> create table infos_employes (prenom varchar2(40),  nom varchar2(40),
  adresse varchar2(40) encrypt using 'AES256',
  code_postal number(6) encrypt using 'AES256'); 

Table created.

 

SQL> insert into infos_employes values ('Emmanuel','Rami','19 rue Crebillon Nantes','44000');

1 row created.

 

 

Il s’agit ensuite de vérifier les colonnes chiffrées avec leurs algorithmes utilisés. Le check d’intégrité (checksum) est effectué via SHA-1.

 

SQL> select * from dba_encrypted_columns;

OWNER           TABLE_NAME           COLUMN_NAME          ENCRYPTION_ALG                SAL INTEGRITY_AL
--------------- -------------------- -------------------- ----------------------------- --- ------------
MANU            INFOS_EMPLOYES       ADRESSE              AES 256 bits key              YES SHA-1
MANU            INFOS_EMPLOYES       CODE_POSTAL          AES 256 bits key              YES SHA-1

 

 

Il est possible de modifier une table en ajoutant un chiffrement à une colonne,  ajouter une colonne chiffrée ou même déchiffrée une colonne existante.
On peut également changer l’algo de chiffrement sur une colonne.

 

Chiffrement d’un tablespace

 

Depuis la version 11gr1, il est possible d’utiliser TDE sur un tablespace entier. Nous utilisons toujours le même algorihme.

SQL> create tablespace CAPDATA_TBS datafile '/data/oradata/CAPDATADB/capdata_tbs01.dbf' size 100M
  encryption using 'AES256'
  default storage (ENCRYPT);

Tablespace created.

 

La vue “v$encrypted_tablespace” nous confirme la prise en charge de ce tablespace

 

SQL> select T.name,E.ENCRYPTIONALG,E.ENCRYPTEDTS,E.MASTERKEYID,E.BLOCKS_ENCRYPTED,E.BLOCKS_DECRYPTED,E.STATUS 
         from v$tablespace t inner join v$encrypted_tablespaces e on (t.ts# = e.tS#);

NAME                           ENCRYPT ENC MASTERKEYID                      BLOCKS_ENCRYPTED BLOCKS_DECRYPTED STATUS
------------------------------ ------- --- -------------------------------- ---------------- ---------------- ----------
CAPDATA_TBS                    AES256  YES 514A7E1F233E4FD1BF5AC71DABE3E2BB 126              0                NORMAL

 

Comme nous sommes sur un keystore en mode AUTO_LOGIN, un redémarrage de base ne va pas nécessiter une saisie du password du keystore pour l’ouverture.

 

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 2147481648 bytes
Fixed Size 8898608 bytes
Variable Size 436207616 bytes
Database Buffers 1694498816 bytes
Redo Buffers 7876608 bytes
Database mounted.
Database opened.
SQL> select * from manu.infos_employes;

PRENOM                                   NOM                                      ADRESSE                                  CODE_POSTAL
---------------------------------------- ---------------------------------------- ---------------------------------------- -----------
Emmanuel                                 Rami                                     19 rue Crebillon Nantes                  44000

 

Validation du chiffrement et tests de sécurité

 

Prenons l’exemple d’une table non chiffrée, que nous appelons “infos_societe”, dans laquelle nous ajoutons un ligne exemple.

 

SQL> create table infos_societes (nom varchar2(40),
  raison varchar2(40),
  adresse varchar2(40),
  code_postal number(6) ); 

Table created.

SQL> insert into infos_societes values ('Capdata','SA','9 rue de la porte de Buc Versailles','78000');

1 row created.

 

Ici, nous n’utilisons pas de chiffrement. Il nous est donc possible potentiellement d’aller lire la donnée directement dans le block Oracle via un “dump”.

Tout d’abord, on repère le ROW_ID de notre ligne insérée

 

SQL> select rowid from manu.infos_societes where NOM='Capdata';

ROWID
------------------
AAASEqAAHAAAAF0AAA

 

 

Puis on cherche le numéro de block dans lequel notre ligne est écrite.

SQL> select DBMS_ROWID.ROWID_BLOCK_NUMBER('AAASEqAAHAAAAF0AAA') "Block number" from DUAL;

Block number
------------
372

Ainsi que le FILE_ID du tablespace

 

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,EXTENT_ID,FILE_ID from dba_extents where SEGMENT_NAME='INFOS_SOCIETES';

SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME                EXTENT_ID  FILE_ID
-------------------- ------------------ ------------------------------ ---------- ----------
INFOS_SOCIETES       TABLE              USERS                          0          7

 

 

Il nous reste donc à effectuer le dump du block en question

 

 SQL> alter system dump datafile 7 block 372;

System altered.

 

Puis vérifier la trace généré

 

[oracle@ip-172-44-2-141 trace]$ ls -rtl
.....
-rw-r-----. 1 oracle dba 964 Mar 14 16:56 CAPDATADB_ora_3063.trm
-rw-r-----. 1 oracle dba 13073 Mar 14 16:56 CAPDATADB_ora_3063.trc

 

 

Et si l’édite la trace, nous avons les informations lisibles des données de la ligne

 

[bach][oracle@ip-172-44-2-141 trace]$ vi CAPDATADB_ora_3063.trc
.......
Block dump from disk:
buffer tsn: 4 rdba: 0x01c00174 (7/372)
scn: 0x2d6b05 seq: 0x01 flg: 0x06 tail: 0x6b050601
frmt: 0x02 chkval: 0x6336 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F5EAFC45000 to 0x00007F5EAFC47000
7F5EAFC45000 0000A206 01C00174 002D6B05 06010000 [....t....k-.....]
7F5EAFC45010 00006336 00000001 0001212A 002D6B04 [6c......*!...k-.]
7F5EAFC45020 00008000 00320002 01C00170 001A0007 [......2.p.......]
7F5EAFC45030 000003DA 010007DD 003700CA 00002001 [..........7.. ..]
7F5EAFC45040 002D6B05 00000000 00000000 00000000 [.k-.............]
7F5EAFC45050 00000000 00000000 00000000 00000000 [................]
7F5EAFC45060 00000000 00010100 0014FFFF 1F4E1F62 [............b.N.]
7F5EAFC45070 00001F4E 1F620001 00000000 00000000 [N.....b.........]
7F5EAFC45080 00000000 00000000 00000000 00000000 [................]
Repeat 499 times
7F5EAFC46FC0 00000000 012C0000 61430704 74616470 [......,...Capdat]
7F5EAFC46FD0 41530261 72203923 64206575 616C2065 [a.SA#9 rue de la]
7F5EAFC46FE0 726F7020 64206574 75422065 65562063 [ porte de Buc Ve]
7F5EAFC46FF0 69617372 73656C6C 5108C303 6B050601 [rsailles...Q...k]
Block header dump: 0x01c00174
end_of_block_dump
End dump data blocks tsn: 4 file#: 7 minblk 372 maxblk 372[/bash]

 

Reprenons maintenant notre table avec le chiffrement activé à savoir la table “infos_employes”

 

 SQL> select rowid from manu.infos_employes where NOM='Rami';

ROWID
------------------
AAASEcAAHAAAAFsAAA

 

 

Rappelons que les colonnes adresse et code postal sont chiffrées.

 

SQL> select DBMS_ROWID.ROWID_BLOCK_NUMBER('AAASEcAAHAAAAFsAAA') "Block number" from DUAL;

Block number
------------
364

 

 

Le tablespace est le même que la table “infos_societes”. Nous pouvons lancer le dump du block de données.

 

SQL> alter system dump datafile 7 block 364;

System altered.

 

 

Et lors d’une tentative de lecture sur la trace générée

 

 

[oracle@ip-172-44-2-141 trace]$ vi CAPDATADB_ora_3131.trc
.....
Block dump from disk:
buffer tsn: 4 rdba: 0x01c0016c (7/364)
scn: 0x2d5c3b seq: 0x01 flg: 0x06 tail: 0x5c3b0601
frmt: 0x02 chkval: 0xc56d type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007FC2BF1F4000 to 0x00007FC2BF1F6000
7FC2BF1F4000 0000A206 01C0016C 002D5C3B 06010000 [....l...;\-.....]
7FC2BF1F4010 0000C56D 00000001 0001211C 002D5BD0 [m........!...[-.]
7FC2BF1F4020 00008000 00320002 01C00168 00110005 [......2.h.......]
7FC2BF1F4030 0000042C 0100019D 000A014D 00002002 [,.......M.... ..]
7FC2BF1F4040 002D5C3B 00000000 00000000 00000000 [;\-.............]
7FC2BF1F4050 00000000 00000000 00000000 00000000 [................]
7FC2BF1F4060 00000000 00020100 0016FFFF 1E6A1E80 [..............j.]
7FC2BF1F4070 00001E6A 1F0D0002 00001E80 00000000 [j...............]
7FC2BF1F4080 00000000 00000000 00000000 00000000 [................]
Repeat 485 times
7FC2BF1F5F60 8EC02273 4486D297 E07C4F05 9C90F57B [s".....D.O|.{...]
7FC2BF1F5F70 04012C44 6D6D4508 65756E61 6152046C [D,...Emmanuel.Ra]
7FC2BF1F5F80 8844696D 7068CF63 36DD3BAB 98AD8A29 [miD.c.hp.;.6)...]
7FC2BF1F5F90 09A57855 59F7EC5E 18DDCBC6 22B4D7D7 [Ux..^..Y......."]
7FC2BF1F5FA0 46B26F31 45302B6F F053AA6D 81ECCB82 [1o.Fo+0Em.S.....]
7FC2BF1F5FB0 F74A0CC2 5735C61A 58C03130 C2BA128F [..J...5W01.X....]
7FC2BF1F5FC0 6193530D 34C00E2B F231A006 9EB73BA2 [.S.a+..4..1..;..]
7FC2BF1F5FD0 DE7291C6 2B5EBC99 02CEA21C E627E11B [..r...^+......'.]
7FC2BF1F5FE0 0620CDFA 810E446B A5D64062 955C5360 [.. .kD..b@..`S\.]
7FC2BF1F5FF0 0092AA85 8215A721 844747EB 5C3B0601 [....!....GG...;\]
Block header dump: 0x01c0016c
 50 67 87 7b f4 69 c8 de e0 a1 49 ad 7e 2e f6 c6 78 e9 56 09 10 ef 78 bd a0
31 d3 10 ba 21 19 8e a3 fe 4d 6b 0d c8 52 a9 7e a5 08 c1 b2 fd 65 a2 ce 87
03 b1 b9 df 03 58 93 e3 32 2c a6 63 19 47 1e ae ff 52
col 3: [52]
ab d0 54 ec ca 0a 6c 64 d5 42 a9 68 ed 3e cb 53 db 11 33 0b 27 38 9b 08 39
50 de 4e a5 9f 39 ea 86 02 f8 73 22 c0 8e 97 d2 86 44 05 4f 7c e0 7b f5 90
9c 44
end_of_block_dump
End dump data blocks tsn: 4 file#: 7 minblk 364 maxblk 364

 

Nous récupérons le nom et prénom , mais les informations adresse et code postal ne sont pas lisibles directement.

 

Les restrictions

 

Oracle TDE comporte également certaines restrictions, ne pouvant fonctionner sous les conditions suivantes.

Il ne sera pas possible d’utiliser le chiffrage sur une table du schéma SYS, ni même chiffrer une colonne avec des type LONG ou LOB.

Pour les colonnes clés primaires ou clés étrangères, il ne sera pas possible d’utiliser le mécanisme SALT. L’option NO SALT sera alors utiliser. Une erreur sera rencontrée si tel est le cas

 

ORA-28338: cannot encrypt indexed column(s) with salt

 

Pour chaque donnée chiffrée sur une colonne, il faudra prendre en compte le fait que celle-ci utilise 20 bytes de plus en raison de l’utilisation du check d’intégrité (checksum via SHA-1).

 

L’utilisation de Oracle TDE n’est réservé qu’aux index de type balancé (B-TREE), de plus, comme le stockage de la donnée est chiffrée, l’index ne peut trouver de correspondance logique, en outre, il ne sera pas possible d’effectuer du « range scan » dans la clause WHERE d’une opération SQL (pas de WHERE T > 1000).
Seuls les prédicats d’égalité sur une valeur sont possibles (WHERE T=1).

Le seul moyen de faire du range scan sur un index est de chiffré le tablespace et que cet index y soit inclus.

TDE ne gère pas non plus les tablespaces de type transportables.

Pour faire un export des données chiffrées , il est indispensable d’utiliser DataPump en passant alors dans la commande expdp le password de la master key :

 

$ expdp « ‘/ as sysdba’ » DIRECTORY=<DIR>  ENCRYPTION_PASSWORD=*******

 

Attention également aux performances, les benchmarks que l’on peut trouver concernant TDE indiquent en moyenne des valeurs supérieures de 10 à 35% en terme de consommation CPU.

 

Pour aller plus loin …

 

Afin de pouvoir gérer une solution de sécurité globale, Oracle a créé une appliance nommée Oracle Key Vault (OKV).
Cet outil permet de stocker et centraliser des informations relatives à la sécurité d’un parc informatique, celles-ci pouvant correspondre à des wallets mais aussi des keystores java (JKS), des fichiers de type credential ou keystore JCE (java cryptography extension).

 

Oracle Key vault fournit donc une plateforme de sécurité ou l’on peut centraliser un ensemble de stratégies Oracle TDE au sein d’une entreprise.
Cette appliance centralise l’ensemble des wallets des serveurs d’une entreprise.
Les informations de connexions ainsi que les requêtes de cryptage/decryptage transitent via le réseau entre le Oracle Key Vault et les serveurs bases de données.

L’appliance Oracle Key Vault communique avec différents composants.
Ceux-ci pouvant se caractériser par :

  • Des composants Oracle TDE (colonnes ou tablespaces cryptée)
  • Des keystores files , ou JCEKS
  • La management console, qui servira à l’administration de OKV
  • Une appliance backup pour les besoins de sauvegarde de OKV
  • Les wallets de connexion et Java keystores

 

N’hésitez pas à laisser un commentaire.

 

🙂

Continuez votre lecture sur le blog :

twitterlinkedinmail

Emmanuel RAMI

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.