TDE در اوراکل نسخه 12c

در ادامه مطلب “Transparent Data Encryption در اوراکل 11g، قصد داریم تغییرات وهمچنین نحوه پیاده سازی این قابلیت را در اوراکل نسخه 12c مورد بررسی قرار دهیم.

توجه! در نسخه 12c، معمولا از عبارت keystore به جای wallet استفاده می شود.

ایجاد و مدیریت keystore

در این قسمت، در طی چند مرحله، نحوه ایجاد و آماده سازی keystore(یا همان wallet) را مورد بررسی قرار خواهیم داد.

مرحله اول: در اولین مرحله، keystore را ایجاد می کنیم:

فرم کلی:

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE ‘keystore_location’ IDENTIFIED BY software_keystore_password;

مثال:

SQL> administer key management create keystore ‘+DATA/wallet’ identified by “pass_usef” ;

keystore altered

توجه:فایل sqlnet.ora مطابق آنچه که در مطلب “Transparent Data Encryption در اوراکل 11g، بیان شده بود، تنظیم شده است:

vi /oracle/12c/network/admin/sqlnet.ora

ENCRYPTION_WALLET_LOCATION =(SOURCE=(METHOD=file)(METHOD_DAT
A= (DIRECTORY= +DATA/wallet )))

نکته 1: برای ایجاد keystore، باید مجوز ADMINISTER KEY MANAGEMENT و یا SYSKM را دارا بود و ضمنا دستور ایجاد oracle wallet در این نسخه به صورت زیر می باشد:

نکته 2: در container database، باید keystore را در CDB$ROOT ایجاد کرد و از آنجا، بین همه pdbها به اشتراک گذاشت.

مرحله دوم: در صورتی که keystore به صورت AUTO_LOGIN ایجاد نشده باشد، باید با هر بار راه اندازی مجدد بانک، به صورت دستی در وضیعت open قرار بگیرد:

SQL>  ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY  “pass_usef”;

keystore altered.

البته برای فعال کردن ویژگی AUTO_LOGIN، می توان از دستور زیر استفاده کرد:

SQL> ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE ‘+DATA/wallet’ IDENTIFIED BY “pass_usef”;

keystore altered.

بعد از اجرای این دستور، فایلی با عنوان cwallet.sso ایجاد خواهد شد و فیلد WALLET_TYPE در ویوی v$encryption_wallet برابر با AUTO LOGIN خواهد شد.

برای مشاهده وضیعت و مسیر فعلی wallet، می توان از ویوی V$ENCRYPTION_WALLET استفاده کرد که اگر مقدار فیلد status ان برابر با NOT_AVAILABLE باشد، به معنی ان است که wallet در این مسیر ایجاد نشده است.

col WRL_PARAMETER format a40

col STATUS  format a10

col  WALLET_TYPE format a10

select WRL_PARAMETER,STATUS,WALLET_TYPE  from v$encryption_wallet;

WRL_PARAMETER                            STATUS     WALLET_TYP

—————————————- ———- ———-

+DATA/wallet/                            OPEN       PASSWORD

نکته: دستور زیر در محیط container database، سبب خواهد شد تا keystore برای همه pdbها باز و قابل استفاده باشد(عبارت container=all):

SQL> ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY  IDENTIFIED BY pass_usef WITH BACKUPcontainer=all;

keystore altered.

مرحله سوم: تا این مرحله، فایل keystore ایجاد شده و در حالت open قرار گرفته است ولی هنوز master key در ان موجود نیست و برای ایجاد و فعال نمودن master key دستور زیر را وارد می کنیم:

شکل کلی:

ADMINISTER KEY MANAGEMENT SET KEY [USING TAG ‘tag’] IDENTIFIED BY password [WITH BACKUP [USING ‘backup_identifier’]] [CONTAINER = ALL | CURRENT];

مثال:

SQL>administer key management set key  identified by pass_usef with backup ;

برای مشاهده encrypt key ایجاد شده، می توان از ویوی v$encryption_keys استفاده کرد:

select key_id from v$encryption_keys;

Aft2vgHukE/Mvy2S3fBTS3EAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

در محیط CDB، نیاز است تا این دستور صرفا در cdb$root اجرا شود:

SQL> ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY  IDENTIFIED BY pass_usef WITH BACKUP container=all;

با این دستور، وضیعت keystore در pdbها هم به صورت open در خواهد امد و قابلیت TDE در تمامی pdbها قابل استفاده می باشد:

sqlplus “sys/sys@pdb as sysdba”

SET LINESIZE 200

COLUMN wrl_parameter FORMAT A20

SELECT * FROM v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER        STATUS          WALLET_TYPE  WALLET_OR FULLY_BAC     CON_ID

——————– ——————– —————————— ——————– ———                        ———  ———-

ASM                                       OPEN                           PASSWORD             SINGLE                                         NO         3

همچنین دستور زیر، کلیدهای مربوط به pdbهای مختلف را نمایش می دهد:

SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID

———- ————————————————————

         1 AYcr27IIV09Ov8pZCde2H9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

         3 AQ8EkCxifk8Kv788OBUljEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

توجه!: در صورت مواجه با خطای ORA-28374 می توان از پارامتر مخفی زیر استفاده نمود:

SQL> alter system set  “_db_discard_lost_masterkey”=true;

نکته 1: برای تغییر پسورد keystore می توان از دستور زیر استفاده کرد:

SQL>ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD IDENTIFIED BY “pass_usef” set “pass_usef2” WITH BACKUP ;

نکته 2: بستن keystore با دستور زیر قابل انجام می باشد:

ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY “pass_usef”;

نکته 3: برای تهیه بکاپ هم دستور زیر مفید می باشد:

ADMINISTER KEY MANAGEMENT BACKUP KEYSTORE USING ‘bkp_keystore’ IDENTIFIED BY “pass_usef” to ‘/oracle’;

نکته 4: برای rekey کردن keystore، باید از دستور زیر کمک گرفت:

ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY  IDENTIFIED BY pass_usef WITH BACKUP;

رمزنگاری انلاین tablespaceها

با ارائه اوراکل نسخه 12c، قابلیت جدیدی در زمینه TDE ارائه شد که بر اساس آن، می توان بصورت انلاین tablespaceها را به حالت encrypt منتقل کرد.

این کار به سادگی و با کمک دستور زیر قابل انجام می باشد(به صورت انلاین):

SQL> alter tablespace non_tde encryption online using ‘aes192’ encrypt;

Tablespace altered.

پس از اجرای این دستور، خواهیم دید که دیتافایلهای جدیدdی ایجاد خواهند شد و اطلاعات از دیتافایل قبلی به این دیتافایلها منتقل می شوند البته نه به صورت clear text!!!

[root@hkm4 ~]#  strings /oracle/oradata/DB12/datafile/o1_mf_non_tde_f56nor3o_.dbf|grep USEF

[root@hkm4 ~]#

نکته: در اوراکل 12c می توان در سطح tablespace، هم rekey را انجام داد در صورتی که این قابلیت در اوراکل 11g وجود نداشت:

alter tablespace non_tde encryption online using ‘aes192’ REKEY;

رمزنگاری انلاین system tablespaceها

از دیگر ویژگی اوراکل 12c در زمینه TDE، امکان رمزنگاری انلاین tablespaceهای سیستمی ای چون system، sysaux و undo می باشد.

دستور زیر، به صورت انلاین system tbs را به حالت encrypt در خواهد اورد:

SQL> alter tablespace SYSTEM ENCRYPTION ONLINE ENCRYPT;

Tablespace altered.

با رجوع به alert log مربوط به این دیتابیس، اطلاعات بیشتری را در مورد عملیات انجام شده بدست خواهیم آورد:

2018-01-08T16:30:55.918958+03:30

alter tablespace system  ENCRYPTION ONLINE encrypt

2018-01-08T16:30:55.920447+03:30

About to encrypt tablespace SYSTEM (tsn 0/0)

Rekeying datafile /oracle/oradata/DB12/datafile/o1_mf_system_f56tv3p5_.dbf (1) to /oracle/oradata/DB12/datafile/o1_mf_system_%u_.dbf

2018-01-08T16:31:04.175714+03:30

Rekey operation committed for file /oracle/oradata/DB12/datafile/o1_mf_system_f56tw7xg_.dbf

2018-01-08T16:31:06.181181+03:30

About to zero out original file “/oracle/oradata/DB12/datafile/o1_mf_system_f56tv3p5_.dbf”

2018-01-08T16:31:08.685585+03:30

Successfully zero’ed out original file “/oracle/oradata/DB12/datafile/o1_mf_system_f56tv3p5_.dbf”

Successfully deleted original file “/oracle/oradata/DB12/datafile/o1_mf_system_f56tv3p5_.dbf”

Completed rekey for tablespace SYSTEM (tsn 0/0) from key version 3 to 4.

Completed: alter tablespace system  ENCRYPTION ONLINE encrypt

همچنین می توان SYSAUX و UNDO را نیز با دستور alter tablespace به صورت انلاین!!! encrypt کرد:

SQL> alter tablespace SYSAUX ENCRYPTION ONLINE ENCRYPT;

Tablespace altered.

SQL> alter tablespace UNDOTBS1 ENCRYPTION ONLINE ENCRYPT;

Tablespace altered.

البته این قاعده برای temp tablespaceها مستثنی می باشد و برای encrypt کردن ان باید، ابتدا ان را حذف کرد و مجددا ایجاد نمود.

توجه، توجه!!! درصورتی که ویژگی encryption را برای هر یک از tablespaceهای سیستمی فعال کرده باشیم، دست به کار بسیار خطرناکی زده ایم زیرا که ممکن است با هرگونه ایجاد اختلال در فایل keystore، ادامه حیات بانک به مخاظره بیفتد.

برای انجام یک تست، ابتدا فایل wallet را تغییر نام می دهیم و سپس بانک را راه اندازی مجدد می کنیم:

mv /oracle/12c/network/admin/wallet  /oracle/12c/network/admin/wallet2

SQL> startup force;

ORACLE instance started.

Total System Global Area 3791650816 bytes

Fixed Size                  8627488 bytes

Variable Size             939526880 bytes

Database Buffers         2835349504 bytes

Redo Buffers                8146944 bytes

Database mounted.

ORA-28365: wallet is not open

همانطور که می بینید، بانک با خطای ORA-28365 متوقف شده و امکان باز شدن ان بدون فایل wallet ممکن نخواهد بود. همچنین در فایل alert، خطای مربوطه قابل مشاهده می باشد:

tail -f /oracle/diag/rdbms/db12/db12/trace/alert_db12.log

Slave encountered ORA-10388 exception during crash recovery

2018-01-08T16:17:14.762059+03:30

Aborting crash recovery due to error 28365

2018-01-08T16:17:14.762266+03:30

Errors in file /oracle/diag/rdbms/db12/db12/trace/db12_ora_32043.trc:

ORA-28365: wallet is not open

2018-01-08T16:17:14.762966+03:30

Errors in file /oracle/diag/rdbms/db12/db12/trace/db12_ora_32043.trc:

ORA-28365: wallet is not open

ORA-28365 signalled during: ALTER DATABASE OPEN…

نتیجه انکه، باید در تهیه بکاپ از فایل keystore بسیار وسواس به خرج داد! هر چند برای رمزنگاری system tbsها توجیه چندانی وجود ندارد!!!

keystore و data guard

انتقال keystore به محیط دیتاگارد، برای دیتابیسی که از فضای ASM برای ذخیره سازی keystore استفاده می کند نیاز به ملاحضاتی دارد که در این قسمت توضیح داده خواهد شد.

ابتدا در بانک اصلی با کمک دستور orapki یک فایل keystore موقت و فاقد محتوا را ایجاد می کنیم:

orapki wallet create -wallet /oracle/

Oracle PKI Tool : Version 12.2.0.1.0

Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

Enter password:  

Enter password again:  

Operation is successfully completed.

سپس با دستور زیر، این فایل را با keystore مربوط به بانک اصلی ادغام می کنیم تا محتوای keystore اصلی بانک، در این keystore موقت قرار بگیرد:

SQL>administer key management merge keystore ‘+DATA/wallet/’ identified by “pass_usef” INTO existing keystore ‘/oracle/’ identified by “pass_usef” with backup;

keystore altered.

برای مشاهده لیست کلیدهای موجود در keystore، می توان از دستور زیر استفاده کرد:

orapki wallet display -wallet /oracle/ewallet.p12

Oracle PKI Tool : Version 12.2.0.1.0

Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

Enter wallet password:  

Requested Certificates:

User Certificates:

Oracle Secret Store entries:

ORACLE.SECURITY.DB.ENCRYPTION.AQ8EkCxifk8Kv788OBUljEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

ORACLE.SECURITY.DB.ENCRYPTION.AYcr27IIV09Ov8pZCde2H9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY

ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY.62540D8EB366704FE0530488200A04D0

ORACLE.SECURITY.ID.ENCRYPTION.

ORACLE.SECURITY.KB.ENCRYPTION.

ORACLE.SECURITY.KM.ENCRYPTION.AQ8EkCxifk8Kv788OBUljEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

ORACLE.SECURITY.KM.ENCRYPTION.AYcr27IIV09Ov8pZCde2H9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Trusted Certificates:

این فایل را به سرور stb منتقل می کنیم و سپس با اتصال به دیتاگارد، walletای را ایجاد می کنیم:

SQL> administer key management create keystore ‘+DATA/stbwallet’ identified by “pass_usef” ;

keystore altered.

وضیعت این keystore را در حالت open قرار می دهیم:

SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY  “pass_usef” container=all;

keystore altered.

در نهایت، فایلی را که از طریق ادغام با keystore موجود در بانک اصلی ایجاد شده بود را با keystore تازه ساخته شده در دیتاگارد ادغام می کنیم:

SQL> administer key management merge keystore ‘/oracle’ identified by “pass_usef” INTO existing keystore ‘+DATA/stbwallet’ identified by “pass_usef” with backup;

keystore altered.

با انجام این مراحل، می توان از داده های encrypt شده در سمت دیتاگارد هم بهره گرفت.

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

Comments (2)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.