记录MySQL登录尝试


25

在我们的MySQL生产服务器中,有时会失败登录尝试(MySQL仪表板会提醒我们)。有没有办法在不启用的情况下将每一次成功和失败的登录记录到MySQL服务器general_log

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



据mysql官方介绍:As of MySQL 5.5.28, MySQL Enterprise Edition includes MySQL Enterprise Audit, implemented using a server plugin named audit_log. 只有进取的版本才有。
蒂娜

Answers:


20

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

(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次密码恢复尝试。


2

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

SET GLOBAL general_log = 'on'

适用于较新版本的MySQL。


这是临时的还是永久的?如果是临时的,这意味着我需要修改/etc/mysql/my.cnfmysql吗?
DarckBlezzer

这是暂时的。这种方法可以起作用,或者您可以--general-log在启动MySQL时将其添加到标志中。
rmc00

1

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

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

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

希望能有所帮助。


1

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

  1. mysql-audit-plugin发行版中找到正确的版本,我使用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的配置,通过设置它,它只会记录我想连接和退出的日志。

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

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

0

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

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


MySQL自动拒绝来自mysql.user中没有至少一个匹配行的IP地址的连接
David M 2010年

0

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

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

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


听起来不错,但该链接对我不起作用。
卡洛斯·H

该链接今天早上使用Firefox对我有用。 mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging
Stefan Lasiewski 2010年

我很想听听您对此的经验。
Stefan Lasiewski 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.