核心是阻断敏感命令写入shell历史并加强审计。通过HISTCONTROL、HISTIGNORE、set+o history禁用记录;用环境变量、K8s Secret、Vault等替代命令行传参;再以inotifywait监控、grep检查、tmpfs重定向实现审计与清理。

核心思路是切断“命令历史自动记录敏感内容”这个路径,再补上审计能力。Token 和密码一旦出现在 shell 历史(~/.bash_history 或 ~/.zsh_history)里,就等于裸露在磁盘明文文件中,后续任何权限失控、日志归集、备份导出都可能造成泄露。
立即阻断:禁用敏感命令的历史记录
不是靠人记住不输入,而是让 shell 主动跳过记录特定命令。以 bash 为例,在自动化账号的 shell 配置文件(如 ~/.bashrc)中添加:
- 设置 HISTCONTROL=ignorespace:让以空格开头的命令不进历史(适合临时加前缀规避)
- 设置 HISTIGNORE="git*,curl*,wget*,aws*,aliyun*,tencentcloud*,kubectl*,helm*" :直接屏蔽所有高风险 CLI 工具的命令记录
- 部署脚本开头加 set +o history:在关键流水线执行段关闭历史记录,执行完再 set -o history 恢复(需 shell 支持)
替代方案:用凭证注入代替命令行传参
绝大多数 Token 泄露源于把密钥当参数拼进命令,比如 curl -H "Authorization: Bearer $TOKEN" ...。应改为:
- 通过环境变量注入,并在调用前用
export -n TOKEN确保不被子进程继承或记录 - 使用
Secret类型的 Kubernetes Volume 挂载到容器内,由应用读取文件而非命令行 - 对接 Jenkins Credentials Binding 插件或 HashiCorp Vault Agent,让工具自动注入,全程不触碰明文
补上审计:对历史文件本身做行为监控
即使做了拦截,也要假设历史文件可能已被污染。建议启用轻量级审计:
- 用
inotifywait监控~/.bash_history文件变更,发现写入立即触发告警或自动清理含 token 的行 - 在 CI 流水线最后一步加入检查脚本:
grep -E "(token|secret|akid|sk|password)" ~/.bash_history && exit 1,失败即中断发布 - 将历史文件重定向到内存文件系统(
tmpfs),重启即清空,避免长期留存
关键不在“能不能看到”,而在“根本不会写进去”。从源头堵住,比事后扫描更可靠。

















