6.1.2.1 最终用户密码安全准则

MySQL 用户应遵循以下准则来保护密码安全。

当您运行 Client 端程序以连接到 MySQL 服务器时,建议不要以其他人可以发现它的方式指定密码。此处列出了您在运行 Client 端程序时可以用来指定密码的方法,以及每种方法的风险评估。简而言之,最安全的方法是让 Client 端程序提示 Importing 密码,或在经过适当保护的选项文件中指定密码。

  • 使用mysql_config_editorUtil,该 Util 使您可以将身份验证凭据存储在名为.mylogin.cnf的加密登录路径文件中。稍后,MySQLClient 端程序可以读取该文件,以获得用于连接到 MySQL Server 的身份验证凭据。参见第 4.6.6 节“ mysql_config_editor-MySQL 配置 Util”

  • 在命令行上使用--password=password-ppassword选项。例如:

shell> mysql -u francis -pfrank db_name

Warning

这很方便但不安全。在某些系统上,您的密码对系统状态程序(例如 ps )可见,其他用户可能会调用该密码来显示命令行。 MySQLClient 端通常在初始化序列期间用零覆盖命令行密码参数。但是,仍然存在一个短暂的时间间隔,在此间隔内该值是可见的。同样,在某些系统上,这种覆盖策略无效,并且密码对 ps 仍然可见。 (SystemV Unix 系统以及其他系统可能会遇到此问题.)

如果将您的操作环境设置为在终端窗口的标题栏中显示当前命令,则即使该命令在窗口内容区域中滚动到视图之外,只要该命令正在运行,该密码仍然保持可见。

  • 在命令行上使用--password-p选项,但未指定密码值。在这种情况下,Client 端程序以交互方式请求密码:
shell> mysql -u francis -p db_name
Enter password: ********

*字符 table 示您 Importing 密码的位置。Importing 密码时不会显示。

这种方式 Importing 的密码比在命令行上指定密码更安全,因为其他用户看不到该密码。但是,这种 Importing 密码的方法仅适用于以交互方式运行的程序。如果要从非交互运行的脚本中调用 Client 端,则没有机会从键盘 Importing 密码。在某些系统上,您甚至可能发现脚本的第一行被读取并(错误地)解释为您的密码。

  • 将密码存储在选项文件中。例如,在 Unix 上,您可以在主目录中.my.cnf文件的[client]部分中列出密码:

[client]
password=password

为确保密码安全,除了您自己之外,任何人都不能访问该文件。为此,请将文件访问模式设置为400600。例如:

shell> chmod 600 .my.cnf

要从命令行命名包含密码的特定选项文件,请使用--defaults-file=file_name选项,其中file_name是文件的完整路径名。例如:

shell> mysql --defaults-file=/home/francis/mysql-opts

第 4.2.2.2 节“使用选项文件”,详细讨论了选项文件。

指定您的 MySQL 密码的这种方法必须被认为“绝对不安全”,并且不应该使用。某些版本的 ps 包含一个选项,用于显示正在运行的进程的环境。在某些系统上,如果您设置MYSQL_PWD,则密码会向运行 ps 的任何其他用户公开。即使在没有这样的 ps 版本的系统上,假设用户没有其他方法可以检查过程环境也是不明智的。

在 Unix 上,mysqlClient 端将已执行语句的记录写入历史文件(请参见第 4.5.1.3 节“ mysqlClient 端记录”)。默认情况下,此文件名为.mysql_history,并在您的主目录中创建。密码可以在诸如CREATE USERALTER USER之类的 SQL 语句中以纯文本形式编写,因此,如果您使用这些语句,它们将记录在历史记录文件中。为确保此文件的安全,请使用限制性访问模式,与前面针对.my.cnf文件所述的方式相同。

如果将命令解释器配置为保留历史记录,则保存命令的任何文件都将包含在命令行上 Importing 的 MySQL 密码。例如, bash 使用~/.bash_history。任何此类文件都应具有限制性访问模式。