我们的 MySQL 生产服务器有时会出现登录失败的情况(MySQL 仪表板会提醒我们)。有没有办法在不启用的情况下记录 MySQL 服务器的每次成功和失败登录general_log
?
我们认为general_log
这不是一个选择,因为它是一个高负载的生产服务器。
答案1
只是为了通知好奇的人:挖掘你的错误日志,然后瞧!
编辑my.cnf
(找到设置文档这里)
MySQL 5
[mysqld]
#Enter a name for the error log file. Otherwise a default name will be used.
log_error = /var/log/mysql/error
#defaults to 1. If the value is > 1, aborted connections and access-denied errors for new connection attempts are written to the error log
log_warnings = 2
...
MySQL 8
配置变量的名称已更改;编辑相同的文件,但添加
log_error_verbosity=2
重新启动 MySQL 服务器
重新启动 mysql (例如在使用 的系统上systemd
):
# e.g. on Ubuntu the mysql server service name is "mysql"
sudo systemctl restart mysql
在日志文件中搜索失败的登录尝试
$ sudo cat /var/log/mysql/error.err | egrep '[aA]ccess denied'
你拥有它了!
限制用户
如果需要限制用户(DOS攻击或多用户数据库中的mysql用户密码恢复尝试),那么(http://dev.mysql.com/doc/refman/5.5/en/user-resources.html)
mysql> GRANT USAGE ON * . * TO 'attacker'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 100;
限制每小时仅进行 100 次密码恢复尝试。
答案2
我认为常规日志可能会记录所有登录尝试(成功和失败)以及许多其他内容。主要问题是常规日志会影响数据库的性能。您可以使用查询打开常规日志
SET GLOBAL general_log = 'on'
适用于较新版本的 MySQL。
答案3
可以使用 mysql-audit-plugin 进行日志记录connect
和命令。quit
- 找到正确的版本mysql-audit-plugin 发布,我用的是mysql5.7,所以用了
audit-plugin-percona-5.7-1.1.7-805-linux-x86_64.zip
。 - 将下载的
so
文件重新定位到 指定的位置mysqladmin variables | grep plugin_dir
。 mysql>install plugin audit soname 'libaudit_plugin.so'
- 打开日志功能
mysql>set global audit_json_file=ON
,默认情况下它会记录所有成功的操作。通过设置set global audit_record_cmds='quit,connect'
它只记录连接和退出,我想,根据mysql-audit-plugin 配置。
登录和注销文件中的内容如下:
{"msg-type":"activity","date":"1543740612328","thread-id":"1015112","query-id":"3045222","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11575","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Quit","query":"Quit"}
{"msg-type":"activity","date":"1543740724627","thread-id":"1015113","query-id":"0","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Connect","query":"Connect"}
{"msg-type":"activity","date":"1543740724629","thread-id":"1015113","query-id":"3045223","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"rows":"1","status":"0","cmd":"select","query":"select @@version_comment limit 1"}
答案4
如果所讨论的服务器不应该具有外部连接(如配置的那样),我会担心针对您的应用服务器的某种攻击,除非失败的登录来自在配置用户/密码之前推出的新应用程序。
如果服务器以某种方式暴露给 3306 上的外部连接,除非是故意和需要的,否则我会按照 Nick 所说的设置配置,同时考虑使用 iptables 将流量限制从您的应用服务器到 3306 。