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或主机。
  • 禁止授予 SUPERFILEPROCESS 等高危权限给业务账号。
  • 权限变更必须先回收旧权限再授予新权限。
  • 生产环境所有权限变更需变更窗口与双人审批。

三、常见故障与排错#

故障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.%';

四、演练与练习#

  1. 按模板创建 app_ro_report 只读账号,限制来源 10.20.1.%,有效期30天。
  2. 使用角色方式授权 SELECT 权限到 db_report.*
  3. 验证账号登录后无法执行 INSERT
  4. 锁定账号并确认无法登录。
  5. 通过审计日志查询对应 CREATE USERGRANT 记录。

可参考练习脚本:

-- 练习:创建只读账号
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.%';

通过以上流程,确保账户创建、授权与回收具备完整审计链条、可回滚能力与明确执行标准。