如何通过调整Ubuntu下lsnrctl的安全配置来显著增强Oracle数据库的访问安全性?
- 内容介绍
- 文章标签
- 相关推荐
痛点概述这方面,为什么你需要强化 Ubuntu 上的 lsnrctl 安全
Oracle 监听器往往成为攻击者的首选入口:
-
未经授权的普通使用者可能直接执行
lsnrctl stop/start导致业务中断。 - 监听器口令泄露后攻击者可绕过数据库认证直接连接。
- 缺乏审计日志,使得非法操作难以追溯。
-
默认文件权限过宽,恶意脚本可以篡改
listener.ora或二进制文件。
针对以上痛点,这篇文章提供一套完整的安全加固方案。帮助你在 Ubuntu 上明显提高 Oracle 数据库的访问安全性。
一、操作程序层面的权限控制
1️⃣ 修改 lsnrctl 文件所有权
将 lsnrctl 二进制及其配置文件统一归属 oracle 使用者,避免 root 之外的使用者随意修改。怎么说呢,
# 将二进制文件归属为 oracle:oinstall
sudo chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl
# 将监听器配置文件归属为同一使用者
sudo chown oracle:oinstall $ORACLE_HOME/network/admin/listener.ora
sudo chown oracle:oinstall $ORACLE_HOME/network/admin/tnsnames.ora
2️⃣ 设置严格的文件权限
推荐使用 750或更严的 700 权限:
# 二进制文件仅所有者可执行
sudo chmod 750 /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl
# 配置文件仅所有者可读写
sudo chmod 640 $ORACLE_HOME/network/admin/listener.ora
sudo chmod 640 $ORACLE_HOME/network/admin/tnsnames.ora
3️⃣ 限定能够运行 lsnrctl 的使用者组
创建专用组 dba将需要管理监听器的 DBA 加入该组:
# 创建组
sudo groupadd dba
# 将 oracle 使用者加入 dba 组
sudo usermod -aG dba oracle
# 确认成员
groups oracle
二、通过 sudoers 精细授权
不希望 DBA 拥有完整 root 权限时可在 /etc/sudoers 中仅授权 lsnrctl 操作:
# 使用 visudo 编辑 sudoers
oracle ALL= NOPASSWD: /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl *
% dba ALL= NOPASSWD: /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl start。\
/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl stop,\
/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl reload
Pain point: 防止普通使用者通过 sudo 提高为 root 后随意执行任意命令,只保留对 lsnrctl 的受控访问。
三、监听器口令与本地操作保护
1️⃣ 为监听器设置强口令并加密存储
在 $ORACLE_HOME/network/admin/listener.ora 中使用加密口令:
# 示例:启用口令加密
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
)
)
)
ADMIN_RESTRICTIONS_LISTENER=ON
PASSWORDS_LISTENER =
# 使用 ORAPWD 工具生成加密口令
orapwd file=$ORACLE_HOME/network/admin/orapwlistener password=MY_STRONG_PASSWORD entries=10 format=12
2️⃣ 定期轮换监听器口令并记录变更日志
-
使用
`lsnrctl change_password`/`set password`. - 将每次变更写入审计日志。
- SLA 要求:至少每 90 天更换一次。
四、网络访问控制与防火墙硬化
a) 限定监听端口只能被可信 IP 访问
# 默认阻止所有入口流量
sudo ufw default deny incoming
# 开放本机及信任子网对 1521 的访问
sudo ufw allow from 10.10.10.0/24 to any port 1521 proto tcp comment 'Oracle Listener'
# 启用防火墙
sudo ufw enable
b) 使用 TCP Wrapper 或 hosts.allow/hosts.deny 双重过滤
# /etc/hosts.allow
listener : 10.10.10.* : ALLOW
# /etc/hosts.deny
listener : ALL : DENY
五、利用 SELinux/AppArmor 提高强制访问控制
Pain point: 即使文件权限被误改,仍能阻止未授权进程调用 lsnrctl。
a) AppArmor 配置示例
- Create a profile file:
/etc/apparmor.d/usr.bin.lsnrctl:
#include
#include
/usr/bin/lsnrctl {
# 限制只能读取配置文件目录
/u01/app/oracle/** r,# 禁止写入程序关键方法除非是 owner
/etc/** rwk,# 网络限制,仅允许本机或指定子网连接到端口 1521
network inet stream。
}
- 加载并强制启用:
# 加载配置并切换到 enforce 模式
sudo apparmor_parser -r -W /etc/apparmor.d/usr.bin.lsnrctl
sudo aa-enforce /usr/bin/lsnrctl
b) SELinux简易策略
# 创建自定义类型并绑定二进制文件
semanage fcontext -a -t bin_t "/usr/bin/lsnrctl"
restorecon -v /usr/bin/lsnrctl
semanage login -a -s staffu dbauser
ausearch -m avc -ts recent | audit2allow -w -a
六、审计、日志与实时监控
- a) 启用 auditd 对 lsnrctl 调用进行审计:
# 在 /etc/audit/rules.d/audit.rules 添加规则
-w /u01/app/oracle/product/19.0.0/dbhome1/bin/lsnrCtl -p x -k lsnrctl_exec
sudo systemctl restart auditd
ausearch -k lsnrctlexec --format raw | aureport -x --summary
- b) 配合 syslog 与 ELK/Kibana 实现集中化告警:
| 步骤 | 操作说明 |
|---|---|
| ① 收集日志 | 将 `/var/log/audit/audit.log` 转发至 rsyslog,接下来推送至 Logstash。 |
| ② 建立告警规则 | 当出现 `EXECVE` 且 `exe="/usr/bin/lsnrCtl"` 时触发 Slack/E‑mail 通知。 |
七、安全加固清单
- ☑ LsnrCtl 文件所有权统一为 oracle:oinstall。
- ☑ LsnrCtl 二进制权限设为 750;配置文件设为 640,
- ☑ Dba 使用者加入专属组,仅授予 sudo 执行 LsnrCtl 的权限。
- ☑ Sudoers 中限定具体子命令,并使用 NOPASSWD 防止交互式密码输入。
- ☑ Lsrnrc 加密口令 & ADMIN_RESTRICTIONS_LISTENER=ON。
-
☑ Lsrnrc 定期轮换密码,变更记录写入审计日志。说起来,☑ Kubernetes/UFW 防火墙只放通可信 IP 对端口 1521 的 TCP 流量。☑ AAppArmor 或 SELinux 强制限制 LsrnCtl 能够读取的方法与网络范围。☑ Aauditd 对 LsrnCtl 执行进行监控,并将事件推送至集中化 SIEM 网站。☑ C定期进行渗透测试或红队演练,验证上述防护是否生效。
八、从“防御”到“零信任”的跃迁
通过以上七大模块——程序权限、精细 sudo 授权、监听器口令硬化、网络防火墙、MAC 强制访问控制还有全链路审计——可以把原本松散且易被滥用的 lsnrctl 环境转变为“最小特权+可追溯”的安全程序。这样,即使攻击者获取了普通使用者账号,也只能在受限范围内执行预定义操作,从根本上降低 Oracle 数据库被非法访问或破坏的风险。实现真正意义上的Ubuntu + Oracle 零信任架构 **安全升级**。
痛点概述这方面,为什么你需要强化 Ubuntu 上的 lsnrctl 安全
Oracle 监听器往往成为攻击者的首选入口:
-
未经授权的普通使用者可能直接执行
lsnrctl stop/start导致业务中断。 - 监听器口令泄露后攻击者可绕过数据库认证直接连接。
- 缺乏审计日志,使得非法操作难以追溯。
-
默认文件权限过宽,恶意脚本可以篡改
listener.ora或二进制文件。
针对以上痛点,这篇文章提供一套完整的安全加固方案。帮助你在 Ubuntu 上明显提高 Oracle 数据库的访问安全性。
一、操作程序层面的权限控制
1️⃣ 修改 lsnrctl 文件所有权
将 lsnrctl 二进制及其配置文件统一归属 oracle 使用者,避免 root 之外的使用者随意修改。怎么说呢,
# 将二进制文件归属为 oracle:oinstall
sudo chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl
# 将监听器配置文件归属为同一使用者
sudo chown oracle:oinstall $ORACLE_HOME/network/admin/listener.ora
sudo chown oracle:oinstall $ORACLE_HOME/network/admin/tnsnames.ora
2️⃣ 设置严格的文件权限
推荐使用 750或更严的 700 权限:
# 二进制文件仅所有者可执行
sudo chmod 750 /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl
# 配置文件仅所有者可读写
sudo chmod 640 $ORACLE_HOME/network/admin/listener.ora
sudo chmod 640 $ORACLE_HOME/network/admin/tnsnames.ora
3️⃣ 限定能够运行 lsnrctl 的使用者组
创建专用组 dba将需要管理监听器的 DBA 加入该组:
# 创建组
sudo groupadd dba
# 将 oracle 使用者加入 dba 组
sudo usermod -aG dba oracle
# 确认成员
groups oracle
二、通过 sudoers 精细授权
不希望 DBA 拥有完整 root 权限时可在 /etc/sudoers 中仅授权 lsnrctl 操作:
# 使用 visudo 编辑 sudoers
oracle ALL= NOPASSWD: /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl *
% dba ALL= NOPASSWD: /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl start。\
/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl stop,\
/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl reload
Pain point: 防止普通使用者通过 sudo 提高为 root 后随意执行任意命令,只保留对 lsnrctl 的受控访问。
三、监听器口令与本地操作保护
1️⃣ 为监听器设置强口令并加密存储
在 $ORACLE_HOME/network/admin/listener.ora 中使用加密口令:
# 示例:启用口令加密
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
)
)
)
ADMIN_RESTRICTIONS_LISTENER=ON
PASSWORDS_LISTENER =
# 使用 ORAPWD 工具生成加密口令
orapwd file=$ORACLE_HOME/network/admin/orapwlistener password=MY_STRONG_PASSWORD entries=10 format=12
2️⃣ 定期轮换监听器口令并记录变更日志
-
使用
`lsnrctl change_password`/`set password`. - 将每次变更写入审计日志。
- SLA 要求:至少每 90 天更换一次。
四、网络访问控制与防火墙硬化
a) 限定监听端口只能被可信 IP 访问
# 默认阻止所有入口流量
sudo ufw default deny incoming
# 开放本机及信任子网对 1521 的访问
sudo ufw allow from 10.10.10.0/24 to any port 1521 proto tcp comment 'Oracle Listener'
# 启用防火墙
sudo ufw enable
b) 使用 TCP Wrapper 或 hosts.allow/hosts.deny 双重过滤
# /etc/hosts.allow
listener : 10.10.10.* : ALLOW
# /etc/hosts.deny
listener : ALL : DENY
五、利用 SELinux/AppArmor 提高强制访问控制
Pain point: 即使文件权限被误改,仍能阻止未授权进程调用 lsnrctl。
a) AppArmor 配置示例
- Create a profile file:
/etc/apparmor.d/usr.bin.lsnrctl:
#include
#include
/usr/bin/lsnrctl {
# 限制只能读取配置文件目录
/u01/app/oracle/** r,# 禁止写入程序关键方法除非是 owner
/etc/** rwk,# 网络限制,仅允许本机或指定子网连接到端口 1521
network inet stream。
}
- 加载并强制启用:
# 加载配置并切换到 enforce 模式
sudo apparmor_parser -r -W /etc/apparmor.d/usr.bin.lsnrctl
sudo aa-enforce /usr/bin/lsnrctl
b) SELinux简易策略
# 创建自定义类型并绑定二进制文件
semanage fcontext -a -t bin_t "/usr/bin/lsnrctl"
restorecon -v /usr/bin/lsnrctl
semanage login -a -s staffu dbauser
ausearch -m avc -ts recent | audit2allow -w -a
六、审计、日志与实时监控
- a) 启用 auditd 对 lsnrctl 调用进行审计:
# 在 /etc/audit/rules.d/audit.rules 添加规则
-w /u01/app/oracle/product/19.0.0/dbhome1/bin/lsnrCtl -p x -k lsnrctl_exec
sudo systemctl restart auditd
ausearch -k lsnrctlexec --format raw | aureport -x --summary
- b) 配合 syslog 与 ELK/Kibana 实现集中化告警:
| 步骤 | 操作说明 |
|---|---|
| ① 收集日志 | 将 `/var/log/audit/audit.log` 转发至 rsyslog,接下来推送至 Logstash。 |
| ② 建立告警规则 | 当出现 `EXECVE` 且 `exe="/usr/bin/lsnrCtl"` 时触发 Slack/E‑mail 通知。 |
七、安全加固清单
- ☑ LsnrCtl 文件所有权统一为 oracle:oinstall。
- ☑ LsnrCtl 二进制权限设为 750;配置文件设为 640,
- ☑ Dba 使用者加入专属组,仅授予 sudo 执行 LsnrCtl 的权限。
- ☑ Sudoers 中限定具体子命令,并使用 NOPASSWD 防止交互式密码输入。
- ☑ Lsrnrc 加密口令 & ADMIN_RESTRICTIONS_LISTENER=ON。
-
☑ Lsrnrc 定期轮换密码,变更记录写入审计日志。说起来,☑ Kubernetes/UFW 防火墙只放通可信 IP 对端口 1521 的 TCP 流量。☑ AAppArmor 或 SELinux 强制限制 LsrnCtl 能够读取的方法与网络范围。☑ Aauditd 对 LsrnCtl 执行进行监控,并将事件推送至集中化 SIEM 网站。☑ C定期进行渗透测试或红队演练,验证上述防护是否生效。
八、从“防御”到“零信任”的跃迁
通过以上七大模块——程序权限、精细 sudo 授权、监听器口令硬化、网络防火墙、MAC 强制访问控制还有全链路审计——可以把原本松散且易被滥用的 lsnrctl 环境转变为“最小特权+可追溯”的安全程序。这样,即使攻击者获取了普通使用者账号,也只能在受限范围内执行预定义操作,从根本上降低 Oracle 数据库被非法访问或破坏的风险。实现真正意义上的Ubuntu + Oracle 零信任架构 **安全升级**。

