mysql的后门账户通常是攻击者通过漏洞注入或者提权后创建的隐蔽用户,这类账户往往配置宽松的Host字段,允许从非信任地址登录,定期审计mysql.user表是发现这类风险的核心手段。

mysql后门账户的常见特征
正常的业务用户Host字段通常限定为特定IP、内网段或者localhost,而后门账户的Host往往存在以下异常特征:
- Host为
%,允许从任意外部地址登录 - Host为未授权的公网IP或者陌生内网IP段
- 用户名包含特殊字符、无业务含义的随机字符串
- 用户权限过高,比如拥有ALL PRIVILEGES全局权限
手动审计mysql.user表的方法
首先登录mysql数据库,查询mysql.user表的核心字段,重点关注user和Host的组合以及权限配置:
-- 查询所有用户的基本信息和权限
SELECT user, Host, authentication_string,
Select_priv, Insert_priv, Update_priv, Delete_priv,
Create_priv, Drop_priv, Grant_priv
FROM mysql.user;
拿到查询结果后,逐一核对Host字段是否属于业务信任的地址范围,同时检查是否有陌生用户名,以及是否存在不必要的全局高权限。
自动化检测脚本实现
可以编写脚本定期执行检测,将异常结果输出到日志或者发送告警,以下是python实现的检测脚本示例:
import pymysql
import logging
from typing import List, Dict
# 配置日志
logging.basicConfig(
filename='mysql_audit.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 信任的Host白名单,根据实际业务调整
TRUSTED_HOSTS = ['localhost', '127.0.0.1', '192.168.0.%', '10.0.0.%']
# 信任的用户白名单
TRUSTED_USERS = ['root', 'backup_user', 'app_write_user', 'app_read_user']
def audit_mysql_user() -> None:
# 数据库连接配置,根据实际环境调整
db_config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'audit_user',
'password': 'audit_password',
'database': 'mysql',
'charset': 'utf8mb4'
}
try:
conn = pymysql.connect(**db_config)
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 查询所有用户信息
cursor.execute("""
SELECT user, Host, Grant_priv
FROM mysql.user
""")
user_list: List[Dict] = cursor.fetchall()
abnormal_users = []
for user_info in user_list:
user = user_info['user']
host = user_info['Host']
# 检查用户是否在白名单
if user not in TRUSTED_USERS:
abnormal_users.append(f'陌生用户: {user}@{host}')
continue
# 检查Host是否在白名单
host_trusted = False
for trusted_host in TRUSTED_HOSTS:
if trusted_host.endswith('%'):
# 处理网段匹配
prefix = trusted_host[:-1]
if host.startswith(prefix):
host_trusted = True
break
else:
if host == trusted_host:
host_trusted = True
break
if not host_trusted:
abnormal_users.append(f'异常Host用户: {user}@{host}')
if abnormal_users:
logging.warning('检测到mysql异常账户: %s', ','.join(abnormal_users))
else:
logging.info('本次审计未发现mysql异常账户')
except Exception as e:
logging.error('mysql审计执行失败: %s', str(e))
finally:
if 'conn' in locals():
conn.close()
if __name__ == '__main__':
audit_mysql_user()
审计结果的处理建议
当检测到异常账户后,需要按照以下步骤处理:
- 先确认账户是否为业务临时创建,避免误删正常用户
- 对于确认是后门的账户,立即执行删除操作:
DROP USER '异常用户名'@'异常Host'; - 检查对应账户的登录日志,排查是否有非法访问记录
- 修改数据库管理员密码,排查是否存在其他入侵痕迹
定期审计的落地方案
可以将上述检测脚本配置到crontab中,每天凌晨执行一次审计:
# 编辑crontab配置 crontab -e # 添加以下内容,每天凌晨2点执行审计脚本 0 2 * * * /usr/bin/python3 /opt/scripts/mysql_audit.py
同时建议每季度做一次全量的mysql账户权限梳理,确保所有用户和Host配置都符合最小权限原则,从根源上降低后门账户出现的概率。
mysql后门账户检测audit_mysql_user异常Host审计数据库安全修改时间:2026-06-23 20:36:31