首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
fivestrong
V2EX  ›  MySQL

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

  •  
  •   fivestrong · 52 天前 · 2002 次点击
    这是一个创建于 52 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一台存数据的 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 定时任务也都清除了,看其他进程也没有啥可疑的,找了好久了,请问有没有什么解决方法?

    第 1 条附言  ·  51 天前
    谢谢各位给的思路,好像查到了是谁引起的了。

    先使用 watch -n 1 netstat -ant 动态观察所有连接,然后一个一个停,观察 mysql 日志的报错信息。

    最后停到就剩一些基本的 zabbix_agent 监控有很多进程,关掉之后果然日志不报错了。

    查看了 zabbix 的配置,发现有人配了监控 mysql 状态的指令,这样使得服务端 zabbix 每几分钟都要尝试登录 mysql 。

    把配置还原之后就没问题了。确实跟 navigate 那种原理差不多,有程序被远程调用了。因为和正常的 zabbix_agent 进程混在一起,不好找出来。果然最后还得排除大法。

    最后感谢各位的解答。
    17 条回复    2020-05-19 16:46:35 +08:00
    GTim
        1
    GTim   52 天前
    还有一种 navicat 等工具用 ssh 方式登录主机然后再连接 mysql 的
    msg7086
        2
    msg7086   52 天前 via Android
    有尝试行为的时候用 netstat 看看有没有可疑连接。
    fensou
        3
    fensou   52 天前 via iPhone
    webshell,和 ssh 跳转两种可能
    star7th
        4
    star7th   51 天前
    可以尝试这么一个思路。停止 mysqk,用一个代理软件代理 mysql 的端口。看看访问日志能不做找出线索。
    julyclyde
        5
    julyclyde   51 天前
    @msg7086 这种用 netstat 看不了吧

    @star7th mysql 按你建议的这种代理会导致权限错误的,登录不进来
    star7th
        6
    star7th   51 天前
    @julyclyde 那就这样。mysql 的端口改为 3309,原来的 3306 被代理程序监听并转发到 3307
    star7th
        7
    star7th   51 天前
    写错,是,原来的 3306 被代理程序监听并转发到 3309
    julyclyde
        8
    julyclyde   51 天前
    @star7th
    首先,原 po 提问的问题是遇到了 localhost 过来的错误登录。mysql 里 localhost 和 127.0.0.1 可不是同一个概念
    其次,用代理监听再转发会导致“源 IP”变化,mysql 语境下这种变化会导致登录的其实是另一个用户
    jimrok
        9
    jimrok   51 天前
    了解一下 lsof 命令,可以找到跟 3306 端口连接的进程名字和 pid
    yc8332
        10
    yc8332   51 天前
    netstat 查一下连接 3306 的 ip 地址和进程
    msg7086
        11
    msg7086   51 天前 via Android
    @julyclyde MySQL 只有在连接的时候 localhost 才不是一个概念。服务器端走 TCP 127.0.0.1 连接的时候还是会解析到 localhost 主机用户条目的。

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

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

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

    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
        17
    julyclyde   50 天前
    不过我之前说的“你说的这个场景下当然是 127 了”确实是错了。我再研究一下原因
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4262 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:23 · PVG 16:23 · LAX 01:23 · JFK 04:23
    ♥ Do have faith in what you're doing.