TABLESPACE ENCRYPTION ORACLE 11G Oracle 11G’nin yeni gelen özelliklerinden biride tablespace seviyesinde encryption yapılabilmesidir.Tabiiki yine bunu yapabilmek için wallet’ın aktif ve açık olması gerekmektedir.Wallet’ın nasıl açılacağına kısaca yine bakarsak, Wallet’I şu şekilde aktive edeceğiz.ilk olarak owm dediğimiz,Oracle wallet manager tool’unu açıp gerekli çalışmayı yapacağız.

Emrah  UYSAL  

www.emrahuysal.com  

1  

 

Şifre olarak Oracle321 giriyorum,istenirse farklı bir şifre girilebilir.

Emrah  UYSAL  

www.emrahuysal.com  

2  

 

Emrah  UYSAL  

www.emrahuysal.com  

3  

 

Emrah  UYSAL  

www.emrahuysal.com  

4  

 

Emrah  UYSAL  

www.emrahuysal.com  

5  

 

Daha sonra sqlnet.ora dosyamıza aşağıdaki bilgileri giriyoruz, ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=$OR ACLE_BASE/admin/WALLET))) ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=$OR ACLE_BASE/admin/EDUCATE/WALLET )))

Emrah  UYSAL  

www.emrahuysal.com  

6  

 

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=$OR ACLE_BASE/admin))) ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u0 1/app11g/oracle/product/11.2.0/db_1/owm/wallets/oracle))) Encryption key’i aktif ediyoruz bunu yapabilmek için şifre olarak Oracle321 girmiştik tekrar o şifreyi deniyoruz. SQL> alter system set encryption key authenticated by "Oracle321"; System altered. Şimdi aşağıdaki komutu kullanarak wallet’ı açmamız gerek ,böylece wallet artık aktif oluyor. [oracle@rac1 ~]$ sqlplus '/as sysdba' SQL> ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "Oracle321"; System altered. Artık encryption kullanarak tablespace ve tablo yaratabiliriz. SQL> CREATE TABLESPACE encrypted_ts DATAFILE '/u01/app/oracle/oradata/EDUCATE/encrypted_ts01.dbf' SIZE 128K AUTOEXTEND ON NEXT 64K ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT); Tablespace created. SQL> ALTER USER test QUOTA UNLIMITED ON encrypted_ts; User altered. DBA_TABLESPACES kullanılarak hangi tablespace’in encrypted hangisinin değil görebiliriz. SQL> SELECT tablespace_name, encrypted FROM dba_tablespaces; TABLESPACE_NAME -----------------------------SYSTEM UNDOTBS1 SYSAUX TEMP USERS UNDOTBS2 EXAMPLE FBDA_TBS FBDA_TBS2 TBSSGA MYTEMP TRANSPORT_TEST_TS_1 TEST_TS TEST_TS2 TEST_TS3 ENCRYPTED_TS

Emrah  UYSAL  

ENC --NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO YES

www.emrahuysal.com  

7  

  Encrypted olmayan bir tablespace’i encrypted hale dönüştüremeyiz.Ancak yeni bir tablespace yaratıp verilerini "ALTER TABLE ... MOVE ..." or "CREATE TABLE ... AS SELECT * FROM ...". yöntemiyle taşıyabiliriz. Örnek olarak yukarıda yarattığımız encrypted tablespace’i kullanan bir tablo / index yaratıp güzel bir test yapabiliriz.Ama unutulmamalıdırki wallet open olmalıdır. SQL> CONN test/test SQL> CREATE TABLE ets_test2 ( id NUMBER(10), data VARCHAR2(50) ) TABLESPACE encrypted_ts; SQL> CREATE INDEX ets_test_idx2 ON ets_test2(data) TABLESPACE encrypted_ts; SQL> INSERT INTO ets_test2 (id, data) VALUES (1, 'This is a secret!'); SQL> COMMIT; Cache te duran bilgilerinde flush yapıyoruzki cache tende erişilme olmasın. [oracle@rac1 ~]$ sqlplus '/as sysdba' SQL> ALTER SYSTEM FLUSH BUFFER_CACHE; Şimdi bu kadar güvenliği aldıktan sonra biri datafile’ı yada ilgili tabloyu içeren export’u herhangi bir hex editörünle açsa bile istediği bilgiye ulaşamıyacaktır. İstenirse tablo’nun kolonları bazındada encryption yapabilmek mümkündür. SQL> CREATE TABLE tde_test ( id NUMBER(10), data VARCHAR2(50) ENCRYPT ) TABLESPACE tde_test; Veri girerkende klasik olarak verilerimizi giriyoruz, SQL> INSERT INTO tde_test (id, data) VALUES (1, 'This is a secret!'); SQL> COMMIT; Performans olarak normal kolon kullanan bir tablo ile encrypted kolon kullanan bir tablo arasındaki farkları görebiliriz.2 adet tablo yaratıp insert durumuna bakalım, SQL> CONN test/test SQL> CREATE TABLE tde_test_1 ( id NUMBER(10), data VARCHAR2(50) ); SQL> CREATE TABLE tde_test_2 ( id NUMBER(10), data VARCHAR2(50) ENCRYPT ); SQL> SET SERVEROUTPUT ON SIZE UNLIMITED

Emrah  UYSAL  

www.emrahuysal.com  

8  

  DECLARE l_loops NUMBER := 1000; l_data VARCHAR2(50); l_start NUMBER; BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE tde_test_1'; EXECUTE IMMEDIATE 'TRUNCATE TABLE tde_test_2'; l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP INSERT INTO tde_test_1 (id, data) VALUES (i, 'Data for ' || i); END LOOP; DBMS_OUTPUT.put_line('Normal Insert l_start));

: ' || (DBMS_UTILITY.get_time -

l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP INSERT INTO tde_test_2 (id, data) VALUES (i, 'Data for ' || i); END LOOP; DBMS_OUTPUT.put_line('Encrypted Insert: ' || (DBMS_UTILITY.get_time l_start)); l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP SELECT data INTO l_data FROM tde_test_1 WHERE id = i; END LOOP; DBMS_OUTPUT.put_line('Normal Query l_start));

: ' || (DBMS_UTILITY.get_time -

l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP SELECT data INTO l_data FROM tde_test_2 WHERE id = i; END LOOP; DBMS_OUTPUT.put_line('Decrypted Query : ' || (DBMS_UTILITY.get_time l_start)); END; / Encrypted Insert: 32 Normal Query : 5 Decrypted Query : 9 PL/SQL procedure successfully completed. Kolon bazında encryption işlemi external tablolarda da kullanılabilir.Bir örnek olarak deneme yapalım. [oracle@rac1 ~]$ sqlplus '/as sysdba' SQL> create or replace directory ext_dir as '/u01/app11g'; SQL> GRANT READ, WRITE ON DIRECTORY ext_dir TO test; SQL> CONN test/test

Emrah  UYSAL  

www.emrahuysal.com  

9  

 

SQL> CREATE TABLE tde_test_1_ext ( id, data ENCRYPT IDENTIFIED BY "myPassword" ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_dir location ('tde_test_1_ext.txt') ) AS SELECT id, data FROM tde_test_1; Tablo oluştumu diye bakacak olursak, [root@rac1 [root@rac1 total 116 drwxr-xr-x drwxrwxrwx drwxr-xr-x drwxr-xr-x drwx-----drwxr-xr-x -rw-r--r--rw-r----[root@rac1

~]# cd /u01/app11g/ app11g]# ls -la 6 oracle 6 oracle 2 oracle 8 oracle 2 oracle 9 oracle 1 oracle 1 oracle app11g]#

oinstall 4096 Oct 7 oinstall 4096 Aug 10 oinstall 4096 Sep 9 oinstall 4096 Aug 18 oinstall 16384 Aug 10 oinstall 4096 Aug 14 oinstall 41 Oct 7 oinstall 73728 Oct 7 vi tde_test_1_ext.txt

15:50 15:38 18:18 2009 15:12 12:02 15:50 15:50

. .. backup database lost+found oracle TDE_TEST_1_EXT_5685.log tde_test_1_ext.txt

Tabloyu vi editörünle açsak bile herhangi birşey göremiyeceğiz. Encrypted kolonlar ile ilgili bilgileri dba_encrypted_columns view’ından görebiliriz. SQL> SQL> SQL> SQL>

SET LINESIZE 100 COLUMN owner FORMAT A15 COLUMN tble_name FORMAT A15 COLUMN column_name FORMAT A15

SQL> SELECT * FROM dba_encrypted_columns; OWNER TABLE_NAME COLUMN_NAME ENCRYPTION_ALG SAL --------------- ------------------------------ ---------------------------TEST SECUREFILE_TAB CLOB_DATA AES 192 bits key YES TEST ENCRYPT_TAB CLOB_DATA AES 192 bits key YES TEST TDE_TEST_1 DATA AES 192 bits key YES TEST TDE_TEST_2 DATA AES 192 bits key YES TEST TDE_TEST_1_EXT DATA AES 192 bits key YES Herhangi bir kolonu encrypted etmek içinde aşağıdaki komutu kullanabiliriz. SQL> ALTER TABLE employees MODIFY (emp_ssn VARCHAR2(9) ENCRYPT); Verilerin export metoduyla aktarımı sırasında hatalar alınabilir.Örneğin Exp tool’u kullanarak bir tablomuzu export etmek istedim, [oracle@rac1 ~]$ exp test/test file=/u01/app11g/en.dmp tables=TDE_TEST Export: Release 11.2.0.1.0 - Production on Thu Oct 7 17:07:52 2010

Emrah  UYSAL  

www.emrahuysal.com  

10  

  Copyright (c) 1982, 2009, Oracle and/or its affiliates. reserved.

All rights

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Export done in US7ASCII character set and AL16UTF16 NCHAR character set server uses WE8ISO8859P9 character set (possible charset conversion) About to export specified tables via Conventional Path ... EXP-00107: Feature (COLUMN ENCRYPTION) of column DATA in table TEST.TDE_TEST is not supported. The table will not be exported. Export terminated successfully with warnings. Görüldüğü gibi verimizi export edemedik,peki bir datapump’I deneyelim. [oracle@rac1 ~]$ expdp test/test dumpfile=dump.dump directory=ext_dir tables=TDE_TEST Export: Release 11.2.0.1.0 - Production on Fri Oct 8 13:49:15 2010 Copyright (c) 1982, 2009, Oracle and/or its affiliates. reserved.

All rights

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Starting "TEST"."SYS_EXPORT_TABLE_01": test/******** dumpfile=dump.dump directory=ext_dir tables=TDE_TEST Estimate in progress using BLOCKS method... Processing object type TABLE_EXPORT/TABLE/TABLE_DATA Total estimation using BLOCKS method: 64 KB Processing object type TABLE_EXPORT/TABLE/TABLE . . exported "TEST"."TDE_TEST" 5.476 KB 1 rows ORA-39173: Encrypted data has been stored unencrypted in dump file set. Master table "TEST"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded *************************************************************************** *** Dump file set for TEST.SYS_EXPORT_TABLE_01 is: /u01/app11g/dump.dump Job "TEST"."SYS_EXPORT_TABLE_01" completed with 1 error(s) at 13:49:21 Data pump ile tablomuzun exportunu alabildik.Şimdi bu alınan export başka bir şemaya atalım.Ama öncelikle bir kullanıcı yaratalım. SQL> create user test2 identified by test2; User created. SQL> grant connect,resource,create table,unlimited tablespace to test2; Grant succeeded. SQL> grant read,write on directory ext_dir to test2; Grant succeeded.

Emrah  UYSAL  

www.emrahuysal.com  

11  

  SQL> exit [oracle@rac1 app11g]$ impdp test2/test2 directory=ext_dir dumpfile=dumpen.dump REMAP_SCHEMA=test:test2 Import: Release 11.2.0.1.0 - Production on Fri Oct 8 14:24:31 2010 Copyright (c) 1982, 2009, Oracle and/or its affiliates. reserved.

All rights

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Master table "TEST2"."SYS_IMPORT_FULL_01" successfully loaded/unloaded Starting "TEST2"."SYS_IMPORT_FULL_01": test2/******** directory=ext_dir dumpfile=dumpen.dump REMAP_SCHEMA=test:test2 Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/TABLE_DATA . . imported "TEST2"."TDE_TEST" 5.484 KB 1 rows Job "TEST2"."SYS_IMPORT_FULL_01" successfully completed at 14:24:36 [oracle@rac1 ~]$ sqlplus '/as sysdba' SQL*Plus: Release 11.2.0.1.0 Production on Fri Oct 8 13:55:19 2010 Copyright (c) 1982, 2009, Oracle.

All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> conn test2/test2 Connected. SQL> select * from TDE_TEST; ID DATA ---------- -------------------------------------------------1 This is a secret! Görüldüğü gibi datamızı başarılı olarak import edebildik.Eğer bu dosyayı farklı bir veritabanına atmak isteseydik atamıycak ve hata alacaktık wallet nedeniyle.Ama export alırken datanın encrypted olarak kesin olarak alınmasını istiyorsak hem export hemde import syntax’ına ENCRYPTION_PASSWORD parametresini koymalıyız.Örneğin [oracle@rac1 app11g]$ expdp test/test dumpfile=dumpen2.dump directory=ext_dir tables=TDE_TEST ENCRYPTION_PASSWORD=Oracle321

 

Emrah  UYSAL  

www.emrahuysal.com  

12