mysql生产库禁直接登录,须关闭高权限账号远程访问、绑定内网地址、清理公网授权、显式建号;查询必须经带审计脱敏的代理层;sql执行需审批系统深度耦合并限类型;权限按ttl临时账号发放并自动回收。

MySQL生产库禁止直接登录的硬性措施
不靠人盯,靠机制卡死。所有生产环境 MySQL 实例必须关闭 root 和其他高权限账号的远程登录能力,且禁止在应用服务器或跳板机上保存明文密码或私钥。
-
mysqld配置中严格设置bind_address = 127.0.0.1(或内网 VIP),禁用0.0.0.0 - 删除默认
mysql.user表中所有Host为%或公网 IP 的管理员记录,只保留localhost和运维专用跳板机内网 IP - 用
CREATE USER显式建账号,绝不用GRANT ... IDENTIFIED BY一步创建——避免密码策略失控
非开发人员只能通过代理层访问数据
真要查数据,就别连 MySQL 本体。所有查询请求必须走带审计、限流、脱敏的中间层,比如 ProxySQL 或自研 API 网关,后端数据库账号对前端完全不可见。
- 代理层账号仅授予
SELECT权限,且绑定到具体库+表+字段级白名单(例如只允许查order_info表的order_id和status) - 启用
sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER',防止低权限用户绕过限制建临时表 - 所有查询自动附加
/* user:xxx, dept:finance */注释,写入审计日志,不依赖客户端自觉
审批流不是走流程,是卡住 SQL 执行入口
审批系统不能只留个工单按钮。它必须和数据库执行链路深度耦合:没过审的 SQL,连语法解析都进不去 MySQL。
- 审批平台生成的 token 必须作为连接参数传入,
init_connect触发器校验 token 有效性,失败则KILL CONNECTION - 支持的语句类型严格限制为
SELECT+ 带LIMIT(如LIMIT 1000),禁止子查询嵌套超 2 层、禁止JOIN超 3 张表 - 审批通过后下发的是带 TTL 的临时账号(如
tmp_finance_20240520_abc123),有效期最长 4 小时,过期自动DROP USER
权限回收比授权更关键
人离职、岗位变、项目结,权限往往还在库里飘着。MySQL 没有“自动过期”机制,得靠外部定时任务主动清理。
- 每天凌晨跑脚本查
mysql.user中account_locked = 'Y'但password_last_changed超 90 天的账号,直接DROP USER - 所有业务账号必须关联
COMMENT字段,格式为'owner:zhangsan@company.com;project:crm-v2;expire:2024-12-31',解析后做自动清理 - 禁止使用
GRANT ... ON *.*,哪怕临时排查也不行;宁可花 2 分钟写三条GRANT,也别留一个*
最常被忽略的一点:MySQL 的 REVOKE 不会清除已存在的连接,旧会话仍能执行原权限范围内的操作。真正生效要等连接断开或手动 KILL。











