密码可以在 SQL 语句中写成明文,例如
CREATE USER
,
GRANT
和
SET PASSWORD
。如果这样的语句被 MySQL 服务器记录下来,那么任何有权访问日志的人都可以看到其中的密码。
语句日志记录避免将密码写为以下语句的明文:
CREATE USER ... IDENTIFIED BY ...
ALTER USER ... IDENTIFIED BY ...
SET PASSWORD ...
START SLAVE ... PASSWORD = ...
START REPLICA ... PASSWORD = ...
CREATE SERVER ... OPTIONS(... PASSWORD ...)
ALTER SERVER ... OPTIONS(... PASSWORD ...)
这些语句中的密码被重写为不会出现在写入一般查询日志、慢速查询日志和二进制日志的语句文本中。重写不适用于其他语句。特别是,
引用文字密码的系统表的INSERT
or
UPDATE
语句按
mysql.user
原样记录,因此您应该避免此类语句。(无论如何,不鼓励直接修改授权表。)
对于一般的查询日志,可以通过
--log-raw
选项启动服务器来抑制密码重写。出于安全原因,不建议将此选项用于生产。出于诊断目的,查看服务器接收到的语句的确切文本可能很有用。
默认情况下,审计日志插件生成的审计日志文件的内容未加密,可能包含敏感信息,例如 SQL 语句的文本。出于安全原因,审计日志文件应该被写入一个目录,只有 MySQL 服务器和有正当理由查看日志的用户才能访问。请参阅 第 6.4.5.3 节,“MySQL 企业审计安全注意事项”。
如果安装了查询重写插件,服务器接收到的语句可能会被重写(请参阅
查询重写插件)。在这种情况下,该
--log-raw
选项会影响语句日志记录,如下所示:
密码重写的一个含义是无法解析的语句(例如,由于语法错误)不会写入一般查询日志,因为无法知道它们是无密码的。需要记录所有语句(包括有错误的语句)的用例应使用该
--log-raw
选项,请记住,这也会绕过密码重写。
仅当需要纯文本密码时才会重写密码。对于具有期望密码散列值的语法的语句,不会发生重写。如果为此类语法错误地提供了纯文本密码,则会按给定的方式记录密码,而不会重写。
为防止日志文件被无端暴露,请将它们放置在限制服务器和数据库管理员访问的目录中。如果服务器登录到
mysql
数据库中的表,则只向数据库管理员授予对这些表的访问权限。
副本将复制源服务器的密码存储在它们的连接元数据存储库中,默认情况下它是mysql
数据库中名为
slave_master_info
. 现在已弃用连接元数据存储库的数据目录中的文件,但仍然可以使用(请参阅
第 17.2.4 节,“中继日志和复制元数据存储库”)。确保连接元数据存储库只能由数据库管理员访问。将密码存储在连接元数据存储库中的另一种方法是使用
START
REPLICA
(或在 MySQL 8.0.22 之前
START
SLAVE
)或START
GROUP_REPLICATION
语句指定用于连接到源的凭据。
使用受限访问模式来保护包含日志表或包含密码的日志文件的数据库备份。