各位大佬,请教一个 mysql 的问题

2020-05-18 13:29:46 +08:00
 fivestrong

一台存数据的 mysql 服务器,版本是 5.7.30 ,然后看日志每分钟有十多条连续的登录失败记录,

类似这样: 2020-05-18T13:22:49.608114+08:00 2278 [Note] Access denied for user 'xxxx'@'localhost' (using password: NO)

问题是 mysql 中没有这个 xxx 账户,而且它是从本机 localhost 尝试登录,没有使用密码。

请问各位大佬有什么思路能够定位这个登录请求是哪个程序发起的。

我已经把没用的服务都停止了,crontab 定时任务也都清除了,看其他进程也没有啥可疑的,找了好久了,请问有没有什么解决方法?

3101 次点击
所在节点    MySQL
17 条回复
GTim
2020-05-18 13:54:19 +08:00
还有一种 navicat 等工具用 ssh 方式登录主机然后再连接 mysql 的
msg7086
2020-05-18 15:19:17 +08:00
有尝试行为的时候用 netstat 看看有没有可疑连接。
fensou
2020-05-18 16:18:38 +08:00
webshell,和 ssh 跳转两种可能
star7th
2020-05-18 16:24:04 +08:00
可以尝试这么一个思路。停止 mysqk,用一个代理软件代理 mysql 的端口。看看访问日志能不做找出线索。
julyclyde
2020-05-18 16:39:10 +08:00
@msg7086 这种用 netstat 看不了吧

@star7th mysql 按你建议的这种代理会导致权限错误的,登录不进来
star7th
2020-05-18 16:41:57 +08:00
@julyclyde 那就这样。mysql 的端口改为 3309,原来的 3306 被代理程序监听并转发到 3307
star7th
2020-05-18 16:42:25 +08:00
写错,是,原来的 3306 被代理程序监听并转发到 3309
julyclyde
2020-05-18 16:50:15 +08:00
@star7th
首先,原 po 提问的问题是遇到了 localhost 过来的错误登录。mysql 里 localhost 和 127.0.0.1 可不是同一个概念
其次,用代理监听再转发会导致“源 IP”变化,mysql 语境下这种变化会导致登录的其实是另一个用户
jimrok
2020-05-18 16:55:56 +08:00
了解一下 lsof 命令,可以找到跟 3306 端口连接的进程名字和 pid
yc8332
2020-05-18 17:09:00 +08:00
netstat 查一下连接 3306 的 ip 地址和进程
msg7086
2020-05-18 22:23:43 +08:00
@julyclyde MySQL 只有在连接的时候 localhost 才不是一个概念。服务器端走 TCP 127.0.0.1 连接的时候还是会解析到 localhost 主机用户条目的。

另外我说用 netstat 主要是要看有没有人远程连上本地服务以后跳板尝试密码,不是为了看程序间的连接。
julyclyde
2020-05-19 10:45:14 +08:00
@msg7086 你把 unix domain socket 关闭试试,看 localhost 的用户名还能不能连上
msg7086
2020-05-19 14:10:31 +08:00
@julyclyde 当然连不上了。
我说的是「只有在连接的时候,localhost 才不是一个概念」。
然后你跟我说能不能连上。
我寻思着这不是重复一遍我的观点嘛。

localhost 的特殊处理是来自 libmysqlclient,又不是来自 MySQL Server 。
你客户端连不连得上,管服务器上的账号验证何事。

你自己开个测试机,自己运行一下 mysql -h 127.0.0.1,看看 Access denied 后面写的到底是 root@127.0.0.1 还是 root@localhost 。
julyclyde
2020-05-19 14:29:23 +08:00
@msg7086 access denied 是服务器返回的信息,你说的这个场景下当然是 127 了
msg7086
2020-05-19 14:35:14 +08:00
@julyclyde
# mysql -h 127.0.0.1
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
julyclyde
2020-05-19 16:46:07 +08:00
我的实验场景虽然得到和你一样的结果,但是有证据说明身份是由服务器端认定的,而不是客户端自称的:

mysqld 开启 skip_ssl 参数,避免加密
strace mysql -h 127.0.0.1 在前面加 strace 观察通信,可以看到下列内容:
connect 建立连接
recfrom 收到服务器的 banner 信息
sendto 只发送了用户名,并没有带有 @127.0.0.1 或者 @localhost 的后缀
然后 recvfrom 收到服务器返回的错误信息 Access denied for user 'root'@'localhost'
julyclyde
2020-05-19 16:46:35 +08:00
不过我之前说的“你说的这个场景下当然是 127 了”确实是错了。我再研究一下原因

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/672854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX