前些天,同事问我DBLINK传输能不能加密,我当时可能是在喝酒,张嘴就回了说不行。后来想想,其实可以通过SQLnet的传输加密来做。比较简单。
本次测试为对比测试,加密前后各抓一个包,用wireshark打开看数据是否被加密。
源库和目标库信息如下:
DBNAME | IP ADDR | VERSION |
remotepdb1 | 10.10.133.64 | 19.3 |
ora19pdb1 | 10.10.133.63 | 19.3 |
ora19pdb1通过DBLINK连到remotepdb1的HR用户:
1 2 3 4 |
CREATE PUBLIC DATABASE LINK TO_REMOTE CONNECT TO hr IDENTIFIED BY welcome1 USING 'remotepdb1'; |
在remotepdb1所在主机10.10.133.64上用root打开tcpdump抓取10.10.133.63和10.10.133.64交互的包。
1 2 3 4 5 |
--未加密时的文件名 tcpdump ip host 10.10.133.64 and 10.10.133.63 -w no_encryption.pcap -i enp0s8 --加密时的文件名 tcpdump ip host 10.10.133.64 and 10.10.133.63 -w encryption.pcap -i enp0s8 |
在ora19pdb1上执行一个简单的查询,这个查询使用dblink连接到remotepdb1:
1 2 |
select * from hr.departments@TO_REMOTE; |
然后把生成的no_encryption.pcap文件用wireshark打开,本次查询一共抓到12帧。

10.10.133.63发给10.10.133.64的帧中能看到转义之后SQL明文。同样64给63的回包的TCP segment data也是明文,但是不是直接回表的数据,而是先告知客户端要查的表有哪些列,然后客户端根据这些列重新生成了一个SQL发给64来执行。这个过程以前未曾观测到过。



server端向client端回传查询到的数据的明文,一直没想到SQLNET默认是明文的方式传输的。比较不安全。此外。在所有数据都返回了之后,还隐藏了一个ORA-01403:no data found给客户端,但是实际上客户端是看不到这个错误的,猜测这是告知客户端数据已回传完毕,客户端可以以“xx rows selected”了。
现在开始在server对sqlnet.ora进行配置,来加密sqlnet的传输帧。
sqlnet的加密在Oracle的Database Advanced Security文档中,在此不详细叙述各个参数的意义了。除了传输加密,我还打开了一致性校验。为了更好的看到加密过程,除了抓包之外,我还打开了sqlnet的trace。最终在sqlnet.ora中的参数如下:
1 2 3 4 5 6 7 8 9 10 |
SQLNET.ENCRYPTION_SERVER = required TRACE_LEVEL_SERVER = SUPPORT TRACE_LEVEL_CLIENT = SUPPORT TRACE_DIRECTORY_SERVER=/home/ora19x TRACE_DIRECTORY_CLIENT=/home/ora19x SQLNET.CRYPTO_SEED = 'welcome1' SQLNET.ENCRYPTION_TYPES_SERVER= (3DES168, RC4_40) ADR_BASE = /u01/app/ora19x SQLNET.CRYPTO_CHECKSUM_SERVER = required |
然后在server端开启tcpdump,重新开启一个客户端到服务器端的会话,执行类似的查询,获得抓包的文件和sqlnet的trace。
在trace中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
--能看到加密方式,证明加密启用了。 2019-05-22 13:05:00.999 : nam_gic:Counting # of items in "SQLNET.ENCRYPTION_TYPES_SERVER" parameter 2019-05-22 13:05:00.999 : nam_gic:Found 2 items 2019-05-22 13:05:00.999 : nam_gic:exit 2019-05-22 13:05:00.999 : nam_gnsp:Reading parameter "SQLNET.ENCRYPTION_TYPES_SERVER" from parameter file 2019-05-22 13:05:00.999 : nam_gnsp:Found value "3DES168" 2019-05-22 13:05:00.999 : nam_gnsp:Reading parameter "SQLNET.ENCRYPTION_TYPES_SERVER" from parameter file 2019-05-22 13:05:00.999 : nam_gnsp:Found value "RC4_40" 2019-05-22 13:05:00.999 : naeshow:entry 2019-05-22 13:05:00.999 : naeshow:These are the encryption algorithms that the server will accept, in decreasing order of preference: 2019-05-22 13:05:00.999 : naeshow:Choice 0: '3DES168' (ID 12) 2019-05-22 13:05:00.999 : naeshow:Choice 1: 'RC4_40' (ID 1) 2019-05-22 13:05:00.999 : naeshow:exit --也可以看到加密后的数据: 2019-05-22 13:05:01.075 : nspsend:85 52 BB 9E D5 29 07 70 |.R...).p| 2019-05-22 13:05:01.075 : nspsend:96 96 6D 67 0C 35 4E 4A |..mg.5NJ| 2019-05-22 13:05:01.075 : nspsend:BC 98 04 F1 74 6C 08 CA |....tl..| 2019-05-22 13:05:01.075 : nspsend:18 21 7C 32 90 5E 46 2E |.!|2.^F.| 2019-05-22 13:05:01.075 : nspsend:36 CE 3B E3 9E 77 2C 18 |6.;..w,.| 2019-05-22 13:05:01.075 : nspsend:0E 86 03 9B 27 83 A2 EC |....'...| 2019-05-22 13:05:01.075 : nspsend:07 A2 8F B5 C5 5D F0 6F |.....].o| 2019-05-22 13:05:01.075 : nspsend:4C 52 C9 DE 2B CB F6 95 |LR..+...| 2019-05-22 13:05:01.075 : nspsend:58 17 18 39 95 49 7C EA |X..9.I|.| 2019-05-22 13:05:01.075 : nspsend:95 6A E5 15 D2 26 18 98 |.j...&..| 2019-05-22 13:05:01.076 : nspsend:FA 05 10 15 72 8E 5A 8A |....r.Z.| 2019-05-22 13:05:01.076 : nspsend:AC AA 68 FF FF FF FF FF |..h.....| 2019-05-22 13:05:01.076 : nspsend:FF FF FF 01 00 00 01 0B |........| 2019-05-22 13:05:01.076 : nspsend:4B 8A 65 09 AB 90 14 11 |K.e.....| 2019-05-22 13:05:01.076 : nspsend:6A E3 D4 BC DC 51 82 A2 |j....Q..| 2019-05-22 13:05:01.076 : nspsend:01 9B B5 65 05 C1 76 E7 |...e..v.| 2019-05-22 13:05:01.076 : nspsend:58 17 A6 B9 B8 5A C0 4A |X....Z.J| 2019-05-22 13:05:01.076 : nspsend:DB 88 36 CA 97 FC E9 BF |..6.....| 2019-05-22 13:05:01.076 : nspsend:6D 73 44 73 67 A7 9D D6 |msDsg...| 2019-05-22 13:05:01.076 : nspsend:B3 E9 C4 56 C2 79 74 DB |...V.yt.| 2019-05-22 13:05:01.076 : nspsend:2D 22 B3 26 9F 7A 3A 74 |-".&.z:t| 2019-05-22 13:05:01.076 : nspsend:65 00 50 9A 63 C0 69 11 |e.P.c.i.| 2019-05-22 13:05:01.076 : nspsend:A7 83 07 82 40 1E 26 1E |....@.&.| 2019-05-22 13:05:01.076 : nspsend:AD 2D ED 35 1D F5 AF A0 |.-.5....| 2019-05-22 13:05:01.076 : nspsend:D2 ED A7 BF 95 9C 39 C5 |......9.| 2019-05-22 13:05:01.076 : nspsend:98 56 84 93 CA F2 4A F8 |.V....J.| 2019-05-22 13:05:01.076 : nspsend:DF C0 7A C2 90 2A 4D DE |..z..*M.| 2019-05-22 13:05:01.076 : nspsend:FE 57 24 BE BF 0A 43 2C |.W$...C,| 2019-05-22 13:05:01.076 : nspsend:88 14 05 2D ED F8 8E 0D |...-....| 2019-05-22 13:05:01.076 : nspsend:0C 45 9E EC 2F 61 E7 2D |.E../a.-| 2019-05-22 13:05:01.076 : nspsend:44 69 7D 35 C6 70 E2 53 |Di}5.p.S| 2019-05-22 13:05:01.076 : nspsend:0F A8 B7 1D 2B 85 A4 E1 |....+...| 2019-05-22 13:05:01.076 : nspsend:AE 8D 90 C0 87 FC 3B 67 |......;g| 2019-05-22 13:05:01.076 : nspsend:E1 B0 7F 23 F9 BE 46 63 |...#..Fc| 2019-05-22 13:05:01.076 : nspsend:E3 8D 32 FE A5 E9 1A F2 |..2.....| 2019-05-22 13:05:01.076 : nspsend:9C EC 8D 9E 79 B5 70 D8 |....y.p.| 2019-05-22 13:05:01.076 : nspsend:82 2E 6B 75 78 88 36 09 |..kux.6.| 2019-05-22 13:05:01.076 : nspsend:F3 59 CF D3 78 0F 98 EC |.Y..x...| 2019-05-22 13:05:01.076 : nspsend:56 C8 D6 A2 98 08 F5 80 |V.......| 2019-05-22 13:05:01.076 : nspsend:9D 43 F8 2E 95 EF A7 CF |.C......| 2019-05-22 13:05:01.076 : nspsend:C4 34 71 1F C6 5B 3E FE |.4q..[>.| 2019-05-22 13:05:01.076 : nspsend:75 59 5E 85 84 3F D0 70 |uY^..?.p| 2019-05-22 13:05:01.076 : nspsend:BF 98 2F FD F2 1B 6B 7D |../...k}| 2019-05-22 13:05:01.076 : nspsend:BA B6 65 9A F5 B7 54 BD |..e...T.| 2019-05-22 13:05:01.076 : nspsend:02 20 5E AA 98 4A 04 00 |..^..J..| 2019-05-22 13:05:01.076 : nspsend:14 00 01 66 6F 6F 20 62 |...foo.b| 2019-05-22 13:05:01.076 : nspsend:61 72 20 62 61 7A 20 62 |ar.baz.b| 2019-05-22 13:05:01.076 : nspsend:61 74 20 71 75 75 78 |at.quux | |
随后,打开tcpdump的包:

证明加密成功。
加密的配置不复杂,下面为客户端和服务器端的参数匹配情况,默认是Accepted,OFF代表未开启加密,ORA-12660代表Encryption or crypto-checksumming parameters incompatible,无法建立链接。
Rejected | Accepted | Requested | Required | |
---|---|---|---|---|
Rejected | OFF | OFF | OFF | ORA-12660 |
Accepted | OFF | OFF | ON | ON |
Requested | OFF | ON | ON | ON |
Required | ORA-12660 | ON | ON | ON |
此外,加密最关心对性能的损耗,对资源的消耗,对查询效率的影响等等。国外同行在10.2下,开启每种加密算法,对DBA_OBJECTS进行100次查询,统计出来的结果如下:

可以看到3DES168对性能影响巨大。而其他加密算法的效率还在可以接受的范围内,最低的有4%。仅供参考。