Shell 脚本中避免明文存储数据库密码的最可靠方案是使用操作系统权限控制的配置文件或专用密钥管理工具,禁止将密码直接写在脚本代码里。适用场景涵盖从单机定时任务到集群自动化运维,风险边界在于配置文件权限设置错误或密钥工具访问凭证泄露。
先说结论:生产环境严禁在脚本内硬编码密码,优先使用权限受限的配置文件或密钥管理服务,测试环境可使用环境变量过渡。
- 先判断:确认脚本执行身份及密码访问范围,区分单机脚本与集群调度场景
- 优先做:将密码移至权限设置为 600 的配置文件或注入环境变量,移除脚本中的明文赋值
- 再验证:检查文件权限、进程列表及 Shell 历史记录,确保无密码残留
命令速用版
以下是快速保护数据库密码的常用命令组合,适用于 MySQL 和 PostgreSQL 常见场景。
# 设置配置文件权限,仅所有者可读写 chmod 600 ~/.my.cnf chmod 600 ~/.pgpass # 临时通过环境变量传递密码(避免出现在进程参数中) export DB_PASSWORD="your_secure_password" # 查看当前用户下的敏感文件权限 ls -l ~/.my.cnf ~/.pgpass .env
为什么会这样
明文密码泄露的核心原因是脚本文件、进程列表或历史记录容易被未授权用户读取。Shell 脚本通常存储在普通目录中,若权限设置宽松,同一服务器上的其他用户可能查看脚本内容获取密码。此外,直接在命令行传递密码参数会导致密码出现在 ps -ef 进程列表中,而硬编码在脚本中则会导致密码随代码进入版本控制系统或备份文件。
分步处理
按照以下步骤逐步移除明文密码并建立安全存储机制。
步骤 1:移除脚本中的硬编码密码
打开脚本文件,搜索 password、passwd、pwd 等关键词,删除直接赋值的明文密码行。若脚本必须获取密码,改为从文件或环境变量读取。
步骤 2:创建受保护的配置文件
对于 MySQL,在用户家目录创建 .my.cnf 文件,写入 [client] 配置块包含 user 和 password。对于 PostgreSQL,创建 .pgpass 文件,格式为 hostname:port:database:username:password。执行 chmod 600 命令限制文件权限,确保仅当前用户可读写。
步骤 3:使用环境变量注入
在调用脚本前,通过 export 命令设置环境变量,或在 CI/CD 流水线中配置 Secret 变量。脚本内部通过 $DB_PASSWORD 引用,避免密码出现在脚本文件本身。
步骤 4:引入密钥管理工具(生产环境推荐)
对于集群或高安全需求场景,使用 HashiCorp Vault 或云厂商密钥管理服务。脚本启动时通过 API 动态获取临时凭证,避免密码长期存储在本地文件中。
怎么验证是否生效
执行以下检查确认密码已安全存储且无泄露风险。
检查文件权限:运行 ls -l 命令查看配置文件权限,确认权限位为 -rw------- 或 600,属主为当前执行用户。
检查进程列表:在脚本运行期间,执行 ps -ef | grep 脚本名 命令,确认输出参数中不包含密码字符串。
检查历史记录:运行 history 命令查看 Shell 历史,确认没有包含明文密码的命令记录,必要时使用 history -c 清理或设置 HISTIGNORE 忽略敏感命令。
检查版本控制:使用 git status 或查看代码仓库,确认配置文件已加入 .gitignore,未被提交到远程仓库。
常见坑
以下场景容易导致密码意外泄露,操作时需格外谨慎。
备份文件泄露:修改配置文件时生成的备份文件(如 .my.cnf.bak)可能保留旧权限,需手动删除或同样设置 chmod 600。
日志打印密码:脚本中开启调试模式(set -x)或错误日志配置不当,可能导致变量值被打印到日志文件中,需确认日志脱敏。
环境变量继承:子进程会继承父进程的环境变量,若父 Shell 历史中包含 export 密码命令,仍需清理历史记录。
临时文件残留:脚本运行过程中生成的临时文件若包含密码,需在退出前使用 trap 命令确保删除。
常见问题
使用 Base64 编码密码是否安全?
不安全,Base64 仅是编码而非加密,任何人均可轻易解码还原明文,不能替代权限控制或加密存储。
MySQL 脚本必须写密码怎么办?
使用 ~/.my.cnf 配置文件并设置 600 权限,脚本调用 mysql 命令时会自动读取该文件,无需命令行传参。
环境变量会被其他用户看到吗?
同一用户下的进程可见,但其他用户通常无法查看你的环境变量,不过仍需谨慎避免在公共日志中打印变量值。
如何管理多台服务器的数据库密码?
建议使用 Ansible Vault 或专用密钥管理工具统一分发和轮换密码,避免在每台服务器上手动维护配置文件。
参考来源
- MySQL Official Documentation, "Using Option Files", dev.mysql.com
- PostgreSQL Official Documentation, "The Password File", postgresql.org
- OWASP Foundation, "Secrets Management", owasp.org