Oracle监听器是Oracle数据库实例与外部客户端之间的通信桥梁,负责接收客户端的连接请求并转发到对应的数据库实例,其安全性直接关系到整个数据库系统的稳定与数据安全。如果监听器被恶意攻击、非法篡改配置或者未授权访问,可能导致数据库服务不可用、数据被窃取等严重后果,因此做好Oracle监听器的防护工作至关重要。

1. 修改默认监听器端口
Oracle监听器默认使用1521端口,这是攻击者扫描的重点目标,修改默认端口可以降低被自动化扫描工具发现的概率。修改方式如下:
-- 查看当前监听器配置
lsnrctl status
-- 停止监听器
lsnrctl stop
-- 修改listener.ora配置文件,将PORT从1521改为自定义端口,比如15210
-- listener.ora示例内容
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.10)(PORT = 15210))
)
)
-- 启动监听器
lsnrctl start
2. 设置监听器密码
为监听器设置管理密码,避免未授权用户直接通过lsnrctl命令修改监听器配置、停止监听器等操作。配置方式如下:
-- 进入监听器控制台 lsnrctl -- 设置密码,回车后输入新密码并确认 LSNRCTL> change_password Old password: New password: Reenter new password: -- 保存配置到listener.ora LSNRCTL> save_config
设置完成后,执行lsnrctl stop等管理命令时需要先输入密码验证,否则无法执行。
3. 限制监听器访问来源
通过配置tcp.validnode_checking和tcp.invited_nodes参数,只允许指定IP的客户端连接监听器,拒绝其他非法IP的访问请求。
-- 在listener.ora中添加以下配置,只允许192.168.0.0/24网段的IP访问
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.10)(PORT = 15210))
)
)
tcp.validnode_checking = yes
tcp.invited_nodes = (192.168.0.1, 192.168.0.2, 192.168.0.100)
如果需要拒绝特定IP,可以使用tcp.excluded_nodes参数配置黑名单。
4. 关闭动态服务注册
默认情况下Oracle实例会动态向监听器注册服务,攻击者可能利用动态注册伪造服务信息,建议关闭动态注册,使用静态注册方式。修改listener.ora添加静态服务配置:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orclpdb)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.10)(PORT = 15210))
)
)
同时在数据库参数中设置local_listener为空,禁止实例动态注册:
-- 登录数据库执行 alter system set local_listener='' scope=spfile; -- 重启数据库实例生效
5. 启用监听器日志审计
开启监听器的日志功能,记录所有连接请求、管理操作等信息,方便后续安全审计和攻击溯源。配置方式如下:
-- 进入监听器控制台 lsnrctl -- 开启日志 LSNRCTL> set log_status on -- 查看日志文件路径 LSNRCTL> show log_file
日志默认存储在$ORACLE_HOME/network/log/listener.log,建议定期备份和清理日志,避免占用过多磁盘空间。
6. 限制管理命令执行权限
只有数据库管理员账户可以执行lsnrctl相关管理命令,普通用户不应拥有该权限。在操作系统层面设置lsnrctl命令的访问权限,仅允许dba用户组执行:
-- Linux系统下修改权限 chown oracle:dba $ORACLE_HOME/bin/lsnrctl chmod 750 $ORACLE_HOME/bin/lsnrctl
7. 启用连接超时设置
设置监听器连接超时时间,避免恶意客户端发起大量半开连接占用监听器资源,导致正常用户无法连接。在listener.ora中添加以下配置:
-- 设置连接超时时间为30秒 CONNECT_TIMEOUT_LISTENER = 30
8. 启用传输加密
客户端与监听器之间的通信数据如果不加密,可能被中间人攻击窃取敏感信息,建议启用TCPS协议加密传输。首先需要配置Oracle的SSL证书,之后修改listener.ora:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.0.10)(PORT = 15210))
)
)
-- SSL相关配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
SSL_CLIENT_AUTHENTICATION = FALSE
客户端连接时也需要配置对应的SSL参数才能正常通信。
9. 定期更新Oracle补丁
Oracle会定期发布监听器相关的安全补丁,修复已知的安全漏洞,管理员需要定期查看Oracle官方安全公告,及时为数据库安装对应的补丁,避免已知漏洞被攻击者利用。
10. 监控监听器运行状态
通过脚本或者监控工具定期检查监听器的运行状态、连接数、日志异常等信息,一旦发现监听器异常停止、连接数突增等异常情况,及时进行处理。简单的监控脚本示例:
#!/bin/bash # 检查监听器状态 lsnrctl status | grep "The listener supports no services" if [ $? -eq 0 ]; then echo "监听器异常,无可用服务" | mail -s "Oracle监听器告警" admin@ipipp.com fi
11. 关闭不必要的协议支持
如果业务不需要IPC、管道等本地协议连接,可以在listener.ora中只保留TCP或者TCPS协议地址,关闭其他不必要的协议支持,减少攻击面:
-- 仅保留TCP协议,删除其他协议地址
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.10)(PORT = 15210))
)
)
以上11种方法从配置、访问控制、加密、监控等多个层面加固Oracle监听器的安全性,管理员可以根据实际业务场景选择对应的防护措施,组合使用可以达到更好的防护效果,有效降低Oracle监听器被攻击的风险,保障数据库系统的稳定运行。