处理需要数据库(MySQL)密码的脚本的安全方法是什么?

显然,我们不想在每个脚本中对明文密码进行硬编码.这会使密码循环变得困难,因为除了密码首先是明文密码之外,还需要更改大量的脚本.

如果脚本将密码作为参数,那么我们需要担心修改’ps’输出以不显示密码参数的值.我们还必须担心shell历史记录中记录的命令.这可以通过bash上的HISTIGNORE / HISTCONTROL来处理,但是还有其他shell在使用时具有不同且灵活性较差的控件(例如:zsh).
我们还可以使用特定于命令行的环境变量(FOO = bar ./script),而’FOO = bar’不会显示在’ps’中,默认情况下它仍会记录到shell历史记录中.此外,一些系统无论如何都会暴露其他用户的过程环境(通过“ps”).

可以使用密码(配置)文件来简单地存储明文密码.该文件可以拥有/许可,以加强其访问权限.但是,在一天结束时,您仍然有明文密码.

提示也是一种选择,但这往往不那么方便(例如,仍然可以通过期望),并且如果脚本需要,则使非交互性变得复杂.

可以使用某些风格的加密,但是我们仍然有类似的问题来处理解密密钥.

我应该选择以上其中一种吗?其他选择可能更优越吗?人们如何处理这种情况是一种安全的方式?

这里的一般目标是,如果攻击者以某种方式进入使用数据库服务器的系统,则攻击者不应该能够组成数据库服务器.例如,攻击不应该只是找到位于某处的密码,不应该观察系统(‘ps’)来发现它,并且不应该“回顾过去” (shell历史)找到它.

我正在完善意识到有数百万个场景(kmem,交换页面等等等),并且如果攻击者获得root或物理访问并且没有任何东西是100%安全的话,大多数赌注都会被关闭.我只是在寻找合理的最佳方法. 🙂

最佳答案
您可以将.my.cnf文件放在可以访问脚本的用户的主目录中,其信息和mysql可以从那里而不是命令行读取它.你还必须设置一个环境变量来指向〜/ .my.cnf,但是……我不确定它是MYSQL_HOME还是SYSCONFDIR或其他*.它仍然是一个纯文本文件,但如果你将该文件限制为仅限所有者,它应该没问题?它至少会将密码保留在ps之外.

MySQL: Option FilesMySQL: Password Security doc页面都暗示了这一点.

(*免责声明:我不是任何定义的管理员,只是遇到麻烦)

转载注明原文:处理需要数据库(MySQL)密码的脚本的安全方法是什么? - 代码日志