服务器MySQL数据库登录尝试日志问题:仅能捕获用户名无法获取密码
嘿,我来帮你搞定这个事儿!你只抓到用户名却拿不到密码,核心原因是MySQL登录时的密码根本不是明文传输的——客户端会对密码做多层哈希处理后再发往服务器,所以直接抓原始数据包只能看到加密后的哈希值,没法直接还原出明文密码。下面给你几个按实用性排序的解决方案:
1. 启用MySQL通用查询日志(最省心的方案)
这个是最直接的办法,通用查询日志会完整记录所有客户端的连接请求,包括登录时的用户名、客户端IP,还有登录成功/失败的状态——虽然还是看不到明文密码,但完全能满足你“记录所有登录尝试”的需求。
- 临时启用(MySQL重启后失效,适合快速测试):
SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/var/log/mysql/general.log'; - 永久启用(修改配置文件,重启后生效):
找到你的MySQL配置文件(比如Debian/Ubuntu是/etc/mysql/mysql.conf.d/mysqld.cnf,RHEL/CentOS是/etc/my.cnf),在[mysqld]区块里添加:
然后重启MySQL服务:general_log = 1 general_log_file = /var/log/mysql/general.log
之后打开日志文件就能看到类似这样的记录:sudo systemctl restart mysql2024-05-20T12:34:56.789123Z 12 Connect bad_user@192.168.1.100 on using TCP/IP
2024-05-20T12:34:57.123456Z 12 Access denied for user 'bad_user'@'192.168.1.100' (using password: YES)
2. 用审计插件做专业监控
如果需要更细致的审计(比如记录登录时间、客户端端口、认证类型等细节),可以用开源的Percona Audit Log Plugin,或者MySQL企业版自带的Enterprise Audit插件。这里说下免费的Percona方案:
- 把对应版本的
audit_log.so插件文件放到MySQL的插件目录(可以用SELECT @@plugin_dir;查看路径) - 执行SQL启用插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so'; SET GLOBAL audit_log_enabled = ON; - 默认日志存在
/var/log/mysql/audit.log,里面会有结构化的登录记录,方便后续分析。
3. 破解认证数据包(技术门槛高,不推荐)
如果你非要拿到明文密码,那得利用MySQL的认证协议细节:客户端发送的哈希值是SHA1(密码) XOR SHA1(服务器随机盐 + SHA1(SHA1(密码))),要还原密码得先抓包拿到服务器发的随机盐和客户端的哈希值,然后用字典暴力破解。
步骤大概是:
- 用
tcpdump抓MySQL端口的数据包:tcpdump -i any port 3306 -w mysql_login.pcap - 用Wireshark打开pcap文件,找到
MySQL Authentication Packet,提取里面的盐值和哈希字段 - 用
hashcat这类工具加载密码字典去匹配哈希值
这种方法效率极低,而且只有当密码在你的字典里时才能成功,还不符合安全规范,除非你有特殊需求,否则不建议这么做。
4. 系统日志补充监控
如果有人是先SSH登录服务器再操作MySQL,那系统的/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS)会记录SSH登录尝试,但这和远程MySQL登录是两码事,只能作为补充监控手段。
总结一下:如果只是要记录所有MySQL登录尝试,启用通用查询日志就足够了;要是需要更细致的审计,就用审计插件;至于明文密码,除非必要,别费那个劲儿去破解——毕竟MySQL的加密传输就是为了安全。
内容的提问来源于stack exchange,提问作者Ninjailbreak

