GoldenGate的安全配置
在實施GoldenGate的時候,安全這一項往往是被忽視的。但是作為一個完整啟動並執行GoldenGate系統,基本的安全設定還是很有必要的,比如口令的加密。GoldenGate的安全選項主要有以下5個方面:
? 口令加密(Password Encryption)
? Trail檔案加密(Trail File Encryption)
? 網路傳輸加密(TCP/IP Encryption)
? 命令驗證(Command Authentication)
? 可信任連接(Trusted Connection)
這裡先來談談前3個安全選項。其餘兩項會在以後的專題中進行討論。
口令加密、Trail檔案加密以及網路傳輸加密都支援AES-128、AES-192和AES-256密碼編譯演算法,口令加密和網路傳輸加密還支援Blowfish密碼編譯演算法,Trail檔案加密還支援位元組替換加密。
口令加密
口令加密指的對資料庫帳號的口令進行加密,這樣資料庫帳號的口令在設定檔中就不會以明文的方式出現了,從而保證了帳號的安全。因為通常分配給GoldenGate使用的帳號都具有很大的許可權,因而對其進行保護也是很有必要的。在進行口令加密前,需要先產生密鑰檔案。實際上這一步不是必須的。可以使用GoldenGate預設的的密鑰來進行加密,但是使用預設的密鑰有很多限制:
1、只能使用Blowfish進行加密。
2、Trail檔案加密只能使用位元組替換。
3、網路傳輸加密不能使用
所以通常情況下還是需要自己產生密鑰檔案。產生密鑰檔案需要兩個步驟:
1、使用keygen工具產生密鑰。
2、在GoldenGate的安裝目錄建一個名為ENCKEYS的檔案,將上述產生的金鑰儲存區在檔案中。
具體操作如下:
# 產生密鑰,128表示的是產生的密鑰長度為128位,3表示產生3個密鑰 [ggate@ogg_s current]$ ./keygen 128 3 0x345CEB2DA213DC2F75B0514484FCAB42 0xD8A1B350AF392A75C52EE540B169B267 0x7CE77B73BD5F783A15AD783DDFD6B80C # 將金鑰儲存區到檔案中,一行一個密鑰 [ggate@ogg_s current]$ cat ENCKEYS ## Key-name Key-value PASSWDKEY 0x345CEB2DA213DC2F75B0514484FCAB42 TRAILKEY 0xD8A1B350AF392A75C52EE540B169B267 TCPIPKEY 0x7CE77B73BD5F783A15AD783DDFD6B80C |
配置好密鑰檔案後,我們就可以對資料庫帳號的口令進行加密了。
GGSCI (ogg_s) 1> ENCRYPT PASSWORD OGG123 ENCRYPTKEY PASSWDKEY Encrypted password: AADAAAAAAAAAAAGASBQGIAYGCFRCWELGFJMHBHHDOHWDWGRBBCKCYFSGGJTEJFFJUBQFKESGNAVBRDTF Algorithm used: AES128 |
操作是需要在GGSCI控制台下進行的,PASSWDKEY就是我們剛才配置的密鑰名。可以看到這裡使用的預設的密碼編譯演算法是AES-128。如果使用GoldenGate預設的密鑰時,密碼編譯演算法就會是Blowfish:
GGSCI (ogg_s) 2> ENCRYPT PASSWORD OGG123 ENCRYPTKEY DEFAULT Using default key... Encrypted password: AACAAAAAAAAAAAGACARARDMENDJHIIFG Algorithm used: BLOWFISH |
我們可以嘗試DBLOGIN來驗證加過密的口令是否能正常使用:
GGSCI (ogg_s) 3> DBLOGIN USERID OGG, PASSWORD AADAAAAAAAAAAAGASBQGIAYGCFRCWELGFJMHBHHDOHWDWGRBBCKCYFSGGJTEJFFJUBQFKESGNAVBRDTF, ENCRYPTKEY PASSWDKEY Successfully logged into database. |
OGG帳號成功串連資料庫了,說明加過密的口令是能正常工作。接下來就是要修改Extract或Replicat的設定檔了。修改也很簡單,就是將USERID這一行的內容修改下就可以了:
... SETENV (Oracle_HOME=/u01/app/oracle/product/11.2.0/db_1) SETENV (ORACLE_SID=ggtest) --USERID OGG, PASSWORD OGG123 USERID OGG, PASSWORD AADAAAAAAAAAAAGASBQGIAYGCFRCWELGFJMHBHHDOHWDWGRBBCKCYFSGGJTEJFFJUBQFKESGNAVBRDTF, ENCRYPTKEY PASSWDKEY EXTTRAIL /data/ggate/dirext/ggtest/ea ... |
然後將Extract獲Replicat進程起來能正常工作就表示完成口令加密的配置了。
Trail檔案加密
Trail檔案加密,就是將Extract進程解析出來的資料以加密的形式存放在trail檔案中(注意不是對整個trail檔案進行加密)。不加密的時候資料是以明文的形式存放在trail檔案中的(這不是廢話麼,呵呵)。開啟trail檔案就可以觀察到資料:
或者用logdump工具可以更方便的觀察到資料:
如果是加過密的,那資料就是一團亂碼了:
即使用logdump工具,也是只能觀察到亂碼的資料:
這樣資料的安全性就有了很好的保障。Trail檔案加密適合對資料安全性要求比較高的情形。Trail檔案加密的使用模式主要有以下兩種:
使用模式1:
使用模式2:
這兩者的區別在於,模式1的trail在Extract進程加密後,Pump進程不做任何處理,直接將加密過的資料傳送給目標,目標經過解密後將資料應用到目標庫。這種模式適合Pump進程只是做傳輸,而不需要進行如資料過濾、轉換等操作的情形。模式2的trail在Extract進程加密後,Pump進程先對trail進行解密,然後又重新加密,再將重新加密後的資料傳送給目標,目標經過解密後將資料應用到目標庫。這種模式適合Pump進程需要先對資料進行如過濾、轉換等操作的情形。
配置Trail檔案加密也是非常容易,首先還是產生密鑰檔案(見口令加密一節中關於密鑰檔案的內容)。然後修改Extract和Replicat的配置:
# Extract進程設定檔中增加ENCRYPTTRAIL內容 ... SETENV (ORACLE_SID=ggtest) USERID OGG, PASSWORD AADAAAAAAAAAAAGASBQGIAYGCFRCWELGFJMHBHHDOHWDWGRBBCKCYFSGGJTEJFFJUBQFKESGNAVBRDTF, ENCRYPTKEY PASSWDKEY ENCRYPTTRAIL AES128 KEYNAME TRAILKEY EXTTRAIL /data/ggate/dirext/jet2/ea DISCARDFILE /u01/app/oracle/product/ggate/current/dirrpt/EJET2.dsc, APPEND, MEGABYTES 500 FETCHOPTIONS FETCHPKUPDATECOLS ... |
需要注意的是ENCRYPTTRAIL的位置必須要在EXTTRAIL之前。如果把ENCRYPTTRAIL配置在EXTTRAIL之後,那麼Extract進程也能正常工作,只是沒起到加密作用。
# Replicat進程設定檔中增加DECRYPTTRAIL內容 ... SHOWSYNTAX DYNSQL DBOPTIONS DEFERREFCONST DECRYPTTRAIL AES128 KEYNAME TRAILKEY MAP JET2.*, TARGET JET2.*; ... |
這裡需要將密鑰檔案傳送到目標庫上。這裡是模式1的使用情形。如果是模式2,還需要配置Pump進程:
... DECRYPTTRAIL AES128 KEYNAME TRAILKEY RMTHOST ogg_t, MGRPORT 7809 ENCRYPTTRAIL AES128 KEYNAME TRAILKEY RMTTRAIL /data/ggate/dirrep/jet2/at ... |
這裡DECRYPTTRAIL使用的密鑰必須是Extract使用的密鑰,即TRAILKEY,而再次加密時ENCRYPTTRAIL可以使用另一個密鑰,當然也可以使用同一個密鑰。但是需要注意的是如果使用了另一個密鑰,那麼目標的Replicat進程也要使用這個密鑰。
網路傳輸加密
網路傳輸加密,顧名思義就是Pump進程在傳送時將資料進行加密,目標端再接收資料進行解密。這個和Trail檔案加密模式2的區別是在網路傳輸加密方案中,trail是沒有進行過加密的,加密發生在傳輸過程中,MGR進程在接收到資料後對資料進行解密,然後寫入到trail中。所以目標的trail也是未加密的,Replicat進程不需要配置解密選項。當然我覺得將Trail檔案加密和網路傳輸加密結合在一起使用,應該也是可以的。網路傳輸加密適合跨機房的傳輸,比如做災備時,資料從機房A傳送到機房B,期間肯定得經過公網,那資料轉送這時候就是不安全的,通過該方案就能保證資料轉送的安全性,即使沒有使用專線的情況下,安全強度也還是可以接受的。
要配置網路傳輸加密非常簡單,只需要對Pump進程進行配置修改:
... USERID OGG, PASSWORD AADAAAAAAAAAAAGASBQGIAYGCFRCWELGFJMHBHHDOHWDWGRBBCKCYFSGGJTEJFFJUBQFKESGNAVBRDTF, ENCRYPTKEY PASSWDKEY RMTHOST ogg_t, MGRPORT 7809, ENCRYPT AES128 KEYNAME TCPIPKEY RMTTRAIL /data/ggate/dirrep/jet1/at ... |
如果是Passive Extract的需要使用RMTHOSTOPTIONS進行配置,這個在以後的專題中進行討論。這裡需要注意的是資料庫帳號的配置是不能少的,這是和通常的Pump配置不同的地方。不然Pump進程不能正常起來,會報類似以下的錯誤:
ERROR OGG-01453 Oracle GoldenGate Capture for Oracle, pjet1.prm: Database login information not specified in parameter file. |
GoldenGate更新丟失問題
GoldenGate單向表DML同步
Oracle GoldenGate 系列:Extract 進程的恢複原理
Oracle GoldenGate安裝配置
Oracle goldengate的OGG-01004 OGG-1296錯誤
Oracle GoldenGate快速入門教程:基本概念和配置
搭建一個Oracle到Oracle的GoldenGate雙向複製環境