it-swarm.cn

记录MySQL登录尝试

在我们的MySQL生产服务器中,有时会失败登录尝试(MySQL仪表板会提醒我们)。有没有一种方法可以将每次成功和失败的登录记录到MySQL服务器,而无需启用general_log

我们认为 general_log不是选项,因为它是高负载的生产服务器。

25
CarlosH

只是想告诉一个好奇的人:在您的错误日志中挖掘并保存!

(1)。编辑my.cnf(找到设置文档 此处

[mysqld]

:#输入错误日志文件的名称。否则,将使用默认名称。

log_error =/var/log/mysql/error

:#默认为1。如果值> 1,则新连接尝试中止的连接和拒绝访问的错误将写入错误日志。

log_warnings = 2

...

(2)。在命令运行时

$ Sudo cat /var/log/mysql/error.err | egrep'[aA]拒绝访问'

(3)。你拥有它!

(4)。如果您需要限制用户(在多用户数据库中进行dos攻击或mysql用户密码恢复尝试),则( http://dev.mysql.com/doc/refman/5.5/en/user-resources .html

mysql> GRANT USAGE ON *。 *使用MAX_CONNECTIONS_PER_HOUR 100到'attacker'@'localhost';

每小时只能限制100次密码恢复尝试。

20
centurian

我认为一般日志可能会记录许多其他尝试中的所有登录尝试(成功和失败)。主要问题是常规日志将影响数据库的性能。您可以使用查询打开常规日志

SET GLOBAL general_log = 'on'

适用于较新版本的MySQL。

2
rmc00

嗨,我认为这是不可能的。

从mysql 5.1.29开始-您可以指定存储选项(表或文件)和位置以及所需的日志-错误,常规,二进制或缓慢查询。据我所知-您无法指定日志格式或要记录的内容。我可能是错的-但我认为所有登录尝试都会记录在常规日志中,而不是错误日志中。

但是,假设您的mysql服务器与应用程序服务器在单独的计算机上运行,​​并且您需要打开端口3306(或其他端口)并且不能使用ssh隧道,那么任何人仍然不应该访问mysql服务器,尼利我强烈建议不要将其暴露给Web流量,并且如果您必须(例如,将其放置在防火墙后面的某个地方)将其绑定到应用程序服务器的IP地址或IP块以及您的管理员访问IP(从访问

希望能有所帮助。

1
konung

可以使用mysql-audit-plugin记录connectquit命令。

  1. mysql-audit-plugin release 找到正确的版本,我使用mysql 5.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 configuration ,它仅记录连接和退出的时间。

这是它在文件中用于登录和注销的外观:

{"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"}
1
Tiina

如果所讨论的服务器不应该具有所配置的外部连接,那么我将担心会对您的应用程序服务器进行某种攻击,除非失败的登录来自在配置用户/密码之前推出的新应用程序。

如果服务器以某种方式暴露于3306上的外部连接,除非这是有意的和必要的,否则我将按照Nick所说的那样进行配置,并考虑使用iptables将流量限制为仅来自您的应用服务器的3306。

0
cpbills

http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/ 处,作者展示了一种使用tcpdump捕获数据包并过滤输出的方法。在字符串上。

这可以解决您对general_log和性能的担忧,尽管tcpdump本身可能会造成较小的性能损失。与通用查询日志相比,该解决方案还将记录更少的数据。

我自己没有使用过,但这听起来很有用。

0
Stefan Lasiewski