编辑my.cnf(找到设置文档这里)

编辑my.cnf(找到设置文档这里)

我们的 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

  1. 找到正确的版本mysql-audit-plugin 发布,我用的是mysql5.7,所以用了audit-plugin-percona-5.7-1.1.7-805-linux-x86_64.zip
  2. 将下载的so文件重新定位到 指定的位置mysqladmin variables | grep plugin_dir
  3. mysql>install plugin audit soname 'libaudit_plugin.so'
  4. 打开日志功能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 。

相关内容