Stunnel 安全性用于 Oracle
Oracle 已将其同名数据库产品集成了现代传输层安全 (TLS) 网络加密,并且从 10.2 数据库版本开始,TLS 的使用不再需要高级安全选项。缺少 TLS 的旧配置会交换加密密码,但会话有效负载以明文形式传输,并且很容易被任何控制中间网络的人拦截。包含敏感内容的数据库应避免明文流量配置。
可以使用 stunnel 实用程序将 Oracle 透明网络底层 (TNS) 监听器“隐式地”用 TLS 加密包装起来作为隔离进程,并且此配置似乎与 Oracle 的 sqlplus 命令行实用程序以及用于多个数据库实例之间分布式事务的数据库链接兼容。与 TNS 监听器的原生 TLS 实现相比,stunnel 有几个优点
-
stunnel 实用程序可能便宜得多。旧版本的 Oracle 数据库需要高级安全选项才能使用 TLS,根据最新定价,每个 CPU 的许可费用为 15,000 美元,但 TLS 现在包含在 标准版 SE2 中。
-
stunnel 实用程序和相关的依赖库(即 OpenSSL)的补丁更新频率更高,如果 stunnel 在“inetd”配置中使用,则可以立即应用更新,而无需数据库“重启”。Oracle 在 2015 年为 Oracle Linux 7 发布了总共八个 OpenSSL 的补丁版本。数据库补丁仅按季度定期发布,每年四次,并且需要实例重启/中断。紧急的 SSL/TLS 更新作为数据库补丁实施时会有很长的延迟(部分原因是大多数 DBA 过度谨慎),但作为简单的操作系统实用程序补丁应用会容易得多,且无需停机。因此,可能需要立即更新的对安全性敏感的代码应尽可能放在数据库服务器之外。stunnel 实用程序非常符合此要求。
-
stunnel 实用程序可以作为单独的用户和组在“chroot 监狱”中运行,该监狱对系统的其余部分具有有限的可见性。Oracle 的服务器 TLS 实现以 TNS 监听器的完整权限运行。如果 TLS 引擎被限制在 chroot() 监狱中,则其受到破坏的危险性会大大降低。权限分离和 chroot() 是公认的安全技术,许多对安全性敏感的安装很可能仅因此原因而禁用监听器 TLS。
让我们继续为 Oracle 添加 stunnel TLS 服务。
服务器配置我假设读者熟悉 Oracle 数据库以及启动实例和 TLS 监听器的过程。作为参考,让我们假设数据库 SID “mydb”正在运行,并且示例监听器守护程序在 IP 地址 1.2.3.4 上使用以下命令启动
export ORACLE_SID=mydb ORACLE_HOME=~oracle/Ora12c/db
$ORACLE_HOME/bin/lsnrctl start
监听器将生成类似于以下输出的启动消息
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on
↪19-FEB-2016 13:18:55
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Starting /home/oracle/Ora12c/db/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /home/oracle/Ora12c/db/network/
↪admin/listener.ora
Log messages written to /home/oracle/Ora12c/diag/tnslsnr/
↪HOSTNAME/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=1.2.3.4)
↪(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4)
↪(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date 19-FEB-2016 13:18:55
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Parameter File /home/oracle/Ora12c/db/network/admin/listener.ora
Listener Log File /home/oracle/Ora12c/diag/tnslsnr/HOSTNAME/listener/
↪alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=1.2.3.4)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Services Summary...
Service "mydb" has 1 instance(s).
Instance "mydb", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
重要的是,监听器不要将客户端“端口重定向”到单独的服务器端口(在 MTS/共享服务器中最常见)。必须禁用任何导致 TNS 监听器执行此类活动的功能。
要配置 stunnel,root 用户必须为 TLS 创建密钥对。如果需要,此密钥对可以由证书颁发机构 (CA)“签名”——这通常对于网站加密 (HTTPS) 很有用,因为缺少已识别的 CA 签名会触发浏览器安全警告。Oracle 客户端只有在服务器密钥由已识别的 CA 签名时才能验证服务器密钥,这将在本文的最后一部分中讨论。要获得签名密钥,请按照 stunnel 网站上的说明进行操作。否则,对于更非正式的用途,可以使用以下命令生成自签名密钥
cd /etc/pki/tls/certs
make stunnel.pem
密钥生成过程会询问许多问题
Generating a 2048 bit RSA private key
....................................................................+++
.................................+++
writing new private key to '/tmp/openssl.hXP3gW'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name
or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:IL
Locality Name (eg, city) [Default City]:Chicago
Organization Name (eg, company) [Default Company Ltd]:ACME Corporation
Organizational Unit Name (eg, section) []:Widget Division
Common Name (eg, your name or your server's hostname) []:darkstar
Email Address []:linus@posix.org
上面生成的密钥将在自创建之日起 365 天后过期。如果您想生成寿命更长的密钥,可以直接调用 OpenSSL
openssl req -new -x509 -days 3650 -nodes \
-out stunnel.pem -keyout stunnel.pem
密钥将如下所示
# cat /etc/pki/tls/certs/stunnel.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC23m+w0BLxI2zB
/p8/TiuFcEurTLbLCQwcO/FE+vNcJpddckuF6/VgpBAJk+d9i7NZNqrjMH711H18
3AYhewZTCbRUMQE3ndaYEIxSt4Qhbm8XbfUfx6Fmg4CnWh/XzE7B8Z7XbHpwRQ4d
kQOzICzb1nt96QKdWoAob73+hv7qdi3UjJ3/20z3Cx5LWfWoa32Y50//tvBjBtcQ
H7QpiE2tfLWHTQ5tztkqVY/MZJWVgoT5LnqQlZeZB/C4izSYNo9EGAnw4ThaFJ/y
NdvmyK6sYaO3Dq4eFO78O+zzqyfhPCtcfb8lMuRTZa8uiv7ziVf0A3eGSwKYonUf
iL7su0kJAgMBAAECggEASyeDk5EQF9ZNPjUc0XGY5VBPaOkwPqVLOtdPwt+34Glj
z93HOBTPVZZXmPgWLTyaytFyzcgChZl8sTHjuyLKaJoWaHtzWp4dsYUrhlsxjGPM
eD6SfSsYI/9rglvBtnia7Y4Vj8dfUoCu2mvcr2NLzFWLjyWSE4U8ImI6HT7xyP1y
5Ab8JYX5C0qODTjjPldovz8Fm9XE7yKVg5XQ9aA8axq1uWY7ruzxXli/+h7TJLPe
v/yCCeKLqL+gSkORjhg8ZsK/9p6InMN6uFUeSvb0Y9eLnLnJ6tCUGh4m+cgXulrD
UleXxeFzxnS3ydCNHVDngXyaJ1U+bLGVeHOLRcZHAQKBgQDY5jU+rU8VPXrbPJae
fZ8swf3Pi00QUKN4P5Zyy5cs18KMgDRHRaUdYmVCpTISR7Wi0XHEI7iHDpKlL//k
zCT0LW+fk+4A7bP5yUhLLtd175RUpR3ieBuXbAZRqDaPMDJ1xpZj+hDiShPv+OGR
k7ETnBDm/zk1T+F2Lu6qebLbcQKBgQDX1b6I7eRDkyFZITZX1v+S6PkoTMQMeCGX
cSwVvuDuiszgbf7IImWvvFxd7h+WJZEVv4jV645LOsvkY6XyFXdW7iNJGkKgThg6
YNE3X5f1oGvo5E3+HNXS3vGs76YVKTraDd0SKIRT98m2jiXCVCw+KWlR5GR+xp2A
8exCoTYLGQKBgQDJdcmu1brGt7wNNlGQFI5sPCNLSs/hf4TWg/lx1rgr5pvFdK8a
JA4hJOt444eGgySqfm91Bti2WUrMM7EzCoqoYitzxSsjoaWxNMv5SSDHYigcFuGT
IIxAMQ4NenhytwmnazT016gnBzdNhZW+abfnxuXMKPMyGWgJJb54iWEfgQKBgQDV
N3xgfNHwx5o8GIk8wVH86VWqMBvETbCxkMWCPeyq+kdmtoLpZsGZl7SPvjtJ8paf
K3WcDnWlb9IYLzCyM+6O2/XTs7N59WwNz7MexrqxlebETTWXARlilYed1aj2YqKW
4vcvhwMiiDimtUor7Uc/qV033y4/5ymVRmilceiXkQKBgEbFhAKXP9qZMdfLevWp
VXAZCc5mQ2hxQOSQRAL5VvTUXm6ZwVXVf/U42JH3YXiVXbwDbEjjxS/8MtSbQU9z
LoVQ/+bvc3xQ08u8kxdQiWzTzwRxHJM/znxpoD9astItq4uWU58hCoUNItHEKGJt
60bczdu3rZLZIB1n2zSM6soF
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIID/TCCAuWgAwIBAgIJALT/9skCvdR5MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD
VQQGEwJVUzELMAkGA1UECAwCSUwxEDAOBgNVBAcMB0NoaWNhZ28xGTAXBgNVBAoM
EEFDTUUgQ29ycG9yYXRpb24xGDAWBgNVBAsMD1dpZGdldCBEaXZpc2lvbjERMA8G
A1UEAwwIZGFya3N0YXIxHjAcBgkqhkiG9w0BCQEWD2xpbnVzQHBvc2l4Lm9yZzAe
Fw0xNTEwMzAwMzI2NTJaFw0yNTEwMjcwMzI2NTJaMIGUMQswCQYDVQQGEwJVUzEL
MAkGA1UECAwCSUwxEDAOBgNVBAcMB0NoaWNhZ28xGTAXBgNVBAoMEEFDTUUgQ29y
cG9yYXRpb24xGDAWBgNVBAsMD1dpZGdldCBEaXZpc2lvbjERMA8GA1UEAwwIZGFy
a3N0YXIxHjAcBgkqhkiG9w0BCQEWD2xpbnVzQHBvc2l4Lm9yZzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBALbeb7DQEvEjbMH+nz9OK4VwS6tMtssJDBw7
8UT681wml11yS4Xr9WCkEAmT532Ls1k2quMwfvXUfXzcBiF7BlMJtFQxATed1pgQ
jFK3hCFubxdt9R/HoWaDgKdaH9fMTsHxntdsenBFDh2RA7MgLNvWe33pAp1agChv
vf6G/up2LdSMnf/bTPcLHktZ9ahrfZjnT/+28GMG1xAftCmITa18tYdNDm3O2SpV
j8xklZWChPkuepCVl5kH8LiLNJg2j0QYCfDhOFoUn/I12+bIrqxho7cOrh4U7vw7
7POrJ+E8K1x9vyUy5FNlry6K/vOJV/QDd4ZLApiidR+Ivuy7SQkCAwEAAaNQME4w
HQYDVR0OBBYEFEgCdENJ+1y0STMyQtuz3uqDON3NMB8GA1UdIwQYMBaAFEgCdENJ
+1y0STMyQtuz3uqDON3NMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
AITW7cBNdWBcgagsinGKfyESBlJ7JvxvsMzYVhI8myC8ht/3nFMyTHmBgtmxdNbW
mCCzDdeSigQf/iEzH02k/EK7L7I3DATGBW6w9WiYBdqrZJl98CIxoY9j+GV0AeL1
INMSb5G4R2ygnekXVNTJsICeVHTRujBJsD4psZB5dhSI888rA2MrdQ8jAFGDk7Z4
VYckA2gQ+70yXXxpFSD4n2ecq3ebNtej07zR2wAtAkt/JtuGiUjbl1m4ZFTPoTwr
xDYMcezEgopMzYMihv6CQ0CEU+qL+92CYtEDsd1hzn74SlBK9HMKjMLrbBZPhbE4
/JMRW5oa/+TFZIRcacTxgAw=
-----END CERTIFICATE-----
上面的 PRIVATE KEY
部分是文件中最敏感的部分;确保您不信任的任何人看不到或复制它,并且备份介质上的任何记录都应加密。BEGIN CERTIFICATE
部分在 TLS 客户端(即 sqlplus)连接到 stunnel 时呈现给它们。
根据 stunnel 手册页的指导,为 Diffie-Hellman 密钥交换算法计算自定义素数可能是明智的
openssl dhparam 2048 >> stunnel.pem
之前的命令将为高安全性 Diffie-Hellman 素数向您的 stunnel.pem 文件添加另一个部分
-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEAoHi5jzY5ZVwGCFFm1EhVsePXxNwCSs/eQbaC3rc+iXENL8xk21uq
6eSwYIQWUeDN/h6wBBDe6dpFoNDJQeqKCmUa8aojGHnkcqsJBdVUKVF5/7rWb1Yi
TzvbeZt8UvYnNUErJEpgBMiKPDYipE2BZ6k61WwkK6WV6svGAHpIc3o/9kU+72uf
dPFaNIygAb2HLaJYvXq9OYGvrMsmyZTh3fnpg2RiZSVJf+i4BfyeLiYkwnSZozAS
2rQ4hf2E5WY6jiAcNZBLKvqR8lUuIaXd9+VkiCSV0c2pXzb2ElxOk8sheAHliwip
SaKC694z9l63eNKQW2J4WI97wkil0qa4MwIBAg==
-----END DH PARAMETERS-----
Oracle TNS 监听器通常在端口 1521 上运行。在本练习中,让我们在端口 1522 上运行 Oracle TLS 服务,该端口具有当前服务名称
# grep 1522 /etc/services
ricardo-lm 1522/tcp # Ricardo North America License
# Manager
ricardo-lm 1522/udp # Ricardo North America License
# Manager
放置以下文件以控制“ricardo”服务的 stunnel(将 IP 地址 1.2.3.4 更改为您的 TNS 监听器的位置)
# cat /etc/stunnel/ricardo.conf
sslVersion = TLSv1.2
options = NO_SSLv3
options = NO_SSLv2
options = SINGLE_DH_USE
options = SINGLE_ECDH_USE
options = CIPHER_SERVER_PREFERENCE
cert = /etc/pki/tls/certs/stunnel.pem
FIPS = no
debug = 6
syslog = yes
chroot = /var/empty
setuid = nobody
setgid = nobody
connect = 1.2.3.4:1521
; best-practice ciphers:
; https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ciphers=ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:
↪DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:
↪!aNULL:!MD5:!DSS
请注意,上面您正在为 最佳实践加密 配置 TLS,采用最高质量的协议和密码。Oracle 客户端似乎与这些设置兼容。请注意,stunnel 的作者 Michal Trojnara “不建议在强化集中使用 DH 密码套件。ECDH 密码套件更安全、速度更快 - 在最近对 DH 的攻击之后,RFC 7525 应被视为已过时。”另一方面,最近出现了关于 椭圆曲线软件专利的问题,尽管 Sun/Oracle 贡献了 OpenSSL 中的 ECC 实现,并非常小心地避免了专利方法。Red Hat/Fedora 更进一步,仅启用 NIST ECC 曲线的 Suite B 子集,以防止 Certicom(这是否是对 CryptoPeak 的充分 法庭辩护是另一回事)。除此之外,在我之前对 Stribika SSH 指南的报道中 [请参阅 Charles Fisher 于 2015 年 9 月撰写的 “密码安全性:如何强化 TLS 和 SSH”],我写道,作者“……建议不要使用 NIST 椭圆曲线,因为众所周知,它们很难正确实现。如此之难,以至于我怀疑这是否是故意的。任何简单的实现似乎都可以工作,但会通过侧信道泄漏秘密。禁用它们似乎不会引起问题;客户端要么也具有 Curve25519,要么它们具有足够好的 DH 支持。”Trojnara 回应说,“关于 ECDHE 的侧信道攻击的问题纯粹是无稽之谈,因为根据定义(最后一个“E”代表“临时”),这里没有持久的秘密,攻击者可能会通过 [任何可用的] 侧信道攻击来检索。”无论如何,Hynek Schlawack 关于此主题的网站迄今为止尚未认可任何一个,而他对 Diffie-Hellman 密钥交换背后日益增长的问题 的沉默有些令人不安。您的法律环境和加密立场将决定您的密码字符串。
使用以下 systemd 单元文件为 inetd 样式操作配置 stunnel(如果您没有使用基于 systemd 的操作系统,请参阅我之前的文章以了解有关 [x]inetd 的讨论)
# cat /etc/systemd/system/ricardo.socket
[Unit]
Description=oracle stunnel
[Socket]
ListenStream=1522
Accept=yes
[Install]
WantedBy=sockets.target
# cat /etc/systemd/system/ricardo@.service
[Unit]
Description=oracle stunnel service
[Service]
ExecStart=-/usr/bin/stunnel /etc/stunnel/ricardo.conf
StandardInput=socket
假设上述单元文件已就位,则可以使用以下命令在启动时和当前环境中启用端口 1522 上的连接
systemctl start ricardo.socket
systemctl enable ricardo.socket
enable 命令将放置 systemd 的启动链接
Created symlink from
/etc/systemd/system/sockets.target.wants/ricardo.socket to
/etc/systemd/system/ricardo.socket.
telnet 到端口 1522 可能很有用,因为 stunnel 在出现问题时会将信息性错误消息打印到标准输出。最实用的 telnet 客户端可能是 BusyBox。
远程连接到端口 1522 可能会被您的 Linux 防火墙阻止。root 用户可以允许它们传递到 stunnel,方法如下
iptables -I INPUT -p tcp --dport 1522 --syn -j ACCEPT
可以指示 TNS 监听器限制会话的来源,并且可以通过将您的 IP 等效项添加到服务器上的 $ORACLE_HOME/network/admin/sqlnet.ora 文件的以下片段中来完全禁止明文流量
TCP.INVITED_NODES=(127.0.0.1,1.2.3.4)
TCP.VALIDNODE_CHECKING=yes
在所有测试成功后执行此修改,并注意,如果配置受到如此限制,则任何使用 TNS 监听器的已配置客户端都将被关闭。
使用 Oracle 公司提供的 stunnel 二进制文件可能是明智之举,但其提供的版本相当旧。如果您可以加载 stunnel 版本 5,则可以省略上面显示的 NO_SSL
选项。但是,Oracle 版本 4 stunnel 二进制文件在涉及 Oracle 的关键支持情况下可能更容易被容忍。另一方面,来自 stunnel.org 的商业支持绝对更喜欢版本 5。如果支持是一个重要因素,则使用这两个版本的经验和可用性将很有帮助。
特别感谢 stunnel 的作者 Michal Trojnara,感谢他对本文和 stunnel 开发工作的有益评论。他的组织提供 stunnel 的商业支持、许可和咨询;请参阅此 页面 以了解他的最新版本。
数据库客户端使用与本地数据库服务器捆绑在一起的 sqlplus 客户端实用程序,可以通过先前在远程服务器上配置的 stunnel 建立 TLS 会话。这样做需要一个新的客户端密钥,该密钥存储在“钱包”中,该钱包在下面创建。
使用以下命令配置本地 sqlplus
export ORACLE_SID=yourdb ORACLE_HOME=/home/oracle/Ora12c/db
mkdir /home/oracle/wallet
$ORACLE_HOME/bin/orapki wallet create -wallet /home/oracle/wallet \
-pwd SECRET123 -auto_login_local
$ORACLE_HOME/bin/orapki wallet add -wallet /home/oracle/wallet \
-pwd SECRET123 -dn "CN=%yourdb%" -keysize 2048 \
-self_signed -validity 3650
上面对 orapki 实用程序的两次调用的输出都应该是此横幅
Oracle PKI Tool : Version 12.1.0.2
Copyright (c) 2004, 2014, Oracle and/or its affiliates. All
rights reserved.
还必须放置指令以查找新的钱包存储库——将以下内容添加到您的 sqlnet.ora 文件
$ cat $ORACLE_HOME/network/admin/sqlnet.ora
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /home/oracle/wallet)
)
)
SSL_CLIENT_AUTHENTICATION = FALSE
最后,使用数据库帐户和调用端口 1522 上的 TLS 端口的连接描述符调用 sqlplus(请注意,单引号内的换行符是可选的,此处包含换行符是为了清晰起见)
$ORACLE_HOME/bin/sqlplus RemoteUser@'(description=
(address=
(protocol=tcps)
(host=1.2.3.4)
(port=1522)
)
(connect_data=(sid=mydb)))'
假设成功,输入您的 RemoteUser 帐户的密码,然后发出 SQL 命令
SQL*Plus: Release 12.1.0.2.0 Production on Fri Feb 19 13:26:56 2016
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Enter password:
Last Successful login time: Fri Feb 19 2016 13:15:54 -06:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
Production
With the Partitioning, OLAP, Advanced Analytics and Real
Application Testing options
SQL> SELECT COUNT(*) FROM DBA_OBJECTS;
COUNT(*)
----------
19633
需要考虑的几个要点
-
将上面的
protocol=tcps
更改为protocol=tcp
并进一步修改port=1521
将使用明文会话登录(如果您的防火墙和监听器允许访问)。 -
如果更方便,上面的
host=
子句可以引用 DNS 主机名而不是 IP 地址。 -
可以使用上面的单引号内的内容设置
TWO_TASK
环境变量。如果这样做,则 sqlplus 将静默连接到远程服务器,就像它是本地服务器一样。 -
单引号内的连接描述符定义很可能会移动到您的 TNSNAMES.ORA 或网络 TNS 解析方法(ldap、onames)中。
-
服务器上不需要钱包——此功能由 stunnel 处理。如果将使用客户端的 TLS 实现,则 Oracle 客户端需要钱包。可以在客户端模式下配置 stunnel,然后在两侧都省去钱包。
-
当 sqlplus 会话处于活动状态时,stunnel 进程将出现在服务器上(注意 NPROC 或其他内核限制)
# ps -ef | grep stunnel nobody 16810 1 0 13:26 ? 00:00:00 /usr/bin/stunnel ↪/etc/stunnel/ricardo.conf
对于两个或多个 Oracle 数据库服务器,可以在它们之间启动会话和事务,以收集和修改“两阶段提交”中的数据。帐户和服务器之间的链接使用以下命令建立(如果您已将 tcps 主机移动到您的 TNSNAMES.ORA 中,您也可以在此处引用它们)
SQL> CREATE DATABASE LINK MyDBLink
CONNECT TO RemoteUser
IDENTIFIED BY PassWord
USING '(description=
(address=
(protocol=tcps)
(host=1.2.3.4)
(port=1522)
)
(connect_data=(sid=mydb)))';
Database link created.
建立链接后,远程表可以以链接名称作为后缀(可以与其他本地或远程表连接)
SQL> SELECT COUNT(*) FROM ALL_OBJECTS@MyDBLink;
COUNT(*)
----------
1851
服务器验证
可能需要在连接的两端验证密钥,以确保授权使用。原生 Oracle TLS 实现要求所有需要验证的密钥都由已识别的 CA 签名(可能需要将 CA 的公钥添加到 Oracle 使用的证书存储中)。
请注意,stunnel 也可以验证密钥并充当客户端和服务器。stunnel 验证选项比 Oracle 的更灵活,如果不需要 CA 签名但强制执行 TLS 验证,则应完全禁用 Oracle 的 TLS。
在下面的示例中,让我们假设服务器的公钥具有 CA 签名。要提取该公钥,以下 awk 模式很有用
awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' \
/etc/pki/tls/certs/stunnel.pem > /tmp/pkey
将 /tmp/pkey 文件移动到客户端,然后将其加载到钱包中
$ORACLE_HOME/bin/orapki wallet add -wallet /home/oracle/wallet \
-pwd SECRET123 -trusted_cert -cert /tmp/pkey
加载密钥后,验证它现在是否在钱包中
$ORACLE_HOME/bin/orapki wallet display -wallet /home/oracle/wallet \
-pwd SECRET123
密钥应出现在“受信任的证书”部分
Oracle PKI Tool : Version 12.1.0.2
Copyright (c) 2004, 2014, Oracle and/or its affiliates. All
rights reserved.
Requested Certificates:
User Certificates:
Subject: CN=%yourdb%
Trusted Certificates:
Subject: EmailAddress=linus@posix.org,CN=1.2.3.4,OU=Widget
↪Division,O=ACME Corporation,L=Chicago,ST=IL,C=US
Subject: CN=%yourdb%
客户端可以使用 TNS 描述符中的 SSL_SERVER_CERT_DN
子句验证服务器密钥
$ORACLE_HOME/bin/sqlplus fishecj@'(description=
(address=
(protocol=tcps)
(host=1.2.3.4)
(port=1522)
)
(connect_data=
(sid=mydb)
(security=(SSL_SERVER_CERT_DN="CN=1.2.3.4,OU=Widget Division,
↪O=ACME Corporation,L=Chicago,ST=IL,C=US")
)))'
如果 CA 签名未被识别,则 sqlplus 登录将失败,并显示以下内容
ERROR:
ORA-29024: Certificate validation failure
此外,stunnel 将在 /var/log/secure 中记录以下内容
LOG7: SSL alert (read): fatal: unknown CA
LOG3: SSL_accept: 14094418: error:14094418:SSL
routines:SSL3_READ_BYTES:tlsv1 alert unknown ca
此类错误表明 CA 未正确加载到数据库使用的捆绑包中。
结论多年来,Oracle 数据库安全性受到了尖锐的批评,并通过发布版本逐渐改进了架构并弥补了可利用的弱点。对于许多人来说,这些改进在速度和范围上都不足。在这种情况下,stunnel 是用于 Oracle 中关键数据的身份验证、隔离和隐私的宝贵工具。
Charles Fisher 的其他文章“密码安全性:如何强化 TLS 和 SSH”,《Linux Journal》,2015 年 9 月。
“使用 systemd 的无限 BusyBox”,《Linux Journal》,2015 年 3 月。
“加强 SSH 和 TLS 中的 Diffie-Hellman”,LinuxJournal.com,2015 年 10 月 29 日。
“安全文件传输”,《Linux Journal》,2016 年 1 月。