在命令行上使用MySQL密码的安全替代方法是什么?


35

我们有一个PHP命令行脚本来对数据库进行版本控制。每当开发人员添加新的数据库修补程序时,我们都会运行此脚本。

该脚本使用MySQL命令行运行补丁:

system('mysql --user=xxx --password=xxx < patch.sql');

但是,MySQL 5.6现在发出以下警告:

警告:在命令行界面上使用密码可能不安全

这显然是正确的,但对于用户而言可能是问题,也可能不是问题。

  • 那么安全的替代方法是什么?
  • 或者,可以禁用此警告吗?

请注意,我不需要依赖外部密码文件。


2
将凭据存储在文件中并不是什么大问题。如果某人在您的服务器上具有root特权,则他们可以完全绕过身份验证系统,只需通过使用特定选项重新启动mysql服务器即可。
Zoredache

与建议的副本问题不同。MySQL不会提示您输入密码,我正在提供密码,并且可以正常工作。我正在寻找提供密码的替代方法,密码文件除外。
本杰明·

Answers:


17

在最新的GA版本的MySQL(即5.6 版)中 ,您可以通过mysql_config_editor命令执行此操作,如http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html中所述

基本上,它的作用是:使用主机别名对用户/密码进行加密,然后使用主机别名,将此信息放入主目录中的配置文件中,然后在需要时将其替换为类似的操作:

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

您改为:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

从而避免将密码以明文形式输入到某些脚本中。

为此,您首先必须(仅一次)定义myhostalias为:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

您可以根据需要为不同的帐户和/或主机使用不同的登录路径。如果你问我,那是个很好的主意。

值得一提的是,我相信该功能在5.6以下的任何版本中都不存在。


注意:我确实意识到mysql_config_editor实际上确实创建了一个外部密码文件,但是,这不是由您完成的,而是系统的工作方式,因此,您无需手动进行加密/解密。
2013年

谢谢,我使用的是MySQL 5.6,所以这不是问题。就是说,您的方法仍然存在问题(至少与我们目前的工作方式有关),因为我想实时地从PHP配置文件中获取密码,并将其动态传递给命令行。根据您的建议,我在调用时仍然必须在命令行上使用密码mysql_config_editor,因此不幸的是,它并不会带来更多的价值。我还试图避免让开发人员手动执行此操作,因此必须同时维护PHP配置文件 mysql配置。
本杰明·

我最好的解决方案可能是暂时忽略警告。我实际上是在怀疑是否存在任何安全问题:因为是从PHP调用的,所以我猜命令行没有存储在bash历史记录中或计算机上的其他任何地方?
本杰明·

不据我所知,不,bash历史记录不存储它。但是,密码在php config文件中为纯文本格式时,会以另一种形式承担完全相同的风险。也许您会更喜欢使用mysql_config_editor存储密码并将登录路径存储在您的php配置文件中?这样,您就不会在任何地方公开密码。(但仍然必须维护外部密码)。
13年

9

使用--defaults-file--defaults-extra-file选项。您可以在其中指定用户名和密码。与的格式相同/etc/my.cnf

进一步阅读,您说您不想依靠外部密码文件,但这是唯一真正安全的方法。其他任何事情都会在过程表中留下痕迹。如果您确实愿意,甚至可以将密码文件放入版本控制中。将其设置为600(或400),并且只能由mysql或运行它的用户读取。


1
出于安全原因,我不反对使用密码文件,只是MySQL凭据是PHP应用程序中全局配置的一部分(也用于PDO连接),这样做意味着仅创建(临时)密码文件为了在脚本的生存期内(几秒钟)运行mysql命令行。
本杰明·

如何在Windows Server 2012上执行此操作?包含--defaults-file选项的配置文件在哪里?
杰克

您只需将文件指定为--defaults-file的选项即可,例如:mysql --defaults-file c:\some\dirs\my.cnf
lsd

@Benjamin,所以,如果这与安全无关,那么只需在命令行中输入密码即可。这样做有什么问题(除了安全性)?
Pacerier

@Benjamin如果您已经在使用PHP中的MySQL,那么为什么要分叉mysql控制台客户端呢?
Josip Rodin

5

每个http://dev.mysql.com/doc/refman/5.1/zh-CN/password-security-user.html您有4个选项

  • 在命令行上使用-pyour_pass--password=your_pass选项
  • 在命令行上使用-p--password选项,未指定密码值。在这种情况下,客户端程序以交互方式请求密码:
  • 将密码存储在选项文件中。
  • 将密码存储在MYSQL_PWD环境变量中

对于您的需求,MYSQL_PWD也许是一种选择,但它不再安全。确实,您应该使用生成一个交互过程--password并以交互方式提交密码,但这是解决此问题的相当复杂的方法。


1
与命令行相比,MYSQL_PWD的安全性如何降低?PW从未出现在进程列表中,这似乎是最主要的问题
TheLQ 13'Feb

1
当然可以。man ps-E Display the environment as well. 从我挂网址:指定MySQL密码必须是极不安全的,不应该使用这种方法。某些版本的ps包含一个选项,用于显示正在运行的进程的环境。在某些系统上,如果您设置MYSQL_PWD,您的密码将向运行ps的任何其他用户公开。即使在没有此类ps版本的系统上,假设用户没有其他方法可以检查进程环境也是不明智的。
RS

从这个MYSQL_PWD选项中进行选择:我猜想,如果您在某个脚本的开头设置环境变量,然后调用MySQL命令行,然后在脚本结束后清除该内容,则可以至少减少暴露时间。听起来合理吗?
2014年

@kormoc,请详细说明最后一段。您在说的那个相当复杂的解决方案是什么?
Pacerier,2015年

1
看来,使用环境变量不是在命令行更安全。在默认的debian系统上,您可以执行ps并查看每个用户每个进程的命令行参数。但是ps e只显示您自己的进程的环境(除非您当然是root)。它只是稍微更安全,但仍然更安全。
jlh

4

如果您的PHP脚本已经具有打开的数据库连接,那么为什么不只使用mysqli_multi_query()导入.sql文件呢?如果.sql文件的语法有效,则当然...


我不确定这对很大的.sql文件有多好?
本杰明·

1
@Benjamin我想这并不比MySQL客户端差,如果您真的很担心安全性,尽管这是解决问题的最简单的方法,而大小是可以通过多种方法解决的问题。
voretaq7

您知道PDO是否有可能吗?
本杰明·

PDO似乎没有等效的功能可以一次向数据库抛出一堆查询。抱歉。这是一个主意...
Michael Hampton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.