在数据库使用过程中,第三方工具或者业务专属App连接mysql时,不能直接使用高权限的root账号,否则很容易因为权限过度开放引发数据泄露、误删数据等安全问题。我们需要通过mysql自带的权限管理机制,给特定App创建专属账号并配置最小化的必要权限。

一、创建特定App的专属数据库账号
首先我们需要创建一个仅给特定App使用的mysql账号,创建时可以同时指定该账号允许的连接来源,避免账号被其他未知客户端使用。
创建账号的基础语法如下,其中app_user是账号名,app_password是账号密码,192.168.0.%表示该账号仅允许192.168.0网段的客户端连接,如果要允许所有来源可以换成%:
-- 创建App专属账号,仅允许指定网段连接 CREATE USER 'app_user'@'192.168.0.%' IDENTIFIED BY 'app_password';
如果后续需要修改账号的允许连接来源,可以使用如下语句:
-- 修改账号允许的连接来源为所有网段 ALTER USER 'app_user'@'192.168.0.%' RENAME TO 'app_user'@'%';
二、给App账号配置最小化权限
创建好账号后,需要根据App的实际需求配置权限,遵循最小权限原则,仅开放App必须的权限,不要开放不必要的全局权限。
1. 基础权限配置
如果App只需要操作app_db这个数据库,并且只需要查询、插入、修改、删除数据的权限,可以执行如下授权语句:
-- 给app_user账号授权app_db数据库的所有表的操作权限 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.0.%'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
2. 特殊场景权限配置
如果App需要创建表、修改表结构,可以额外添加CREATE、ALTER权限:
-- 添加建表、改表权限 GRANT CREATE, ALTER ON app_db.* TO 'app_user'@'192.168.0.%'; FLUSH PRIVILEGES;
如果App需要执行存储过程,需要添加EXECUTE权限:
-- 添加执行存储过程权限 GRANT EXECUTE ON app_db.* TO 'app_user'@'192.168.0.%'; FLUSH PRIVILEGES;
三、查看和验证App账号权限
配置完成后,我们可以通过如下语句查看账号的权限配置是否正确:
-- 查看app_user账号的所有权限 SHOW GRANTS FOR 'app_user'@'192.168.0.%';
也可以使用配置好的账号尝试连接数据库,验证权限是否生效:
-- 使用app_user账号连接mysql mysql -h 192.168.0.10 -u app_user -p
四、回收App账号权限和删除账号
如果App不再需要使用该账号,或者需要调整权限,可以使用如下方法操作:
1. 回收部分权限
-- 回收app_user的删除数据权限 REVOKE DELETE ON app_db.* FROM 'app_user'@'192.168.0.%'; FLUSH PRIVILEGES;
2. 删除账号
-- 删除app_user账号 DROP USER 'app_user'@'192.168.0.%';
五、第三方工具连接权限的额外注意事项
如果是第三方工具连接mysql,还需要注意工具的版本兼容问题,部分老旧的第三方工具可能不支持mysql8.0的默认身份认证方式,此时可以在创建账号时指定旧的认证插件:
-- 创建兼容老旧工具的账号,使用mysql_native_password认证 CREATE USER 'tool_user'@'%' IDENTIFIED WITH mysql_native_password BY 'tool_password';
同时建议给第三方工具的账号单独设置密码过期策略,定期更换密码,降低账号泄露后的风险:
-- 设置账号密码90天过期 ALTER USER 'tool_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;