6.3.2 账户创建、授权与回收流程
账户创建、授权与回收流程必须可审计、可追溯、可回滚,贯穿申请、审批、执行、验证、复核全链路。账号类型(应用、运维、只读、备份)需明确用途与生命周期,统一命名规范与登录范围(主从、读写分离、业务库范围)。多环境必须隔离,禁止跨环境复用账号与密码。
以下为流程原理草图:
一、执行流程与示例(含可回滚记录)#
1)申请单模板字段(示例)
- 账号名:app_rw_order
- 用途:订单服务读写
- 最小权限:db_order.*(SELECT,INSERT,UPDATE,DELETE)
- 访问源:10.10.10.0/24
- 有效期:90天
- 负责人:张三
2)执行前准备:开启审计记录
- MySQL社区版可使用 general_log 作为临时审计;生产建议使用审计插件(如官方或第三方审计)。
启用临时审计(谨慎使用,性能影响):
-- 会话级演示(生产建议按变更窗口开启)
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE';
3)创建账号与授权(完整可执行示例)
-- 1. 创建账号(应用账号)
CREATE USER 'app_rw_order'@'10.10.10.%'
IDENTIFIED BY 'S3cure#Passw0rd!'
PASSWORD EXPIRE INTERVAL 90 DAY
ACCOUNT UNLOCK;
-- 2. 创建角色并授权(MySQL 8.0)
CREATE ROLE 'role_order_rw';
GRANT SELECT, INSERT, UPDATE, DELETE ON db_order.* TO 'role_order_rw';
-- 3. 将角色绑定给用户并设为默认
GRANT 'role_order_rw' TO 'app_rw_order'@'10.10.10.%';
SET DEFAULT ROLE 'role_order_rw' TO 'app_rw_order'@'10.10.10.%';
-- 4. 记录授权信息(可用于回滚)
SHOW GRANTS FOR 'app_rw_order'@'10.10.10.%';
命令解释
- CREATE USER:创建账户并限制来源IP;PASSWORD EXPIRE INTERVAL设置口令周期。
- CREATE ROLE:将权限模板化,减少误授权。
- SET DEFAULT ROLE:登录后自动生效角色权限。
4)回收与回滚(含紧急冻结)
-- 1. 紧急冻结账号(不立即删除,保留审计)
ALTER USER 'app_rw_order'@'10.10.10.%' ACCOUNT LOCK;
-- 2. 回收权限(避免权限叠加)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_rw_order'@'10.10.10.%';
-- 3. 删除账号(应用下线时)
DROP USER 'app_rw_order'@'10.10.10.%';
-- 4. 回滚示例:恢复账号与权限
CREATE USER 'app_rw_order'@'10.10.10.%' IDENTIFIED BY 'New#Passw0rd!';
GRANT 'role_order_rw' TO 'app_rw_order'@'10.10.10.%';
SET DEFAULT ROLE 'role_order_rw' TO 'app_rw_order'@'10.10.10.%';
5)验证与审计核对
-- 权限核对
SHOW GRANTS FOR 'app_rw_order'@'10.10.10.%';
-- 登录验证(在业务机)
-- mysql -h 10.10.10.5 -u app_rw_order -p -D db_order
-- 审计核对(general_log 表)
SELECT event_time, user_host, argument
FROM mysql.general_log
WHERE argument LIKE 'GRANT%' OR argument LIKE 'CREATE USER%'
ORDER BY event_time DESC
LIMIT 20;
二、关键规范要点#
- 禁止
@'%'泛化授权,必须限制访问源IP或主机。 - 禁止授予
SUPER、FILE、PROCESS等高危权限给业务账号。 - 权限变更必须先回收旧权限再授予新权限。
- 生产环境所有权限变更需变更窗口与双人审批。
三、常见故障与排错#
故障1:Access denied for user
- 原因:来源IP不匹配或密码错误。
- 排查与修复:
-- 查看用户定义与来源
SELECT user, host FROM mysql.user WHERE user='app_rw_order';
-- 如果来源不匹配,补充授权
CREATE USER 'app_rw_order'@'10.10.20.%' IDENTIFIED BY 'S3cure#Passw0rd!';
GRANT 'role_order_rw' TO 'app_rw_order'@'10.10.20.%';
SET DEFAULT ROLE 'role_order_rw' TO 'app_rw_order'@'10.10.20.%';
故障2:权限不足(SELECT 被拒绝)
- 原因:角色未设为默认或未生效。
- 排查与修复:
SHOW GRANTS FOR 'app_rw_order'@'10.10.10.%';
SET DEFAULT ROLE 'role_order_rw' TO 'app_rw_order'@'10.10.10.%';
故障3:无法删除用户
- 原因:用户不存在或 host 不一致。
- 排查与修复:
SELECT user, host FROM mysql.user WHERE user='app_rw_order';
DROP USER 'app_rw_order'@'10.10.10.%';
四、演练与练习#
- 按模板创建
app_ro_report只读账号,限制来源10.20.1.%,有效期30天。 - 使用角色方式授权
SELECT权限到db_report.*。 - 验证账号登录后无法执行
INSERT。 - 锁定账号并确认无法登录。
- 通过审计日志查询对应
CREATE USER与GRANT记录。
可参考练习脚本:
-- 练习:创建只读账号
CREATE USER 'app_ro_report'@'10.20.1.%' IDENTIFIED BY 'R3adOnly#2024';
CREATE ROLE 'role_report_ro';
GRANT SELECT ON db_report.* TO 'role_report_ro';
GRANT 'role_report_ro' TO 'app_ro_report'@'10.20.1.%';
SET DEFAULT ROLE 'role_report_ro' TO 'app_ro_report'@'10.20.1.%';
-- 验证权限
SHOW GRANTS FOR 'app_ro_report'@'10.20.1.%';
通过以上流程,确保账户创建、授权与回收具备完整审计链条、可回滚能力与明确执行标准。