前置知识: MySQL

账户与权限管理

2 min中级

MySQL账户与权限管理:用户创建、权限授予、角色、密码策略与审计

1. 用户管理

-- 创建用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongP@ss123';
CREATE USER 'readonly'@'10.0.%' IDENTIFIED BY 'password';

-- 修改密码
ALTER USER 'app_user'@'%' IDENTIFIED BY 'NewP@ss456';

-- 删除用户
DROP USER 'app_user'@'%';

-- 查看用户
SELECT user, host FROM mysql.user;

2. 权限管理

-- 授予权限
GRANT SELECT, INSERT ON mydb.* TO 'app_user'@'%';
GRANT ALL PRIVILEGES ON mydb.* TO 'admin'@'localhost';

-- 撤销权限
REVOKE INSERT ON mydb.* FROM 'app_user'@'%';

-- 查看权限
SHOW GRANTS FOR 'app_user'@'%';

3. 角色(MySQL 8.0+)

-- 创建角色
CREATE ROLE 'app_read', 'app_write', 'app_admin';

-- 授予角色权限
GRANT SELECT ON mydb.* TO 'app_read';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_admin';

-- 将角色分配给用户
GRANT 'app_read' TO 'reporting_user'@'%';
GRANT 'app_write' TO 'application_user'@'%';

-- 激活角色
SET DEFAULT ROLE ALL TO 'reporting_user'@'%';

4. 密码策略

-- MySQL 8.0 密码验证插件
INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

-- 密码过期
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER;

5. 连接安全

-- 限制最大连接数
ALTER USER 'app_user'@'%' WITH MAX_CONNECTIONS_PER_HOUR 100;

-- 限制查询数
ALTER USER 'app_user'@'%' WITH MAX_QUERIES_PER_HOUR 1000;

-- 锁定账户
ALTER USER 'app_user'@'%' ACCOUNT LOCK;
ALTER USER 'app_user'@'%' ACCOUNT UNLOCK;

用户管理

单行写法:创建用户允许任意主机连接 CREATE USER '<用户名>'@'%' IDENTIFIED BY '<密码>'

-- 创建允许任意主机连接的用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongP@ss123';

单行写法:创建用户限制来源 IP 段 CREATE USER '<用户名>'@'<IP 段>' IDENTIFIED BY '<密码>'

-- 创建限制来源 IP 段的用户
CREATE USER 'readonly'@'10.0.%' IDENTIFIED BY 'password';

单行写法:修改用户密码 ALTER USER '<用户名>'@'<主机>' IDENTIFIED BY '<新密码>'

-- 修改用户密码
ALTER USER 'app_user'@'%' IDENTIFIED BY 'NewP@ss456';

单行写法:删除用户 DROP USER '<用户名>'@'<主机>'

-- 删除指定用户
DROP USER 'app_user'@'%';

单行写法:查看所有用户 SELECT user, host FROM mysql.user

-- 查看所有用户列表
SELECT user, host FROM mysql.user;

权限管理

单行写法:授予查询和插入权限 GRANT <权限列表> ON <库>.<表> TO '<用户名>'@'<主机>'

-- 授予查询和插入权限
GRANT SELECT, INSERT ON mydb.* TO 'app_user'@'%';

单行写法:授予所有权限 GRANT ALL PRIVILEGES ON <库>.<表> TO '<用户名>'@'<主机>'

-- 授予所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'admin'@'localhost';

单行写法:撤销权限 REVOKE <权限列表> ON <库>.<表> FROM '<用户名>'@'<主机>'

-- 撤销插入权限
REVOKE INSERT ON mydb.* FROM 'app_user'@'%';

单行写法:查看用户权限 SHOW GRANTS FOR '<用户名>'@'<主机>'

-- 查看用户权限
SHOW GRANTS FOR 'app_user'@'%';

单行写法:刷新权限 FLUSH PRIVILEGES

-- 刷新权限表
FLUSH PRIVILEGES;

角色管理

单行写法:创建多个角色 CREATE ROLE '<角色名>'[, '<角色名>'...]

-- 创建多个角色
CREATE ROLE 'app_read', 'app_write', 'app_admin';

单行写法:授予只读角色权限 GRANT SELECT ON <库>.<表> TO '<角色名>'

-- 授予只读角色权限
GRANT SELECT ON mydb.* TO 'app_read';

单行写法:授予读写角色权限 GRANT SELECT, INSERT, UPDATE, DELETE ON <库>.<表> TO '<角色名>'

-- 授予读写角色权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';

单行写法:授予管理员角色权限 GRANT ALL PRIVILEGES ON <库>.<表> TO '<角色名>'

-- 授予管理员角色权限
GRANT ALL PRIVILEGES ON mydb.* TO 'app_admin';

单行写法:将角色分配给用户 GRANT '<角色名>' TO '<用户名>'@'<主机>'

-- 分配角色给用户
GRANT 'app_read' TO 'reporting_user'@'%';

单行写法:设置用户默认角色 SET DEFAULT ROLE ALL TO '<用户名>'@'<主机>'

-- 设置用户默认角色
SET DEFAULT ROLE ALL TO 'reporting_user'@'%';

单行写法:撤销用户角色 REVOKE '<角色名>' FROM '<用户名>'@'<主机>'

-- 撤销用户角色
REVOKE 'app_read' FROM 'reporting_user'@'%';

单行写法:删除角色 DROP ROLE '<角色名>'[, '<角色名>'...]

-- 删除多个角色
DROP ROLE 'app_read', 'app_write', 'app_admin';

密码策略

单行写法:安装密码验证组件 INSTALL COMPONENT 'file://component_validate_password'

-- 安装密码验证组件
INSTALL COMPONENT 'file://component_validate_password';

单行写法:设置密码策略级别 SET GLOBAL validate_password.policy = <级别>

-- 设置密码策略级别为 MEDIUM
SET GLOBAL validate_password.policy = MEDIUM;

单行写法:设置密码最小长度 SET GLOBAL validate_password.length = <长度>

-- 设置密码最小长度为 12
SET GLOBAL validate_password.length = 12;

单行写法:设置大小写字母数量 SET GLOBAL validate_password.mixed_case_count = <数量>

-- 设置密码大小写字母数量为 1
SET GLOBAL validate_password.mixed_case_count = 1;

单行写法:设置数字数量 SET GLOBAL validate_password.number_count = <数量>

-- 设置密码数字数量为 1
SET GLOBAL validate_password.number_count = 1;

单行写法:设置特殊字符数量 SET GLOBAL validate_password.special_char_count = <数量>

-- 设置密码特殊字符数量为 1
SET GLOBAL validate_password.special_char_count = 1;

单行写法:密码定期过期 ALTER USER '<用户名>'@'<主机>' PASSWORD EXPIRE INTERVAL <天数> DAY

-- 设置密码 90 天过期
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;

单行写法:密码永不过期 ALTER USER '<用户名>'@'<主机>' PASSWORD EXPIRE NEVER

-- 设置密码永不过期
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER;

连接限制

单行写法:限制每小时最大连接数 ALTER USER '<用户名>'@'<主机>' WITH MAX_CONNECTIONS_PER_HOUR <数量>

-- 限制每小时最大连接数为 100
ALTER USER 'app_user'@'%' WITH MAX_CONNECTIONS_PER_HOUR 100;

单行写法:限制每小时最大查询数 ALTER USER '<用户名>'@'<主机>' WITH MAX_QUERIES_PER_HOUR <数量>

-- 限制每小时最大查询数为 1000
ALTER USER 'app_user'@'%' WITH MAX_QUERIES_PER_HOUR 1000;

单行写法:锁定账户 ALTER USER '<用户名>'@'<主机>' ACCOUNT LOCK

-- 锁定账户
ALTER USER 'app_user'@'%' ACCOUNT LOCK;

单行写法:解锁账户 ALTER USER '<用户名>'@'<主机>' ACCOUNT UNLOCK

-- 解锁账户
ALTER USER 'app_user'@'%' ACCOUNT UNLOCK;