用角色构建最小权限模型(CREATE ROLE、DEFAULT ROLE)
MySQL安全命令
CREATE ROLE IF NOT EXISTS 'app_read', 'app_write';
GRANT SELECT ON shop.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON shop.* TO 'app_write';
-- Application account: network range, TLS required, roles active by default
CREATE USER 'svc_app'@'10.0.%' IDENTIFIED BY 'S3cure#App2024' DEFAULT ROLE 'app_read', 'app_write' REQUIRE SSL;
CREATE USER 'ana'@'%' IDENTIFIED BY 'An4#Report2024';
GRANT 'app_read' TO 'ana'@'%';
SET DEFAULT ROLE ALL TO 'ana'@'%';
-- Show grants with roles expanded
SHOW GRANTS FOR 'svc_app'@'10.0.%' USING 'app_read', 'app_write';
SELECT FROM_USER, FROM_HOST, TO_USER, TO_HOST FROM mysql.role_edges;作用
把权限授予角色而不是单个用户;账户通过角色成员关系获得权限。变更集中在一处,审计和离职回收更容易。
适用场景
创建新的应用/团队账户,以及清理权限混乱的遗留服务器时。
注意
不是默认角色的角色在会话中不会激活(CURRENT_ROLE() 为 NONE),用户看起来缺少权限;请使用 SET DEFAULT ROLE ALL 或 activate_all_roles_on_login=ON。角色也是一个账户(已锁定、无密码),会出现在 mysql.user 中。应用账户使用网段而非 '%'。切勿向应用账户授予 ALL、SUPER、FILE、PROCESS 或 CONNECTION_ADMIN。从角色撤销权限也会影响活动会话。