在 Debian 上使用 SQL*Plus 的安全设置
一 运行环境与最小权限
- 使用专用的操作系统账户(如 oracle)运行 SQL*Plus,避免以 root 直接执行;将 oracle 加入 oinstall、dba 组,并按需设置 sudo 规则,仅授权必要的运维命令。
- 采用 Oracle Instant Client 的 Basic + SQL*Plus 包,解压到如 /usr/local/sqlplus,创建软链到 /usr/local/bin,并设置环境变量:
- 建议将 ORACLE_HOME 指向 Instant Client 目录(如:/usr/local/sqlplus),将 $ORACLE_HOME/bin 置于 PATH 前,设置 LD_LIBRARY_PATH=$ORACLE_HOME/lib。
- 数据库侧遵循最小权限:仅为应用/运维账户授予所需权限,避免滥用 DBA;例如普通账户至少应拥有 CREATE SESSION,否则会出现登录被拒。
- 网络与监听仅开放必要来源与端口,优先使用本地 IPC 或 TLS 加密通道,限制对外暴露。
二 登录与凭据的隐蔽性
- 禁止在命令行中直接书写密码(如:sqlplus user/pass),因为密码会出现在 ps 进程列表与 shell history 中;推荐使用 /nolog 登录后再连接:
- 示例:
- sqlplus /nolog
- SQL> conn scott/tiger
- 交互式输入密码或使用受控方式读取密码文件;脚本中如需非交互,可将密码放入受限权限文件(仅属主可读),并在脚本内读取后立即清理内存引用:
- 示例:
- 创建密码文件:echo ‘tiger’ > scott.pwd && chmod 500 scott.pwd
- 读取:pwd=$(cat scott.pwd); sqlplus -S scott/$pwd <<‘EOF’ … EOF
- 使用 -S(silent)减少屏幕回显,避免敏感信息输出到日志或控制台。
三 脚本与自动化调用安全
- 在 Shell 脚本中调用 SQL*Plus 时,关闭回显与反馈、仅输出必要结果,减少日志泄露:
- 示例:
- sqlplus -S /nolog <<‘EOF’
set heading off pagesize 0 feedback off verify off echo off
conn scott/tiger
select sysdate from dual;
exit
EOF
- 避免在 cron 或公共目录中存放明文密码;若必须自动化,使用权限为 500 的密码文件或外部密钥管理服务(KMS),并在任务结束后立即清理临时凭据。
- 将 SQL*Plus 脚本与日志目录的权限收紧(如 750/640),仅允许 oracle 组访问。
四 操作系统层面的加固
- 启用 PAM 密码策略与复杂度检查:
- 安装组件:sudo apt install libpam-pwquality
- 编辑 /etc/pam.d/common-password,为本地账户设置复杂度与长度,例如:
- password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 difok=4 reject_username enforce_for_root
- 在 /etc/login.defs 中设置密码生命周期(如 PASS_MAX_DAYS 30),并可用 chage 对特定用户设置最小/最大天数、宽限期与过期提醒。
- 限制 sqlplus 可被哪些账户执行(如仅 oracle 组):
- sudo chown root:oinstall /usr/local/bin/sqlplus
- sudo chmod 750 /usr/local/bin/sqlplus
- 审计与合规:开启 auditd 对关键目录与命令的访问审计;定期轮换数据库与应用账户口令,并审查 ~/.bash_history、脚本与日志中的残留凭据。