در ادامه مطلب “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 شده در سمت دیتاگارد هم بهره گرفت.
سلام مرد مؤمن، عالی بود. خیرت قبول