当前位置: 首页 > news >正文

Shell 脚本中如何安全存储数据库密码避免明文?

在 Shell 脚本中安全存储数据库密码,核心原则是“最小权限”与“分离存储”。对于 MySQL/MariaDB,推荐使用加密登录路径(mysql_config_editor)或权限受限的配置文件(~/.my.cnf);对于 PostgreSQL,使用 .pgpass 文件。严禁将密码硬编码在脚本或命令行参数中。

先说结论:明文密码绝不应出现在脚本代码或命令行参数里,优先采用配置文件权限控制或专用凭证管理工具。

  • 先判断:确认当前脚本是否包含明文密码,检查文件权限是否为他人可读。
  • 优先做:将密码移至权限严格的配置文件(chmod 600)或使用 mysql_config_editor 加密存储。
  • 再验证:通过进程列表检查密码是否泄露,并测试脚本能否正常连接数据库。

方案对比与适用范围

本文主要以 MySQL/MariaDB 为例,PostgreSQL 等数据库原理类似。不同方案的安全性对比如下:

  • 配置文件(~/.my.cnf):密码仍为明文存储,但通过操作系统权限(chmod 600)保护。适用于一般内部环境,不满足高等级安全合规(如等保)要求
  • 加密登录路径(mysql_config_editor):密码存储在加密文件(~/.mylogin.cnf)中,安全性更高。适用于生产环境。
  • 凭证管理工具(Vault/CI/CD Secrets):密码不落地,运行时动态注入。适用于高安全需求及自动化流水线。

MySQL 安全配置实操

方案一:加密登录路径(推荐)

MySQL 5.6.6+ 版本支持加密存储凭证,凭证文件默认存储在 ~/.mylogin.cnf。注意该文件与当前用户及主机绑定,备份还原时需小心权限问题

# 设置加密登录路径,执行后会提示输入密码(输入时不显示)
mysql_config_editor set `--login-path`=local `--user`=root `--password` `--host`=localhost# 脚本中调用时不再需要 -p 参数
mysql `--login-path`=local -e "SELECT 1;"

方案二:受限配置文件(通用)

在用户主目录下创建 .my.cnf 文件,内容如下:

[client]
user=db_user
password=YourSecurePassword
host=localhost

立即执行权限限制命令,确保仅所有者可读写:

chmod 600 ~/.my.cnf
chown $(whoami):$(whoami) ~/.my.cnf

脚本错误处理与验证

在 Shell 脚本中连接数据库时,必须增加错误处理逻辑,避免脚本在连接失败后继续执行导致数据不一致。

#!/bin/bash# 执行 SQL 并检查退出状态
if ! mysql `--login-path`=local -e "SELECT 1;" > /dev/null 2>&1; thenecho "[ERROR] Database connection failed"# 可在此处添加告警通知逻辑exit 1
fiecho "[INFO] Database connection successful"
# 继续执行后续业务逻辑

验证步骤:

  1. 检查文件权限:执行 ls -l ~/.my.cnfls -l ~/.mylogin.cnf,确认权限为 -rw------- (600)。
  2. 检查进程泄露:脚本运行期间,新开终端执行 ps -ef | grep mysql,确认输出中不包含密码字符串。
  3. 测试连接:手动执行修改后的脚本,确认能成功连接且无密码提示报错。

PostgreSQL 简要方案

PostgreSQL 客户端支持 ~/.pgpass 文件存储密码。格式为 hostname:port:database:username:password

# 创建文件
echo "localhost:5432:mydb:myuser:mypassword" > ~/.pgpass# 必须设置权限为 600,否则客户端会忽略该文件
chmod 600 ~/.pgpass

CI/CD 环境凭证注入

在 Jenkins、GitLab CI 或 GitHub Actions 中,不建议使用配置文件,应利用平台提供的秘密管理功能:

  • 配置秘密变量:在 CI/CD 平台设置 DB_PASSWORD 等变量,标记为 Protected/Masked。
  • 脚本引用:在 Shell 脚本中通过环境变量读取,如 mysql -u user -p$DB_PASSWORD
  • 注意:即便如此,命令行参数仍可能出现在进程列表。更优解是使用支持环境变量读取密码的客户端配置或专用 Secret 工具。

常见风险与排查

1. 根用户与普通用户混淆

如果用 root 用户创建了配置文件,但脚本是用普通用户通过 sudo 或 cron 运行的,普通用户可能无法读取 root 主目录下的配置文件。确保配置文件属于运行脚本的账户。

2. 配置文件权限被重置

某些自动化部署工具或备份还原操作可能会重置文件权限。在部署流程中需加入权限检查步骤,确保 chmod 600 始终生效。

3. 备份风险(.mylogin.cnf)

加密登录文件 ~/.mylogin.cnf 包含加密密钥,直接复制到其他机器可能无法解密。备份时需注明依赖关系,或优先使用配置文件方案便于迁移。

4. 历史命令记录

在终端手动输入密码测试时,密码可能被保存在 ~/.bash_history 中。测试完成后,建议清理历史记录或设置 HISTIGNORE 忽略敏感命令。

原文链接:https://www.zjcp.cc/ask/10998.html

http://www.jsqmd.com/news/809697/

相关文章:

  • 海口CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 基于 4SAPI 的企业文档智能处理系统:效率提升 20 倍,信息提取准确率 95%
  • 告别手动整理:用油猴脚本一键提取百度网盘群文件目录树
  • 第八部分-企业级实践——37. 容器编排选型
  • 长沙CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 3步魔法!用DupeGuru彻底清理电脑重复文件,释放50%存储空间
  • 别光看逻辑!用1200PLC做电梯控制,这些硬件仿真细节才是关键
  • 2026汕头婚纱摄影排名|消费者综合满意度与体验度 - charlieruizvin
  • 半导体产业模式抉择:从IDT与AOS晶圆厂交易看Fabless与Fab-lite战略
  • Axure RP中文语言包技术深度解析:从键值对到国际化架构的工程实践
  • Android原生AI智能体平台Zero:Rust核心与多通道集成的工程实践
  • 绍兴CMA甲醛检测治理公司及洁净室公共卫生检测报告排行榜(2026版) - 张诗林资源库
  • 西安制冷设备回收选哪家?2026真实场景拆解靠谱服务商 - 奔跑123
  • Kali linux 学习标题
  • 保姆级排错:从‘尚未注册SQLNCLI11’到成功创建SQL Server链接服务器的完整心路
  • IM CLI Bridge:通过即时通讯软件远程操控AI编程工具
  • 凉山CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 如何快速将STL转换为STEP:5个高效转换技巧指南
  • Prompt is Search:GCG 与大模型对抗后缀攻击
  • 极域电子教室破解终极指南:如何在机房环境中重获电脑控制权
  • 终极矢量图标库完全指南:Remix Icon 3200+免费图标深度解析
  • 从零到一:Windows环境下Oracle19c的完整部署与实战配置
  • 2026年武汉留学中介深度评测,家长信赖,好评多 - 资讯焦点
  • 【Slogan生成紧急避坑指南】:上线前必查的6项合规性雷区(含GDPR/广告法双校验清单)
  • 基于Next.js与Hygraph构建高性能IAM软件目录:静态数据模式实战
  • 避开这3个坑,你的MAX30102心率数据才更准(Arduino实测经验分享)
  • 探索NS模拟器自动化管理:从繁琐到简单的奇妙旅程
  • 齐齐哈尔CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 2026年北京柴火鸡土菜餐饮:活鸡现杀现做的烟火美学与玖味时光官方直达指南 - 企业名录优选推荐
  • 别只盯着YOLOv5了!从R-CNN到DETR:手把手带你看懂目标检测算法演进史(附论文精读笔记)