Transparent Data Encryption
Transparent Data Encryption -  TDE is zoals de naam al aangeeft 'transparant'. Dit houdt onder meer in dat de functionaliteit volledig door de database wordt geboden en je bestaande applicaties er niet voor hoeft aan te passen. Bij het openen van de database dien je simpelweg een zogenaamde ‘wallet’ mee te nemen, die het mogelijk maakt om encrypted kolommen te lezen. Cruciaal onderdeel van de beveiliging aan de hand van deze wallet, ook wel sleutel genoemd, is natuurlijk wel om hem op een andere plaats te bewaren dan de backup zelf. Dat lijkt een open deur, maar is het uiteraard beslist niet. - Door Rene Kundersma

10GR2 stelt bankgeheim veilig

Stel: een grote bank heeft alle securityvoorzieningen tot in de puntjes geregeld. Naar aanleiding van verschillende audits is bijvoorbeeld functiescheiding doorgevoerd en zijn vergaande wachtwoord-policies een feit. Op dat moment berusten velen in de gedachte dat het wel in orde is met het veiligstellen van de bankgeheimen. Maar wat nu als er onverhoopt een backuptape 'verdwijnt' uit de tape-robot? Hoe zit het dan met de bedrijfskritische, gevoelige data? Hoeveel zal de schade bedragen, als op tv te zien is dat juist die bank haar particuliere gegevens op straat 'bewaart'? Een vraag die niet langer beantwoord hoeft te worden als het aan Oracle's meest recente database, 10GR2, ligt. De komst van 10GR2 markeert namelijk de introductie van TDE: Transparent Data Encryption.

In dit artikel een kennismaking met de TDE-feature:



10.2.0.0. compatible:



Om de TDE feature te gebruiken, moet je de 'compatible' parameter van de database eerst op 10.2.0.0.0 zetten:


oracle@rac3 ~]$ sqlplus '/as sysdba'
SQL> show parameter compatible
NAME                                 TYPE        VALUE
----------------------------------- ----------- ------------------------------
compatible                           string      10.0.1.2.0
SQL> alter system set COMPATIBLE = "10.2.0.0.0" scope = spfile
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area  301989888 bytes
Fixed Size                  1219088 bytes
Variable Size             272631280 bytes
Database Buffers           25165824 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> show parameter compatible
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      10.2.0.0.0


Geef Wallet locatie op:



Vervolgens voer je de locatie van de te gebruiken wallet in. Hiervoor neem je in het bestand $TNS_ADMIN/sqlnet.ora het volgende op:


ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/home/oracle/my_save_location)))

De wallet zal de zogenaamde 'master' key gaan bevatten.


Start (of restart) hierna de listener:



Na de aanpassing aan het sqlnet.ora bestand dient de listener (her)start te worden:


oracle@rac3 ~]$ lsnrctl start

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 29-SEP-2005 23:05:29
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Starting /u01/app/oracle/product/10.2.0/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production

System parameter file is /u01/app/oracle/product/10.2.0/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac3.golfstroom)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac3.golfstroom)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date                29-SEP-2005 23:05:29
Uptime                    0 days 0 hr. 0 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/10.2.0/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/10.2.0/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac3.golfstroom)(PORT=1521)))
Services Summary...
Service "DB1020" has 1 instance(s).
  Instance "DB1020", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


  

Stel een wachtwoord in voor de wallet:


Nu de database de juiste compatible parameter heeft en sqlnet.ora op de hoogte is van de wallet-locatie kun je het wachtwoord voor het gebruik van de wallet instellen. Het hebben van een wallet, is dus niet genoeg als het wachtwoord onbekend is(!).

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

System altered.

Op dit moment wordt automatisch een wallet bestand ewallet.p12 aangemaakt op de locatie '/home/oracle/my_save_location', de wallet geopend en de master encryption key gemaakt. Volgens AES encryption (Advanced Encryption Standard), op basis van 192bit. Uiteraard is het mogelijk minder bits te gebruiken voor de codering, of een codering als DES in te zetten, maar AES is aan te bevelen.


Aanmaken test tabel:


Om de werking aan te tonen, maken we nu een testtabel waarin een klant staat, met zijn naam, zijn id, zijn ordernummer en: zijn CREDITCARD-nummer.


SQL> conn rk/rk

Connected.

SQL> create table TRANSCATION_INFO
                       (customer_name  varchar2(30),
                        customer_id    varchar2(9),
                        order_id       number(9),
                        credit_card_no varchar2(20) ENCRYPT NO SALT);
       

SQL> desc TRANSCATION_INFO
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUSTOMER_NAME                                      VARCHAR2(30)
 CUSTOMER_ID                                        VARCHAR2(9)
 ORDER_ID                                           NUMBER(9)
 CREDIT_CARD_NO                                     VARCHAR2(20) ENCRYPT

  


Testen insert:



Nu simuleren we een stukje applicatie; er wordt een rij ge-insert, met alle waarden leesbaar (incl. creditcard nummer).


SQL> insert into TRANSCATION_INFO values ('Big Boss','C12',635226,'1234567890');

1 row created.

SQL> commit;



Een query op de nieuwe view USER_ENCRYPTED_COLUMNS ter verificatie levert dan het volgende resultaat op:


SQL> select * from USER_ENCRYPTED_COLUMNS;

TABLE_NAME                     COLUMN_NAME                    ENCRYPTION_ALG                SAL
------------------------------ ------------------------------ ----------------------------- ---
TRANSCATION_INFO               CREDIT_CARD_NO                 AES 192 bits key              NO

 

Alarm:

 

Stel nu, de tapes zijn gestolen, en de database wordt elders gerestored en opnieuw opgestart:

SQL> startup

ORACLE instance started.
Total System Global Area  301989888 bytes
Fixed Size                  1219088 bytes
Variable Size             272631280 bytes
Database Buffers           25165824 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

SQL>
SQL> conn rk/rk
Connected.

SQL> select * from TRANSCATION_INFO;
select * from TRANSCATION_INFO
              *
ERROR at line 1:
ORA-28365: wallet is not open


 

 

Het blijkt dan dat het niet mogelijk is alle kolommen te lezen (waaronder de encrypted), maar nog wel de kolommen die niet encrypted zijn:

SQL> select CUSTOMER_NAME, CUSTOMER_ID, ORDER_ID from TRANSCATION_INFO;

CUSTOMER_NAME                  CUSTOMER_   ORDER_ID
------------------------------ --------- ----------
Big Boss                       C12           635226



Pogingen de wallet te openen en het wachtwoord te raden, mislukken:


SQL> conn / as sysdba

Connected.

SQL> alter system set wallet open identified by "1";
alter system set wallet open identified by "1"
*
ERROR at line 1:
ORA-28353: failed to open wallet


Wachtwoord wel bekend?

 

Ook als de niet bevoegde persoon het wachtwoord wel in zijn bezit heeft, maar de wallet niet, is het niet mogelijk de kolom te querieën. Ten behoeve van het voorbeeld hernoem je het bestand waarin de wallet zit, en bounce je de database:


SQL> !ls -la /home/oracle/my_save_location/

total 12
drwxr-xr-x   2 oracle oinstall 4096 Sep 29 23:22 .
drwx------  18 oracle oinstall 4096 Sep 29 23:05 ..
-rw-------   1 oracle oinstall 1309 Sep 29 23:07 ewallet.p12

SQL> !mv /home/oracle/my_save_location/ewallet.p12 /home/oracle/ my_save_location/ewallet.p12.cannot-find
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area  301989888 bytes
Fixed Size                  1219088 bytes
Variable Size             272631280 bytes
Database Buffers           25165824 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

SQL> conn rk/rk
Connected.
SQL> select * from TRANSCATION_INFO;
select * from TRANSCATION_INFO
              *
ERROR at line 1:
ORA-28365: wallet is not open


  

Tenslotte:

Wanneer je met TDE gaat werken, zijn er nog wel een aantal zaken om op te letten. Zo wordt TDE niet ondersteund bij transported tablespaces. Denk bij RAC-databases verder aan het feit dat de instances de sleutel moeten delen. Datapump ondersteunt TDE, imp/exp niet! En ook direct load utilities werken niet. Op die plaatsen waar TDE vanwege wat voor reden dan ook niet de voorkeur heeft, heb je nog wel de beschikking over andere tools als DBMS_CRYPTO, de opvolger van dbms_obfuscation_toolkit. Maar waarschijnlijk zal je in die gevallen waar het mogelijk is, snel de voorkeur geven aan TDE!
Over TDE zijn nog tal van andere mogelijkheden en interessante wetenswaardigheden te noemen. Degenen die meer willen weten, kan ik 'Oracle Database Advanced Security Administrator's Guide, 10G release2, hoofdstuk 3: Transparent Data Encryption, aanbevelen.


Rene Kunderma
Software Ingenieur, Oracle Certified Master

 

Advertentie

>

Poll

Voorkeur
 

Wie is er aanwezig

We hebben 302 gasten online