SQL*Plus 在 CentOS 上的安全设置清单
一 系统层安全
- 使用专用的低权限系统账号(如 oracle)运行 SQL*Plus,禁止以 root 直接执行;为该账号设置强口令、最小权限与登录受限(仅允许 sudo 到 oracle,禁止直接登录)。
- 严格控制文件与目录权限:Oracle 软件目录(如 $ORACLE_HOME)、客户端目录(如 /opt/oracle/instantclient)、以及包含连接串或脚本的目录,设置为仅属主可读写执行,组和其他人最小化权限(如 750/640)。
- 清理历史与敏感信息:禁止在命令行中明文书写密码;在脚本中调用 SQL*Plus 时,使用“/nolog + connect”方式或 Here Document,避免在 ps 输出中暴露口令;必要时使用 rlwrap 提升交互体验但不改变口令安全属性。
- 审计与账号状态:定期核查 /etc/passwd、/etc/shadow、/etc/group,排查异常账户、锁定状态(如 LK/NP)、以及空口令;对 oracle 账号启用登录失败锁定与过期策略(chage),减少被暴力尝试的风险。
二 数据库层安全(通过 SQL*Plus 配置)
- 口令复杂度与生命周期:以 / as sysdba 登录 SQL*Plus,运行 @?/rdbms/admin/utlpwdmg.sql 创建复杂度函数(如 verify_function_11G),在 DEFAULT 或自定义 PROFILE 中启用:
- 复杂度:设置 PASSWORD_VERIFY_FUNCTION = verify_function_11G(默认要求长度≥8,包含数字/大小写/特殊字符中至少3类)。
- 失败锁定:设置 FAILED_LOGIN_ATTEMPTS ≤ 6,并配合 PASSWORD_LOCK_TIME 自动解锁。
- 历史复用:设置 PASSWORD_REUSE_MAX ≥ 5(禁止复用最近 5 次口令)。
- 生命周期:设置 PASSWORD_LIFE_TIME ≤ 90 天(可按需收紧至 60–90 天)。
- 最小权限原则:仅为应用/运维账号授予所需权限,避免使用 DBA 角色;按需授予 CONNECT、RESOURCE 等,并细化到对象级权限。
- 连接安全:优先采用 OS 认证 本地维护(如 sqlplus / as sysdba);远程连接使用 EZCONNECT 或 TNS 配置,避免在命令行中暴露口令;如需脚本自动化,使用 /nolog + connect 方式隐藏密码。
三 网络安全
- 监听与端口:仅开放必要端口(Oracle 默认 1521/TCP),通过 firewalld 精细化放行:
- 开放端口:firewall-cmd --zone=public --add-port=1521/tcp --permanent
- 重载规则:firewall-cmd --reload
- 监听绑定与访问控制:在 listener.ora 中绑定到内网地址(如 HOST=127.0.0.1 或内网 IP),仅对受控网段开放;必要时结合 sqlnet.ora 的 TCP.VALIDNODE_CHECKING/TCP.EXCLUDED_NODES 做来源地址限制。
- 传输加密:启用 Oracle Advanced Security 的 SSL/TLS 加密(客户端与数据库之间、或中间件与数据库之间),防止口令与数据在传输中被窃听。
四 审计与合规
- 启用数据库审计(如 AUDIT_TRAIL=DB/XML),对 CONNECT、DDL、GRANT/REVOKE 及关键业务表进行审计;定期导出与归档审计日志,防止篡改。
- 定期核查并清理默认/弱口令账户(如历史上常见的 SYS/CHANGE_ON_INSTALL、SYSTEM/MANAGER),对 OPEN 状态账户统一纳入 PROFILE 管理。
- 结合等保要求,留存账号、权限、口令策略、监听与防火墙配置、审计日志的配置与核查记录,形成闭环整改与复核。
五 快速检查命令清单
- 系统账号与权限:
- 查看账户与登录 Shell:getent passwd oracle
- 查看锁定/空口令状态:passwd -S oracle;空口令排查:getent shadow oracle
- 登录失败与过期策略:chage -l oracle
- Oracle 口令策略(SQL*Plus):
- 查看复杂度函数:SELECT * FROM dba_profiles WHERE resource_name=‘PASSWORD_VERIFY_FUNCTION’;
- 失败锁定:SELECT * FROM dba_profiles WHERE resource_name=‘FAILED_LOGIN_ATTEMPTS’;
- 历史复用:SELECT * FROM dba_profiles WHERE resource_name=‘PASSWORD_REUSE_MAX’;
- 生命周期:SELECT * FROM dba_profiles WHERE resource_name=‘PASSWORD_LIFE_TIME’;
- 网络与监听:
- 防火墙放行端口:firewall-cmd --list-ports | grep 1521
- 监听状态:lsnrctl status(核对监听地址与端口)