MySQL的访问权限体系由用户账号、权限级别、权限项三个核心部分组成,所有权限信息都存储在mysql系统库的user、db、tables_priv、columns_priv等系统表中,理清这些表的关联关系,是开展访问权限审计的基础。

MySQL访问权限的核心存储逻辑
MySQL的权限验证分为两个阶段,首先是连接验证,检查用户是否有登录权限,其次是请求验证,检查用户是否有操作对应数据库对象的权限。不同系统表的权限覆盖范围不同:
- user表:存储全局权限,影响用户对所有数据库的所有操作权限
- db表:存储数据库级权限,影响用户对指定数据库的所有操作权限
- tables_priv表:存储表级权限,影响用户对指定数据表的操作权限
- columns_priv表:存储列级权限,影响用户对指定数据表列的操作权限
访问权限审计的核心维度
开展MySQL访问权限审计时,需要重点覆盖以下几个维度,确保没有遗漏风险点:
1. 账号合规性审计
首先需要排查无效账号、高危账号,比如长期未登录的僵尸账号、密码为空或者密码强度不足的账号、允许从任意主机登录的账号。可以通过以下SQL查询所有用户账号信息:
-- 查询所有MySQL用户账号及允许登录的主机 SELECT user, host, authentication_string, password_expired, password_lifetime FROM mysql.user;
2. 权限粒度审计
需要检查是否存在权限过度授予的情况,比如普通业务账号被授予了全局SUPER权限、DROP权限,或者只读账号被授予了INSERT、UPDATE、DELETE等写权限。可以通过以下SQL查询指定用户的权限详情:
-- 查看用户test_user的所有权限 SHOW GRANTS FOR 'test_user'@'localhost';
3. 敏感操作权限审计
重点排查拥有高危操作权限的账号,比如拥有FILE权限可以读写服务器文件,拥有PROCESS权限可以查看其他用户的执行语句,拥有RELOAD权限可以刷新日志和缓存,这些权限如果授予非管理员账号,会带来极大的安全风险。
安全合规性检查的具体步骤
可以按照以下流程完成MySQL的安全合规性检查,形成完整的审计闭环:
- 导出当前所有用户账号和权限配置,生成权限快照
- 对照企业的权限管理规范,逐一核对账号的有效性和权限合理性
- 标记出不符合规范的账号和权限项,形成风险清单
- 根据风险等级制定整改方案,比如删除僵尸账号、回收过度授予的权限、限制账号登录主机范围
- 整改完成后再次审计,确认所有风险项都已修复,定期重复审计流程
自动化审计脚本示例
手动审计效率较低,适合小规模的MySQL实例,对于多实例的场景,可以编写自动化脚本完成批量审计。以下是Python实现的简单审计脚本:
import pymysql
def audit_mysql_privileges(host, port, user, password):
# 连接MySQL实例
conn = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database='mysql'
)
cursor = conn.cursor()
# 查询所有用户
cursor.execute("SELECT user, host FROM mysql.user")
users = cursor.fetchall()
risk_items = []
for db_user, db_host in users:
# 检查是否允许任意主机登录
if db_host == '%':
risk_items.append(f"账号 {db_user} 允许从任意主机登录,存在越权访问风险")
# 查询用户权限
cursor.execute(f"SHOW GRANTS FOR '{db_user}'@'{db_host}'")
grants = cursor.fetchall()
for grant in grants:
grant_str = grant[0]
# 检查是否授予全局SUPER权限
if 'SUPER' in grant_str and 'ON *.*' in grant_str:
risk_items.append(f"账号 {db_user} 被授予全局SUPER权限,不符合最小权限原则")
cursor.close()
conn.close()
return risk_items
if __name__ == '__main__':
# 替换为实际的MySQL连接信息
risks = audit_mysql_privileges('127.0.0.1', 3306, 'admin', 'admin_password')
for risk in risks:
print(risk)
常见合规性要求参考
不同行业的合规要求略有差异,以下是通用的MySQL权限合规要求,可以作为审计的参考标准:
| 合规项 | 要求说明 |
|---|---|
| 账号密码强度 | 密码长度不低于8位,包含大小写字母、数字和特殊字符 |
| 登录主机限制 | 业务账号仅允许从指定的应用服务器IP登录,禁止设置为% |
| 最小权限原则 | 仅授予账号完成业务所需的最小权限,禁止授予无关的全局权限 |
| 账号生命周期 | 离职员工账号需及时删除,临时账号使用后需立即回收 |
做好MySQL访问权限审计与安全合规性检查,不是一次性的工作,需要形成定期审计的机制,结合自动化工具提升审计效率,才能持续保障数据库访问权限的规范性,降低数据安全风险。