Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.1 一般安全问题  / 6.1.2 保证密码安全  /  6.1.2.1 密码安全的最终用户指南

6.1.2.1 密码安全的最终用户指南

MySQL 用户应使用以下准则来确保密码安全。

当您运行客户端程序连接到 MySQL 服务器时,不建议以将密码暴露给其他用户发现的方式指定您的密码。此处列出了运行客户端程序时可用于指定密码的方法,以及对每种方法的风险评估。简而言之,最安全的方法是让客户端程序提示输入密码或在适当保护的选项文件中指定密码。

  • 使用mysql_config_editor实用程序,它使您能够将身份验证凭据存储在名为 .mylogin.cnf. 稍后 MySQL 客户端程序可以读取该文件以获得连接到 MySQL 服务器的身份验证凭据。请参阅 第 4.6.6 节,“mysql_config_editor — MySQL 配置实用程序”

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

    $> mysql -u francis -pfrank db_name
    警告

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

    如果您的操作环境设置为在终端窗口的标题栏中显示当前命令,那么只要命令正在运行,密码就会一直可见,即使该命令已滚出窗口内容区域的视图。

  • 在未指定密码值的情况下在命令行上 使用--password或 选项。-p在这种情况下,客户端程序以交互方式请求密码:

    $> mysql -u francis -p db_name
    Enter password: ********

    这些*字符表示您输入密码的位置。输入密码时不会显示密码。

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

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

    [client]
    password=password

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

    $> chmod 600 .my.cnf

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

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

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

  • 将您的密码存储在MYSQL_PWD 环境变量中。请参阅 第 4.9 节,“环境变量”

    这种指定 MySQL 密码的方法必须被认为是极不安全的,不应使用。某些版本的ps 包含一个选项来显示正在运行的进程的环境。在某些系统上,如果您设置了 MYSQL_PWD,您的密码将暴露给运行ps的任何其他用户。即使在没有这种版本的ps的系统上,假设用户没有其他方法可以检查进程环境也是不明智的。

在 Unix 上,mysql客户端将执行语句的记录写入历史文件(请参阅 第 4.5.1.3 节,“mysql 客户端日志记录”)。默认情况下,此文件 .mysql_history在您的主目录中命名并创建。密码可以在 SQL 语句中以明文形式写入,例如CREATE USER and ALTER USER,因此如果您使用这些语句,它们将被记录在历史文件中。为保证此文件的安全,请使用限制访问模式,方法与前面描述的.my.cnf文件相同。

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