ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Oracle数据库限制IP连接实战:sqlnet.ora白名单配置与排障指南

Oracle数据库限制IP连接实战:sqlnet.ora白名单配置与排障指南 搞过Oracle的人应该都遇到过这种需求业务方突然告诉你数据库连接串被扫了、有人拿着别的IP往1521端口疯狂试密码或者干脆要求“只有办公网段的IP能连数据库”。这种时候靠改应用配置是没用的必须在数据库链路本身把口子收紧。Oracle 数据库限制IP地址连接本质上就是在网络链路和数据库监听器之间加一道闸门让不合规的IP在建立会话之前就被拒掉。这篇文章我不讲空泛的安全理论直接把我在生产环境里实际用过的方案、踩过的坑、以及绕不开的注意事项全部摊开。适合刚接手Oracle维护的DBA、被安全扫描搞到头大的运维以及想从应用层往下摸一点的开发同学。核心就是一套东西sqlnet.ora里那三个参数配合验证、排障、以及和防火墙搭配使用的完整思路。1. 限制IP连接的真实业务场景与方案选型1.1 哪些场景真的需要“IP白名单”先说场景不然你都不知道该在什么时候掏出这个方案。最常见的是信息安全审计要求客户或等保检查会明确规定数据库的1521端口不能对所有IP开放必须限定来源。第二个场景是降低爆破风险Oracle监听器历史上出过不少漏洞把端口裸奔在公网或大内网里等于天天开门揖盗。第三类是内网分区管控比如前端应用服务器在192.168.10.0网段运维跳板机在192.168.20.0网段其他网段一律不允许直连数据库。还有一种不太起眼但很实际的场景同一个库被多个项目共用某个项目组的IP老来占用连接数甚至有人直接在本地装个PL/SQL Developer连生产库跑大查询。这时候给这个库加一个来源IP白名单比反复发通告、找管理员关连接高效得多。1.2 三套主流方案对比与选型逻辑要限制IP连接说起来无非三条路网络层用防火墙或iptables数据库层用sqlnet.ora再往上一点用数据库触发器。方案拦截位置粒度生效方式优缺点iptables/防火墙系统内核网络层端口来源IP即时生效拦截最早、性能最好但需要系统权限对云环境安全组也适用sqlnet.ora监听限制Oracle Net监听器来源IP/主机名新连接即时生效数据库层控制不依赖系统权限运维自主可控但对不走监听器的连接无效LOGON触发器数据库会话建立后用户IP组合即时生效粒度最细可记录日志但会话已建立属于事后拦截我的建议非常明确优先用sqlnet.ora做第一道防线。原因有两条。第一它对DBA来说完全自主不需要找网络管理员改防火墙策略省去跨部门扯皮的时间。第二Oracle官方专门设计了这个机制语义清晰、配置简单比自己在系统层折腾要规范得多。防火墙方案可以作为双保险叠加触发器则更适合有“某用户只能从某IP登录”这种更细粒度需求的情况。2. 核心原理sqlnet.ora 如何拦住不速之客2.1 三个关键参数分别是什么sqlnet.ora是Oracle Net的核心配置文件默认位于$ORACLE_HOME/network/admin/Windows环境通常在%ORACLE_HOME%\network\admin\。限制IP连接靠的是里面三个参数TCP.VALIDNODE_CHECKING YES TCP.INVITED_NODES (192.168.1.100, 192.168.1.101, dbadmin.example.com) TCP.EXCLUDED_NODES (192.168.1.200)逐个解释一下。TCP.VALIDNODE_CHECKING是总开关必须设置为YES否则后面两个参数写了也白写默认值是NO。TCP.INVITED_NODES是允许连接的主机列表支持IP地址、主机名也支持通配符比如192.168.1.*、*.example.com。TCP.EXCLUDED_NODES是拒绝连接的主机列表。这里有一个很容易搞混的点两个列表同时存在时优先判断INVITED_NODES。也就是说只有出现在INVITED列表里的主机才有资格继续判断如果这个IP不在INVITED里哪怕它也不在EXCLUDED里照样被拒。如果INVITED_NODES没有配置那就默认允许所有主机再用EXCLUDED_NODES去剔除。安全上建议用INVITED白名单思路默认拒绝比默认允许靠谱得多。2.2 检查机制发生在哪一层很多人配置完这个参数之后好奇这个限制到底是在哪一步拦下来的简单说客户端先和监听器完成TCP三次握手然后在Oracle Net协议握手阶段监听器会读取sqlnet.ora中的规则对客户端来源地址做匹配匹配失败直接终止通信。注意这个检查发生在监听器层面也就是Oracle Net这一层。所以它对所有走监听器的客户端都生效无论是JDBC Thin、ODBC、PL/SQL Developer还是sqlplus远程连接统统适用。同时也意味着如果你用的是本地连接方式bequeath协议比如在数据库服务器本机通过sqlplus / as sysdba连本地实例这种不走监听器的连接是不受这个限制的。2.3 生效时机不用重启数据库但连接会被“打断”这是很多DBA最容易含糊的地方。修改sqlnet.ora之后不需要重启数据库实例甚至多数情况下不用重启监听器。监听器在接受新连接的时候会重新读取配置新的限制规则会立即作用于后续连接请求。不过保险起见在生产环境我还是建议执行一下lsnrctl reload让监听器干净地重读一次配置避免某些版本或特殊部署下出现不可预期的缓存行为。有一点必须提前讲清楚这个机制只会拦截新建立的连接。已经在跑的会话不会被踢掉哪怕它的来源IP已经被加入黑名单现有会话仍然保持直到用户主动退出或空闲超时。如果业务上要求“拉黑立即生效”那就得配合ALTER SYSTEM KILL SESSION或者杀进程来处理存量会话。3. 完整配置实操从白名单到验证3.1 动手前先梳理这四件事别一上来就改文件先花两分钟把下面四件事列清楚能省掉后面大量排障时间。第一盘点当前哪些IP在正常连接数据库。最直接的办法是查监听日志也可以查数据库里的V$SESSION视图把MACHINE、PROCESS、CLIENT_INFO等字段捞一遍确认所有应用服务器、中间件、运维跳板机的真实来源IP。很多人写白名单时漏了中间件服务器结果一上线所有应用全部连不上然后半夜被叫起来回滚。第二确认要不要保留本机IP。数据库服务器本机IP一定要加进白名单否则后面排查问题时你想通过本机sqlplus连远程实例都会被自己挡在门外。第三确认sqlnet.ora的实际路径。多实例环境、使用了TNS_ADMIN环境变量的环境sqlnet.ora不一定在默认目录。用echo $TNS_ADMIN看一眼确定你改的确实是监听器读取的那个文件。第四做好旧文件备份。改动之前cp一份带时间戳的备份文件这是所有配置变更的底线操作。3.2 编写 sqlnet.ora 配置假设现在有一个Oracle 19c实例监听端口1521需要放行三个来源应用服务器A192.168.10.15、应用服务器B192.168.10.16、DBA跳板机10.2.1.80其他IP全部拒绝。配置可以这么写TCP.VALIDNODE_CHECKING YES TCP.INVITED_NODES (192.168.10.15, 192.168.10.16, 10.2.1.80)如果内网网段比较规整也可以按网段放行TCP.VALIDNODE_CHECKING YES TCP.INVITED_NODES (192.168.10.*, 10.2.1.80)如果你不想用白名单而是只想拒绝某一个来源IP比如192.168.10.200这个IP有异常扫描行为可以反过来TCP.VALIDNODE_CHECKING YES TCP.EXCLUDED_NODES (192.168.10.200)写的时候有几个格式细节要注意参数名和等号之间不要乱加空格括号里的条目用英文逗号分隔结尾不要加分号。sqlnet.ora不是Java或Shell它认不得分号。配置文件里允许有注释注释行用#开头。3.3 验证配置是否生效配置完别急着收工验证步骤一定要做。先reload监听器lsnrctl reload然后找一台白名单内的客户端机器执行sqlplus system/password192.168.10.15:1521/ORCLPDB1能正常登录说明白名单放行逻辑没问题。再找一台不在白名单里的机器或者临时改一下客户端IP测试执行同样的连接命令预期会看到类似ORA-12537: TNS:connection closed或者监听器直接重置连接的报错。有一个更直观的验证方式在数据库服务器上打开监听日志实时跟踪tail -f $ORACLE_HOME/network/log/listener.log被拒绝的连接会在日志里留下记录来源IP、拒绝时间都清清楚楚。日志文件路径记不住的话可以登录监听器命令行用lsnrctl status查看当前监听配置也能确认监听器是否正常读取了sqlnet.ora。3.4 如何优雅回滚万一配置完后发现漏了某个重要IP甚至把管理通道也堵死了别慌。回滚的方法取决于你还能不能连上服务器。如果只是连接被拒但还能SSH到数据库服务器直接编辑sqlnet.ora把漏掉的IP加进TCP.INVITED_NODES然后lsnrctl reload新连接立即恢复。如果连SSH也进不去那就只能走带外管理或者云控制台了这也是为什么前面强调“本机IP一定要在白名单里”。另一种回滚情况是用户要求“全部放开”。直接把TCP.VALIDNODE_CHECKING改成NO或者注释掉整个限制段落reload监听器即可。注意改成NO后所有来源IP都能连安全策略等于撤销了要同步通知到安全审计那边。4. 常见问题与排查技巧实录4.1 高频问题速查表现象可能原因处理动作配置后所有IP都连不上白名单漏了本机IP或中间件IP服务器本机改配置把漏掉的IP加进INVITED列表后reload配置后允许列表的IP也连不上语法写错、括号没配对、TNS_ADMIN指向了别的文件检查sqlnet.ora格式确认监听器读取的是同一份文件限制不生效黑名单IP照样能连VALIDNODE_CHECKING没设成YES或改的不是监听器读的文件确认开关为YES确认文件路径reload监听器重启监听器后监听起不来sqlnet.ora语法严重错误或权限不对用备份文件恢复修正格式后重启在RAC环境只有一个节点限制生效各节点sqlnet.ora没有同步修改所有节点统一配置包括SCAN监听所在节点应用通过中间件连接来源IP全是中间件IP限制的是客户端源IP中间件做了转发把中间件服务器IP加入白名单而不是用户终端IP4.2 一次真实排障复盘有一次某个客户反馈配置完白名单后应用服务器A能连应用服务器B不能连报错是ORA-12537: TNS: connection closed。我一开始以为是白名单漏了B的IP结果登录服务器一看TCP.INVITED_NODES里明明写着192.168.10.16。后来查了半天发现应用服务器B的网卡有双IP一个是业务IP 192.168.10.16一个是管理IP 192.168.20.16而连接数据库时Oracle Net走的却是管理IP。也就是说IP白名单判断的是客户端实际发包源地址不是你在应用配置里想象的地址。最后把两个IP都加进白名单才解决。这个案例给我一个教训做白名单之前一定要在数据库侧V$SESSION或监听日志确认客户端实际来源IP而不是只听应用方报上来的IP。4.3 RAC、多监听、中间件等复杂环境注意点RAC环境下每个实例节点都有自己的sqlnet.oraSCAN监听器也有对应的配置。如果只改了其中一个节点就会出现“有些连接被限、有些连接不限”的奇葩现场而且由于负载均衡的存在行为还极不稳定。RAC环境务必所有节点同步修改并且统一测试。多监听器环境同理。有些库同时配置了1521和1526两个监听器或者一个监听器服务多个实例sqlnet.ora限制对所有这些监听器都生效因为规则就写在全局配置里。还有一种很隐蔽的情况数据库前面挂了连接池或负载均衡器比如应用程序直连的是某个中间件再由中间件连数据库。此时数据库看到的来源IP永远是中间件服务器的地址白名单里写用户终端IP毫无意义写中间件IP才对。遇到这类架构最好在动手前先和网络团队把链路图画清楚否则白名单上线必然引发大面积故障。5. 双保险方案与边界说明5.1 用 iptables 在系统层再挡一道sqlnet.ora虽然好用但它有个天然短板检查发生在Oracle Net协议层TCP三次握手已经完成如果有人拿扫描工具对1521端口做端口探测监听器依然会响应握手只是后续协议检查被拒。如果安全要求特别严可以用iptables在网络层提前拦截。以一台Linux数据库服务器为例允许192.168.10.0/24网段和10.2.1.80访问1521端口其他来源全部丢弃iptables -A INPUT -p tcp --dport 1521 -s 192.168.10.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 1521 -s 10.2.1.80 -j ACCEPT iptables -A INPUT -p tcp --dport 1521 -j DROP注意iptables规则是按顺序匹配的先放行、后拒绝的顺序不能反。用云数据库、云主机时更常见的是在安全组和网络ACL里配本质思路一样限制来源IP段的1521端口入站。其实更推荐的做法是iptables和sqlnet.ora双管齐下iptables挡住网络层的垃圾流量sqlnet.ora挡住那些穿透网络层、正经走到Oracle Net协议阶段的请求。两层配合才算真正把来源IP控制做扎实了。5.2 LOGON 触发器补齐到用户级如果你不仅想限制IP还想限制“某个用户只能从某个IP登录”那sqlnet.ora就不够用了得靠数据库触发器。思路很简单在用户登录成功、会话建立的那一刻检查SYS_CONTEXT(USERENV, IP_ADDRESS)不在允许范围内就抛出异常阻止登录。CREATE OR REPLACE TRIGGER check_ip_whitelist AFTER LOGON ON DATABASE BEGIN IF SYS_CONTEXT(USERENV, IP_ADDRESS) NOT IN ( 192.168.10.15, 192.168.10.16 ) THEN RAISE_APPLICATION_ERROR(-20001, Source IP is not allowed.); END IF; END; /这个方案的优劣都很明显。优点是粒度细可以做到应用账号、IP、时间窗口的组合控制缺点是它拦不住那些“不登录数据库但对监听器发起异常握手”的行为而且每次登录失败会在告警日志里产生一条记录如果业务上有大量轮询连接告警日志会被刷得很厉害。所以我通常建议把它作为sqlnet.ora的补充而不是替代。5.3 这套方案锁不住什么诚实地说任何一层限制都有它的盲区。sqlnet.ora只对走Oracle Net监听器的连接生效本地bequeath连接不在控制范围它判断的是发起连接的源IP如果用跳板机、堡垒机、或者应用是服务器端发起的连接看到的源IP就不是终端用户的IP它对已经建立的存量会话没有“踢下线”能力必须靠手工杀会话配合。另外这套配置本质上是“软件层门禁”遇到专门针对IP欺骗的攻击光靠它是不够的。这些边界不是劝退而是提醒你限制IP只是数据库访问控制拼图里的一块完整的方案应该包括监听器密码、防火墙、数据库审计、账号最小权限以及定期的日志审查。结合我自己的运维体会Oracle限制IP连接这个需求绝大多数场景用sqlnet.ora白名单就能干净利落地解决关键是动手前一定要把来源IP摸清楚改完一定要验证白名单内和白名单外两种情况再顺手把iptables加上做个双保险。踩过几次坑之后你就会发现这套方案最值钱的地方不在于配置多复杂而在于它能让你在安全审计面前拿得出清晰的控制策略同时又不会因为误操作把业务链路面堵死。
返回列表