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