在日常的运维和开发工作中,数据库的安全性是我们绝对不能忽视的一环。随着攻击手段的日益多样化,仅仅设置一个复杂的密码是远远不够的。我们需要定期对数据库的权限进行审计和加固,遵循“最小权限原则”(Principle of Least Privilege),确保每个用户只拥有其完成工作所必需的最小权限。
在 MySQL 8.0 中,权限管理变得更加精细。今天,我将带大家通过几个简单的 SQL 查询,快速锁定两类高风险用户:
GRANT OPTION
权限的用户。rds_superuser_role
为例)。什么是 GRANT OPTION
?
GRANT OPTION
是一个非常危险的权限。如果一个用户拥有此权限,他不仅可以自己执行某个操作,还可以将自己拥有的权限授予给其他用户。想象一下,如果一个普通的业务用户 dev_user
意外获得了 GRANT OPTION
,他就可以“克隆”自己的权限给任意其他用户,这很容易导致权限失控,为数据库埋下巨大的安全隐患。
因此,定期排查哪些用户拥有此权限至关重要。
如何查询?
在 MySQL 中,用户信息和全局权限存储在 mysql.user
这张系统表中。我们可以直接查询这张表来找到答案。
示例查询语句:
-- 查询所有拥有 GRANT OPTION 权限的用户
SELECT
`User`,
`Host`
FROM
mysql.user
WHERE
`Grant_priv` = 'Y';
查询结果解析:
执行上述查询后,我们会得到一个列表,其中包含了所有 Grant_priv
字段为 ‘Y’ 的用户及其主机。这个列表上的每一个用户都值得我们重新审视。
实用建议:
GRANT OPTION
权限通常只应该由数据库管理员(DBA)专属的账号持有。任何业务用户、应用程序账号都不应该拥有此权限。MySQL 8.0 引入了“角色”(Role)的概念,它是权限的集合。我们可以将一组权限打包成一个角色,然后将这个角色赋予用户,极大地简化了权限管理。然而,这也意味着一些高权限角色(如 AWS RDS 中常见的 rds_superuser_role
)需要被我们重点监控。
什么是 rds_superuser_role
?
在很多云数据库服务(如 AWS RDS)中,出于安全和管理的考虑,它们不会直接提供完整的 SUPER
权限,而是提供一个类似 rds_superuser_role
的角色,它打包了一系列高权限操作。拥有这个角色的用户,基本上就是这个数据库实例的“超级管理员”。
如何查询?
用户的角色分配信息存储在 mysql.role_edges
系统表中。这张表记录了哪个用户(TO_USER
)被授予了哪个角色(FROM_USER
)。
示例查询语句:
-- 查询所有被授予了 'rds_superuser_role' 角色的用户
-- 注意:在 MySQL 中,用户和角色都存储在用户表中,因此这里的 FROM_USER 是角色名,TO_USER 是用户名。
SELECT
`TO_USER` AS '用户名',
`TO_HOST` AS '主机'
FROM
mysql.role_edges
WHERE
`FROM_USER` = 'rds_superuser_role';
查询结果解析:
这条查询会返回所有被赋予了 rds_superuser_role
角色的用户名和主机。这个列表同样需要我们高度关注。
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON . TO rds_superuser_role
@%
WITH GRANT OPTION |
| GRANT APPLICATION_PASSWORD_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,XA_RECOVER_ADMIN ON . TO rds_superuser_role
@%
WITH GRANT OPTION
实用建议:
SHOW GRANTS FOR 'rds_superuser_role'@'%';
来查看一个角色的具体权限列表。GRANT OPTION
类似,只有极少数的管理账号才应该拥有这类“超级角色”。确保你的应用程序账号、普通开发人员账号没有被错误地赋予此类角色。readonly_role
用于只读操作,创建一个 backup_role
用于备份操作,然后按需分配。数据库安全不是一劳永逸的,它是一场需要持续投入的“攻防战”。通过今天分享的两条简单的 SQL 查询,可以快速地对 MySQL 8.0 的权限进行一次有效的“体检”。
GRANT OPTION
:通过查询 mysql.user
表,确保授权权限没有被滥用。mysql.role_edges
表,确保类似 rds_superuser_role
这样的超级管理员角色只掌握在少数可信的管理员手中。将这些检查融入我们的日常运维流程中,定期执行,就能极大地降低因权限配置不当而带来的安全风险。希望这篇文章能帮助大家更好地守护你的数据资产!