2022年10月7日 星期五

9. Golden Gate 壓縮與加密

Golden Gate 的 Trail File 在傳輸的過程當中可以使用 Compress 選項,目的是減少 Trail File 傳輸所消耗的網路頻寬。設定上只需要在 Pump 參數檔中的 RMTHOST 加上 compress 即可 :

EXTRACT PUMP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")

RMTHOST 192.168.49.20 , MGRPORT 7809, COMPRESS, COMPRESSTHRESHOLD 500

RMTTRAIL ./dirdat/R1

PASSTHRU


TABLE HR.*;


COMPRESSTHRESHOLD 表示壓縮的最小 Block Size ,單位為 bytes ,預設為 1000 。


OGG 的加密可以分為傳輸的加密 、 Trail File 加密 ,以及密碼加密三種。


  • 傳輸加密 (Message Encryption) 

在設定加密前必須先建立 Encryption Key ,在 Source 端的 OGG Home 目錄下執行 keygen 產生 Key :

$ ./keygen 128 3

0xA100BF1FDAFE440C0D410901341B7D58


0x28677E0C59BA41177B0F5B23B8C11335


0xAECD3D79D8753E22E9DDAC453C68AA11


keygen 128 3 表示產生三組 key ,長度為 128 bit ,最大可設定到 256 bit 。


產生出 Key 之後,於 OGG HOME 目錄下建立名為 ENCKEYS 的檔案,內容為上列三組 Key ,然後替每一組 Key 設定一個名稱,寫在前面 :

vi ENCKEYS

--------------

key1 0xA100BF1FDAFE440C0D410901341B7D58

key2 0x28677E0C59BA41177B0F5B23B8C11335

key3 0xAECD3D79D8753E22E9DDAC453C68AA11


編輯完成後將 ENCKEYS 複製到 Target 端的 OGG Home 底下 :

$ scp ENCKEYS 192.168.49.20:$GG_HOME


在 Source 端的 Pump 參數加入 ENCRYPT 設定進行傳輸的加密 :

EXTRACT PUMP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")

RMTHOST 192.168.49.20 , MGRPORT 7809, ENCRYPT AES128,KEYNAME key2

RMTTRAIL ./dirdat/R1

PASSTHRU


TABLE HR.*;


由於我們產生的 Key 是 128 bit 長度,所以 ENCRYPT 設定為 AES128 ,有三組 Key ,這邊使用的是第二組 (KEYNAME key2) 。


Source 的傳輸使用了加密,所以在 Target 端必須進行解密,在 Target 端設定一組 Static Collector 進行解密,在 Target 端的 OGG HOME 目錄底下執行 server 進行設定 :

$ ./server -p 2000 -ENCRYPT AES128 -KEYNAME key2


-p 使用的是 port 2000 ; -ENCRYPT 以 AES128 解密 ; -KEYNAME 使用第二組 Key key2 。


至此完成 Message Encryption 。


  • Trail File 加密 (Trail Encryption) 

Trail File 的加密只需要在 Source 使用 EncryptTrail 參數以及在 Target 使用 DecryptTrail 解密即可。在此之前同樣的需要使用 keygen 產生 key ,然後將 ENCKEYS 複製到 Target 端,於 Extract 使用 EncryptTrail 參數如下 :

EXTRACT EXT1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")


USERID ogg, PASSWORD ogg

EncryptTrail AES128 ,keyname key1

EXTTRAIL ./dirdat/E1

DISCARDFILE ./dirrpt/ext1.dsc, PURGE, MEGABYTES 100


TABLE HR.*;


EncryptTrail 以 AES128 加密,使用第一組 key key1 。


到了 Target 端,於 Replicate 參數檔裡面使用 DecryptTrail 進行解密 :

REPLICAT REP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")

USERID ogg, PASSWORD ogg

DecryptTrail AES128 ,keyname key1

ASSUMETARGETDEFS 

APPLYNOOPUPDATES

DISCARDFILE ./dirrpt/REP1.dsc, MEGABYTES 10, PURGE


MAP HR.*, TARGET HR.*;


同樣使用第一組 key 進行 AES128 解密。


至此完成 Trail File Encryption 。


到了 OGG 12c 之後,可以使用 Wallet 來管理 Key ,取代原本使用 ENCKEYS 這個檔案的方式,於 GGSCI 當中使用 create wallet 來建立 wallet :

GGSCI> create wallet


預設建立 wallet 會於 OGG Home 目錄底下產生 dirwlt 目錄,再來就可以建立 Key :

GGSCI> open wallet

GGSCI> add masterkey

GGSCI> info masterkey all


添加 masterkey 之後,於 dirwlt 底下會產生 cwallet.sso 檔案,然後同樣的把 dirwlt 複製到 Target 端,後續加密的動作與之前相同。


  • 密碼加密 (Password Encryption) 

在未做任何密碼加密的情況下, OGG 參數檔設定的 OGG 使用者名稱與密碼都是明碼,由於 OGG 使用者的權限很大,萬一參數檔不小心外流,那麼對資料庫的安全將是一個很大的威脅,因此設定在參數檔裡面的密碼需要進行加密的動作。傳統密碼加密的做法仍然是使用 ENCKEYS 這個檔案來設定 key ,然後於 GGSCI 裡面產生加密過後的密碼,在此沿用上述 ENCKEYS 的設定,例如加密 welcome1 這個密碼 :

GGSCI> encrypt password welcome1 AES128 ENCRYPTKEY key1

Encrypted password:  AACAAAAAAAAAAAIAJFGBNEYGTGSBSHVB


然後將此加密過的密碼設定到參數檔裡面即可 :

EXTRACT EXT1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")


USERID ogg, PASSWORD AACAAAAAAAAAAAIAJFGBNEYGTGSBSHVB, AES128, ENCRYPTKEY key1

EXTTRAIL ./dirdat/E1

DISCARDFILE ./dirrpt/ext1.dsc, PURGE, MEGABYTES 100


TABLE HR.*;


在 OGG 12c 之後,使用的是 CredentialStore 來保護 OGG 的帳號與密碼, CredentialStore 的概念是為真正的帳號密碼建立一個別名 (alias) ,之後登入使用的是這個別名而不是真正的帳號密碼,而 CredentialStore 只能透過 GGSCI 來登入,即便知道 CredentialStore 的別名 (alias) 也不知真正登入到 DB 的帳號密碼,以此達到帳號安全性的目的。例如於 CredentialStore 新增一個別名 (alias) 為 ggalias :

GGSCI> create wallet

GGSCI> add credentialstore

GGSCI> alter credentialstore add user ggadmin password welcome1 alias ggalias

GGSCI> info credentialstore


CredentialStore 的 user 可以包含連線所需的 tnsnames ,例如 :

GGSCI> alter credentialstore add user ggadmin@orcl password welcome1 alias ggalias


之後 GGSCI 使用的是 useridalias 來登入,而非之前的 userid ,由於帳號密碼已經設定於 alias ,所以 useridalias 只要輸入 alias 的名稱就可以登入 DB 了 :

GGSCI> dblogin useridalias ggalias


同樣的於參數檔中使用的也是 useridalias :

EXTRACT EXT1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")


USERIDALIAS ggalias

EXTTRAIL ./dirdat/E1

DISCARDFILE ./dirrpt/ext1.dsc, PURGE, MEGABYTES 100


TABLE HR.*;


透過 useridalias 來設定, OGG 的使用者名稱與密碼在參數檔中便不會被揭露,安全性比起單純的密碼加密又更高了。


沒有留言:

張貼留言