确保lsnrctl二进制文件的权限严格受限,仅允许授权用户(如oracle)访问。通常需将文件所有者设为root,组设为oracle,并设置权限为750(所有者可读、写、执行;组可读、执行;其他用户无权限)。例如:
sudo chown root:oracle /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl # 修改所有者和组
sudo chmod 750 /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl # 设置权限
此外,监听器配置文件(listener.ora,位于$ORACLE_HOME/network/admin)需设置为600权限,防止未授权修改:
sudo chmod 600 $ORACLE_HOME/network/admin/listener.ora
通过sudoers文件控制哪些用户可以执行lsnrctl命令,避免直接赋予普通用户root权限。使用visudo命令安全编辑/etc/sudoers,添加如下规则(以oracle用户为例):
oracle ALL=(oracle) NOPASSWD: /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl * # 允许oracle用户无需密码执行lsnrctl
此配置仅允许指定用户以oracle身份运行lsnrctl,降低权限滥用风险。
若系统启用SELinux或AppArmor,需配置相应策略限制lsnrctl的访问:
sestatus),若为Enforcing模式,可为lsnrctl设置正确的安全上下文:sudo chcon -t oracle_exec_t /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl
sudo aa-status),编辑/etc/apparmor.d/usr.sbin.lsnrctl文件,添加允许lsnrctl访问的路径(如$ORACLE_HOME)和操作(如read、execute)。Oracle监听器默认使用1521端口(TCP),需通过防火墙限制仅允许信任IP访问。以ufw为例:
sudo ufw allow from <trusted_ip> to any port 1521/tcp # 仅允许trusted_ip访问1521端口
sudo ufw enable # 启用ufw
若使用iptables,可添加如下规则:
sudo iptables -A INPUT -p tcp --dport 1521 -s <trusted_ip> -j ACCEPT # 允许trusted_ip
sudo iptables -A INPUT -p tcp --dport 1521 -j DROP # 拒绝其他IP
修改listener.ora文件,增强监听器的安全性:
lsnrctl set password命令),并定期更换;SECURITY_LISTENER = (ENCRYPTION_CLIENT = REQUIRED)
ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)
SSL_VERSION = 1.2
SSL_CIPHER_SUITES = (TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256)
HOST参数限制监听器绑定的IP地址(如仅绑定内网IP),或启用ADMIN_RESTRICTIONS阻止运行时修改(需停止监听器后修改):ADMIN_RESTRICTIONS_LISTENER = ON
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))))
auditd服务记录数据库活动,监控listener.log(位于$ORACLE_HOME/network/log)中的异常访问(如频繁失败登录、非法IP尝试连接),及时预警潜在攻击。若启用SSL加密,需使用Oracle Wallet安全存储证书和密钥:
mkstore -wrl /path/to/wallet -create
mkstore -wrl /path/to/wallet -importcert -alias server_cert -file cert.pem
mkstore -wrl /path/to/wallet -importkey -alias server_key -file key.pem
sqlnet.ora:指定Wallet路径和认证服务(如TCPS):WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /path/to/wallet)))
SQLNET.AUTHENTICATION_SERVICES = (TCPS)