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